【项目】Redis,一站式高性能存储方案

社区项目中利用Redis进行高性能存储。主要包含内容:Redis概念配置以及使用方法(Redis入门,Spring整合Redis),项目中的Redis具体实操(点赞,我收到的赞,关注、取消关注,关注列表、粉丝列表,优化登录模块)等。

Redis入门

  • Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
  • Redis将所有数据都存放在内存中,所以它的读写性能十分惊人。同时,Redis还可以将内存中的数据以快照或日志的形式保存到硬盘上,以保证数据的安全性。
  • Redis典型的应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等。

Spring整合Redis

  • 引入依赖
    • spring-boot-starter-data-redis
  • 配置Redis
    • 配置数据库参数
    • 编写配置类,构造RedisTemplate
  • 访问Redis
    • redisTemplate.opsForValue()
    • redisTemplate.opsForHash()
    • redisTemplate.opsForList()
    • redisTemplate.opsForSet()
    • redisTemplate.opsForZSet()

Spring整合Redis

  • 引入依赖

    • spring-boot-starter-data-redis

      在pom.xml文件中加入如下配置:

  • 配置Redis

    • 配置数据库参数类

      在application.properties文件中加入如下配置:

    • 编写配置类,构造RedisTemplate

      在config包下新建RedisConfig类,在类中构造RedisTemplate:

  • 访问Redis

    • redisTemplate.opsForValue()
    • redisTemplate.opsForHash()
    • redisTemplate.opsForList()
    • redisTemplate.opsForZSet()

点赞

  • 点赞

    • 支持对帖子、评论点赞

      首先构造Redis中的key,在util包下新建RedisKeyUtil类,添加对某个实体的赞的查询功能:

    • 第1次点赞,第2次取消点赞

  • 首页点赞数量

    • 统计帖子的点赞数量

    Service包下新建LikeService类:

  • 详情页点赞数量

    • 统计点赞数量
    • 显示点赞状态

    Controller包下新建LikeController类:

    在discuss-detail.html文件中和index.html修改点赞相关的内容:

    并且引入JSON函数修改状态:

我收到的赞

  • 重构点赞功能

    • 以用户为key,记录点赞数量

      在RedisKeyUtil中增加用户key的拼接功能:

    • increment(key),decrement(key)

      重写LikeService里的like函数,增加传入参数entityUserId用来记录当前实体的用户ID,然后用来对该用户的赞进行增减:

      相应的discuss-detail.html传参处、discuss.js中的函数、LikeController中调用LikeService的地方也需要修改

  • 开发个人主页

    • 以用户为key,查询点赞数量

      在UserController中增加个人主页界面的Mapping,调用在LikeService中增加的查询点赞数量函数来显示点赞数:

      同时在对应的html文件中头像处的链接修改:

关注、取消关注

  • 需求

    • 开发关注、取消关注功能

      RedisKeyUtil工具中新增对关注者和粉丝的key的获取:

      新增FollowService用来提供关注和取关的逻辑(两者相似):

      新增FollowController提供关注和取消关注的界面:

    • 统计用户的关注数、粉丝数

      在FollowService中新增查询数量、查询是否关注的函数:

      在UserController中修改profile的界面,展示关注数等:

      profile.html文件的修改:

      profile.html文件中调用的JSON函数的修改:

  • 关键

    • 若A关注了B,则A是B的Follower(粉丝),B是A的Followee(目标)
    • 关注的目标可以是用户、帖子、题目等,在实现时将这些目标抽象为实体

关注列表、粉丝列表

  • 业务层

    • 查询某个用户关注的人,支持分页

      在FollowService中添加findFollowees方法:

    • 查询某个用户的粉丝,支持分页(和上面相似)

  • 表现层

    • 处理“查询关注的人”、“查询粉丝”请求

      在FollowController中编写getFollowees方法:(查询粉丝相似)

    • 编写“查询关注的人”、“查询粉丝”模板

      查询关注的人模板followee.html文件主要修改部分:(查询粉丝的是follower.html,逻辑几乎相同)

优化登录模块

  • 使用Redis存储验证码

    • 验证码需要频繁的访问和刷新,对性能要求较高

    • 验证码不需要永久保存,通常在很短的时间后就会失效

    • 分布式部署时,存在Session共享的问题

      RedisKeyUtil中新增kaptcha的key,然后重写LoginController:

  • 使用Redis存储登录凭证

    • 处理每次请求时,都要查询用户的登录凭证,访问的频率非常高

      利用注解@Deprecated不建议使用LoginTicketMapper,然后在RedisKeyUtil中新增ticket的key。在UerService中修改login方法:

      logout方法和findLoginTicket方法:

  • 使用Redis缓存用户信息

    • 处理每次请求时,都要根据凭证查询用户信息,访问的频率非常高

      UserService中增加三个方法缓存用户信息和清除缓存,寻找用户的方法属于高频访问,所以直接从redis中取user。在调用update方法时需要清除缓存:

0%