1. 程式人生 > >Redis快取資料庫搭建與使用(window64安裝版下載安裝配置)

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
    }

}

以上只是實現簡單的儲存資料。