Redis快取資料庫搭建與使用(window64安裝版下載安裝配置)
App介面校驗需要驗證token,為了減輕資料庫壓力,將(userid,token)儲存在快取裡,方便讀取。
1. 下載安裝
下面是下載連結,包含Redis window64位安裝版以及相關jar包
Redis下載連結
解壓後雙擊 Redis-x64-3.2.100.msi 進入安裝面板
可自行修改安裝目錄,所有勾選的地方都打上對號。
埠號預設 6379
如果安裝後出現如下問題,說明.NET Framework 版本太低
開啟命令視窗 輸入dir %WINDIR%\Microsoft.NET\Framework\v* /O:-N /B
檢視.NET Framework版本資訊
解決方法,安裝高版本的.NET Framework,安裝程式在下載的壓縮包裡
NDP46-KB3045557-x86-x64-AllOS-ENU.exe
安裝完成後重新安裝Redis即可安裝完成。
2. 執行Redis
Redis安裝目錄D:\Redis\redisbin64
開啟cmd進入redis的目錄下
D:
cd Redis/redisbin64
redis-server.exe redis.windows.conf(開啟redis的命令)
若出現(連線錯誤) 如上圖
creating server tcp listening socket 127.0.0.1:6379: bind No error
解決方案如下按順序輸入如下命令就可以連線成功
1. Redis-cli.exe
2. shutdown
3. exit
4. redis-server.exe redis.windows.conf
Redis開啟成功的介面
3. 測試Redis
不要關閉當前命令視窗
重新打開個命令視窗 進入到redis下
D:
cd Redis/redisbin64
redis-server.exe redis.windows.conf
redis-cli.exe -h 127.0.0.1 -p 6379
測試
set name songhui
get name
del name
到此Redis已經可以使用了
下面是java程式碼redis工具類,需要的jar都在下載的壓縮包裡面。
package com.sh.tools;
import net.sf.json.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Redis儲存工具
* ClassName: RedisTool
* @Description: TODO
* @author micoMo
* @date 2017-4-28
*/
public class RedisTool {
private static int maxActive = 100;
private static int maxIdle = 20;
private static int maxWait = 3000;
private static String ip = "127.0.0.1";
private static int port = 6379;
private static JedisPool jedisPool;
private static Jedis jedis;
static {
JedisPoolConfig config = new JedisPoolConfig();
//設定最大連線數
config.setMaxActive(maxActive);
//設定最大空閒數
config.setMaxIdle(maxIdle);
//設定超時時間
config.setMaxWait(maxWait);
//初始化連線池
jedisPool = new JedisPool(config, ip, port);
jedis = jedisPool.getResource();
// jedis.auth("password");
}
/**
* 向快取中設定字串內容
* @param key key
* @param value value
* @return
* @throws Exception
*/
public static boolean set(String key,String value) throws Exception{
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
jedisPool.returnResource(jedis);
}
}
/**
* 向快取中設定字串內容
* @param key key
* @param value value
* @return
* @throws Exception
*/
public static String get(String key){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String value = jedis.get(key);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
jedisPool.returnResource(jedis);
}
}
/**
* 向快取中設定物件
* @param key
* @param value
* @return
*/
public static boolean setObject(String key,Object value){
Jedis jedis = null;
try {
JSONObject objectJson = JSONObject.fromObject(value);
jedis = jedisPool.getResource();
jedis.set(key, objectJson.toString());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
jedisPool.returnResource(jedis);
}
}
/**
* 刪除快取中得物件,根據key
* @param key
* @return
*/
public static boolean del(String key){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.del(key);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
jedisPool.returnResource(jedis);
}
}
/**
* 根據key 獲取內容
* @param key
* @return
*/
public static Object getObject(String key){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
Object value = jedis.get(key);
return value;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
jedisPool.returnResource(jedis);
}
}
/**
* 根據key 獲取物件
* @param key
* @return
*/
public static <T> T get(String key,Class<T> clazz){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String value = jedis.get(key);
JSONObject jsonobject = JSONObject.fromObject(value);
return (T) JSONObject.toBean(jsonobject, clazz);
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
jedisPool.returnResource(jedis);
}
}
public static void saveToken(String account,String token) {
jedis.set(account, token);
System.out.println(jedis.get(account));
}
}
在使用者登入時,初始化token,並儲存到Redis。
public String login() throws Exception{
String account = request.getParameter("account");
String password = request.getParameter("password");
String deviceid = request.getParameter("deviceid");
String channelId = request.getParameter("channelId");
String os = request.getParameter("os");
String[] param = {account,password,deviceid,channelId,os};
String[] name = {"account","password","deviceid","channelId","os"};
if(!"".equals(StringTool.isEmpty(param, name))){
errorMessage += StringTool.isEmpty(param, name);
resultCode = "0";
}
if ("" == errorMessage) {
User u = userService.login(account, password);
if(u == null){
errorMessage += "賬號未生效或使用者名稱密碼錯誤!";
resultCode = "0";
} else {
u.setDeviceid(deviceid);
u.setChannelId(channelId);
u.setOs(os);
userService.updateUser(u);
//生成token
String token = NumberTool.getRandomString(16);
//儲存token到Redis
RedisTool.set(String.valueOf(u.getId()), token);
System.out.println(RedisTool.get(String.valueOf(u.getId())));
json.put("user", JSONObject.fromObject(u));
json.put("token", token);
}
}
json.put("errorMessage", errorMessage);
json.put("resultCode", resultCode);
ResponseTool.write(ServletActionContext.getResponse(), json);
return null;
}
驗證token的過濾器
package com.sh.tools;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;
/**
* 介面token驗證過濾器
* ClassName: SecurityFilter
* @Description: TODO
* @author micoMo
* @date 2017-5-3
*/
public class SecurityFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletrequest;
JSONObject json = new JSONObject();
String myuserid = servletrequest.getParameter("myuserid");
String sign = servletrequest.getParameter("sign");
// 陣列轉換成list
List<String> list = Arrays.asList(Constants.FILTERKEY);
String path = httpRequest.getServletPath();
if (list.contains(path)) {
if(StringTool.isEmpty(myuserid)||StringTool.isEmpty(sign)){
json.put("errorMessage", "sign或myuserid為空");
json.put("resultCode", "0");
} else {
//從Redis獲取token
String token = RedisTool.get(myuserid);
sign = MD5Util.MD5Encode(sign, "UTF-8");
System.out.println("加密後的token:"+sign);
if(!sign.equals(MD5Util.MD5Encode(token, "UTF-8"))){
json.put("errorMessage", "token驗證失敗");
json.put("resultCode", "0");
} else {
filterchain.doFilter(servletrequest, servletresponse);
}
}
servletresponse.setCharacterEncoding("GBK");
PrintWriter out = servletresponse.getWriter();
out.append(json.toString());
out.close();
} else {
filterchain.doFilter(servletrequest, servletresponse);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
以上只是實現簡單的儲存資料。