发表于: 2018-01-17 22:17:23

1 664


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

今天把redis的所有工作完成,特此在这里留下自己踩过大坑.


Spring的版本,版本,版本. 重要的事情说三遍.

官方文档给出的建议是在使用spring data redis的1.x以上的版本的时候推荐使用Spring 5.0.2以及以上的版本,而我一直使用的是4.1.3的版本,就导致我这个版本并不支持,所有疯狂报错.但是鉴于5.0.2太新, 我就选择使用了4.3.3  是spring4的最后一个版本,对redis这个配件是完全支持的.

另外因为在项目中缓存的基本都是对象,所以我统一使用的redis的Hash存储.这是我今天修改了的对应的方法,昨天的是临时充数copy的..

package com.util;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

/**
* @author Arike
* Create_at 2018/1/18 09:21
*/
public class RedisUtil {
//注入redis操作类
   @Autowired
   private static StringRedisTemplate redis;
   private static HashOperations hs = redis.opsForHash();
   private static Logger logger = Logger.getLogger(RedisUtil.class);
   private RedisUtil() {
}

/**
    * 判断是否存在这个对象
    * @param ok object key      大key
    * @param hk objecthash key  小key
    * @return 返回是否存在
    */
   public static boolean haskey(String ok,String hk){
return hs.hasKey(ok, hk);
   }

/**
    * 增加缓存
    * @param ok object key      大key
    * @param hk objecthash key  小key
    * @param obj 需要缓存的对象
    * @param time 缓存存在时间,这里只能设置大key的存在时间
    * @return 返回是否添加成功
    */
   public static boolean put(String ok,String hk,Object obj,Long time){
try {
hs.put(ok,hk,obj);
           if(time>0){
redis.expire(ok, time, TimeUnit.SECONDS);
           }
return true;
       } catch (Throwable e) {
logger.error("增加缓存 "+ok+"-"+hk+"失败,"+"异常是"+e);
       }
return false;
   }

/**
    * 获取缓存
    * @param ok object key      大key
    * @param hk objecthash key  小key
    * @return 返回该缓存
    */
   public static Object get(String ok,String hk){
try{
return hs.get(ok,hk);
       }catch(Throwable e){
logger.error("获取缓存 "+ok+"-"+hk+"失败,"+"异常是"+e);
       }
return null;
   }

/**
    * 删除缓存
    * @param ok object Key 大key
    * @param hashKyes hask keys 小key数组,传入多少个删除多少个.
    * @return
    */
   public static Long del(String ok,String ...hashKyes){
try {
if(hashKyes==null){
redis.delete(ok);
               return 1L;
           }
return hs.delete(ok,hashKyes);
         
       } catch (Throwable e) {
logger.error("删除失败,"+"异常是"+e);
       }
return 0L;
   }
}

需要注意的是,hash和value有所区别,一个是key,value一个是key,key,value.所以hash所对应的组别更多.

设置过期时间这个我看了一下,hash只能对大K设置时间范畴,所有有需要设置单个对象过期时间的就需要单独的占用一对kk, 然后删除也要分删除大K,还是大K中的某几个小K,所以我使用了不定参数,对应着redis这里提供的不定参数的删除方法,其实也就是一个(未知个数的)数组作为参数.


另外再分享一下关于负载均衡之后多个容器互相验证登陆以及用户信息同步的问题.


我在任务5的时候验证登录使用的是cookie对应session的方式来验证的,因为我个人认为不将用户的任意信息添加到cookie中才是最安全的,我这种登陆方式,在cookie和session中保存一组相同的k,v即可,value取自一段随机数.并不会牵涉到用户的任何信息,哪怕cookie被暴力破解了,不法人士拿到的也只是一串没有任何意义的字符而已.

另外用户名称我也是保存到session中用于存取的,多个容器的话就会出现无法显示用户信息的情况.


具体的逻辑是这样,先看一张图:

可以看到目的就是为了让2个容器的session都缓存到redis里面去,当容器一登陆之后带有登陆信息的Session就会存储到redis,然后负载均衡到第二个容器的时候他会先去redis里去拿session,这样就可以保证登陆信息和用户信息在容器间同步了.

具体需要以下的东西:


Tomcat需要链接 redis,所以需要专门的jar包。 一共有3个jar包:
jedis-2.5.2.jar,
commons-pool2-2.0.jar,
tomcat-redis-session-manager1.2.jar
下载解压后,放在tomat8111的lib目录下。注:不要放在webapp里面去了哦 
下载解压后,放在tomat8222的lib目录下。注:不要放在webapp里面去了哦 
两个tomcat都要放

然后修改tomcat/conf/context.xml ,增加下面这坨东西

  <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" /> 


这样配置之后就可以在多态容器间共享session了.


明天计划的事情:(一定要写非常细致的内容) 

进入任务7
遇到的问题:(遇到什么困难,怎么解决的) 

null
收获:(通过今天的学习,学到了什么知识)

知道了如何进行session共享



返回列表 返回列表
评论

    分享到