Web分布式系统集成Redis

1.首先创建Jedis连接池,与redis进行连接,并对归还的损坏连接和正常连接进行回收。

JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);

        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);

        config.setBlockWhenExhausted(true);//连接耗尽的时候,是否阻塞,false会抛出异常,true阻塞直到超时。默认为true。

        pool = new JedisPool(config,redisIp,redisPort,1000*2);

2.对jedis常用方法进行封装,封装set方法从redis存值,get方法从redis取值,setEx方法对redis存值并设置有效期,del方法以key值来删除redis中的value值,expire方法用来重置redis过期时间,在程序的正常使用期,当服务器每接收请求一次请求后,都会重置key,value的失效时间。

public static Long expire(String key,int exTime){
        Jedis jedis = null;
        Long result = null;

        try {
            jedis = RedisPool.getJedis();
            result = jedis.expire(key,exTime);
        } catch (Exception e) {
            log.error("expire key:{}  error",key,e);
            RedisPool.returnBrokenResource(jedis);
            return  result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }
    public static String setEx(String key,String value,int exTime){
        Jedis jedis = null;
        String result = null;

        try {
            jedis = RedisPool.getJedis();
            result = jedis.setex(key,exTime, value);
        } catch (Exception e) {
            log.error("setex key:{} value:{} error",key,value,e);
            RedisPool.returnBrokenResource(jedis);
            return  result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }
    public static String set(String key,String value){
        Jedis jedis = null;
        String result = null;

        try {
            jedis = RedisPool.getJedis();
            result = jedis.set(key, value);
        } catch (Exception e) {
            log.error("set key:{} value:{} error",key,value,e);
            RedisPool.returnBrokenResource(jedis);
            return  result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

    public static String get(String key){
        Jedis jedis = null;
        String result = null;

        try {
            jedis = RedisPool.getJedis();
            result = jedis.get(key);
        } catch (Exception e) {
            log.error("set key:{}  error",key,e);
            RedisPool.returnBrokenResource(jedis);
            return  result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

    public static Long del(String key){
        Jedis jedis = null;
        Long result = null;

        try {
            jedis = RedisPool.getJedis();
            result = jedis.del(key);
        } catch (Exception e) {
            log.error("set key:{}  error",key,e);
            RedisPool.returnBrokenResource(jedis);
            return  result;
        }
        RedisPool.returnResource(jedis);
        return result;
    }

3.以上实现了redis与服务器之间的连接,但当做多服务器时会出现,请求会打到服务器1或服务器2中,使得session信息不一致,这时就要封装一个Cookie进行封装,确保session信息一致,这时将请求的session,存入到COOKIE_DOMAIN下,当用户使用浏览器进行访问,浏览器中存入SESSION值能作为key在redis中取到value值。

public  static  String readLoginToken(HttpServletRequest request){
        Cookie[] cks = request.getCookies();
        if(cks != null){
            for (Cookie ck : cks) {
                System.out.println(ck.getName());
                System.out.println(COOKIE_NAME);
                log.info("read cookieName:{},cookieValue:{}", ck.getName(),ck.getValue());
                if (StringUtils.equals(ck.getName(),COOKIE_NAME)){
                    log.info("return cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());
                    return ck.getValue();
                }
            }
        }
        return null;
    }

    public static void writeLoginToken(HttpServletResponse response,String token){
        Cookie ck = new Cookie(COOKIE_NAME,token);
        ck.setDomain(COOKIE_DOMAIN);
        ck.setPath("/");
        ck.setHttpOnly(true);
        //单位是秒
        //如果maxage不设置,cookie就不会写入硬盘,而是卸载内存,只在当前页面有效
        ck.setMaxAge(60*60*24*365);//如果是-1,代表永久
        log.info("write cookieName:{},cookitValue:{}",ck.getName(),ck.getValue());
        response.addCookie(ck);
    }
    public static void delLoginToken(HttpServletRequest request,HttpServletResponse response){
        Cookie[] cks = request.getCookies();
        if (cks != null){
            for (Cookie ck : cks){
                if (StringUtils.equals(ck.getName(), COOKIE_NAME)){
                    ck.setDomain(COOKIE_DOMAIN);
                    ck.setPath("/");
                    ck.setMaxAge(0);//设置成0代表删除此cookie
                    log.info("del cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());
                    response.addCookie(ck);
                    return;
                }
            }
        }

上一篇:ATT&CK实战系列——红队实战(五)


下一篇:CK-UR08-E00系列RFID工业自动化超高频读卡器自定义协议说明