分布式会话实现(Springboot+redis)

分布式会话实现(Springboot+redis)

安装

  • 服务器上安装redis
    • 在redis官网找到最新下载链接,执行
        wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    
    • 修改文件权限,解压
        chmod -R 777 redis-5.0.5.tar.gz
        tar -xvzf redis-5.0.5.tar.gz
    
    • 进入redis目录,使用make指令编译redis,使用make install命令安装redis
        cd redis-5.0.5
        make
        make install
    
    • 进入src目录,看到redis-server进程,执行./redis-server启动
        ./redis-server &
    
    • 使用./redis-cli默认连接本地端口6379的redis
        ./redis-cli
    
    • 测试redis
        set key name
        get key
    

配置

  • 添加依赖
        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
            org.springframework.session
            spring-session-data-redis
            2.1.5.RELEASE
        
  • 创建RedisConfig类
    添加两个注解
    @Component
    @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
    public class RedisConfig {

    }
 
  • 配置springboot对redis的依赖
    #配置springboot对redis的依赖
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.database=10
    #spring.redis.password=

    #设置jedis连接池
    spring.redis.jedis.pool.max-active=50
    spring.redis.jedis.pool.min-idle=20
  • 报错DefaultSerializer requires a Serializable payload but received an object of type
    redis使用的序列化方式就是jdk默认的Serializable,因此要实现Serializable接口。
    更好的方式是使用JSON的序列化方式。
  • 服务器端redis目录下redis.conf修改配置,在#bind 127.0.0.1 ::1下增加
    bind *ip*

redis应用

    @Autowired
    private RedisTemplate redisTemplate;
  • 把存入session修改成存入redis
    //修改成若用户登录验证成功后将对应的登录信息和登录凭证一起存入redis中
    //生成登录凭证token, UUID
    String uuidToken = UUID.randomUUID().toString();
    uuidToken = uuidToken.replace("-","");
    //建立token和用户登录态之间的联系
    redisTemplate.opsForValue().set(uuidToken,userModel);
    redisTemplate.expire(uuidToken,1, TimeUnit.HOURS);
  • 前端获取token
    var token = data.data;
    window.localStorage["token"] = token;
  • 后端校验token,并且读取用户model
        String token = httpServletRequest.getParameterMap().get("token")[0];
        if(StringUtils.isEmpty(token)){
            throw new BusinessException(EmBusinessError.USER_NOT_LOGIN, "用户还未登陆不能下单");
        }
        UserModel userModel = (UserModel) redisTemplate.opsForValue().get(token);    

你可能感兴趣的:(分布式会话实现(Springboot+redis))