侧边栏壁纸
  • 累计撰写 9 篇文章
  • 累计创建 5 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Redis2 👍结合实例分析Redis常用操作

Lieey
2024-07-22 / 0 评论 / 0 点赞 / 54 阅读 / 3862 字

Redis2 👍结合实例分析Redis常用操作

一、登入缓存

在登入过程中,我们处理完用户账号密码后,会根据用户信息创建一个token令牌,这个token就是一个唯一的字符串,在生成这个token的时候是基于密码学的方式生成的。所以在用户拿到这个token之后,再去发送的每一个请求,都可以利用密码学的原理,去解析出它对应的这个用户信息。生成token和解析token的功能,目前已经有非常成熟的代码库,使用最多的就是JWT。而拿到这个token之后,我们经常将其通过key-value的方式存储在redis中,并设置一个过期时间。

String token = loginService.login(userParam.getUserId(), userParam.getPassword());
if (StringUtils.hasLength(token)) {
   //存储到redis,并设置过期时间
   redisUtil.set(token, user.getUserId(), 10000L);
}

而在请求其他接口之前,先去从Redis里面读取这个Token,检查一下它是不是过期了,如果过期了,就证明这个Token失效了,需要重新登录。如果没有过期,再执行后面的逻辑。因此读取这个Token并进行校验的这个过程,一定是通过某种针对请求进行统一处理的这种方式,在这个时机来做的,那在Spring里面通常有两种,一种就是过滤器,一种是拦截器。我这里实现了一个过滤器JWTFliter,在这个过滤器里来执行上面我们提到的那个校验的操作。

@Override
protected boolean executeLogin(ServletRequest request request, ServletResponse reponse){
   //拿到servlet请求
   HttpServletRequest httpServletRequest = (HttpServletRequest) request;
   HttpServletResponse httpServletResponse = (HttpServletResponse) response;
   //从请求的响应头里解析出这个Token
   String token = httpServletResponse.getHeader(LOGIN_SIGN);
   //将这个Token转化成JWT库所需要的数据结构
   JWTToken jwtToken = new JWTToken(token);
   //提交realm进行登录,如果错误他会抛出异常并被捕获
   try {
      //将JWT向后传递,来执行具体的校验操作
      this.getSubject(request, response).login(jetToken);
   } catch (Exception e) {
      try {
          setReturnInfo(httpsServletResponse, 401, "登录认证出现异常");
      } catch (IOException ex) {
          log.info(e.getMessage());
      }
      return false;
   }
   return true;
}

这里解析出的JWT被向后传递到SpringBoot中经常引用的另外一个进行访问控制的一个库Shiro

image-usga.png

二、文章阅读量、点赞、收藏

  • 文章阅读量,每当用户点开当前文章就会自动给当前这个文章的阅读量+1。其实很简单,我们先根据文章Id生成一下我们存储在Redis里面的那个Key,然后调用我们Redis工具类里面的incur自增方法。
@Override
public Long readArticle(String articleId) {
   String key = this.generateArticleReadKey(articleId);
   return redisUtil.incur(key);
}

具体就对应到我们RedisTemplate里面的Value操作,调用的是value操作的increment方法

public Long incur(final String key) {
   ValueOperations<String, Object> operations = redisTemplate.opsForValue();
   return operations.increment(key);
}

对应的Redis底层命令就是incur key命令

  • 点赞/收藏,它和文章阅读量的做法差别不大,都相当于是一个计数器,但是当我们手动点赞/收藏后,需要记录一下这个账号的点赞/收藏状态。所以他不能仅仅是一个计数器,他需要把点赞/收藏人对应的这个账号给他记录下来。所以我们需要创建一个容器用于存储当前所有点赞/收藏人的信息。
    @Override
    public Long likeArticle(String articleId, String userId) {
       String key = this.generateArticleLikeKey(articleId);
       return redisUtil.addSet(key, userId);
    }
    
0

评论区