欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用redis缓存来实现最近的浏览记录

程序员文章站 2024-02-27 15:54:21
...

感谢实现的思路与考虑:https://blog.csdn.net/qq_37107280/article/details/77894680

要使用redis缓存来实现最近的浏览记录功能,就是一个get和set的操作。

1.对于set的考虑

  • 确定最近浏览记录的失效时间,设置一个月即可

    expire key second

  • 最近的浏览记录有一个数量的限制,不能是一直LPUSH或者是RPUSH
    由于之前没有接触过LTRIM,开始还在想LIST中的push或者range命令能否对存储的记录条数进行指定,看到LTRIM命令整个人就好起来了

    ltrim key start stop 注意是[start, stop],start和stop都是从下标0开始

  • List本身就是有序的,先进的后出,后进的先出,这样也正好符合我们的最近浏览记录功能

  • 怎样保证用户连续浏览同一条记录的时候,不会重复保存记录?LREM
    刚开始的时候,并没有考虑到这个问题,也是在看了上面的文章后,才发现好像是有这么个问题。
    起初的实现想法时,将需要展示的三四个字段值统统进行缓存,但考虑这个重复问题时,果断的放弃了这个想法,直接缓存id,其他展示字段在进行LRANGE的时候去 一 一 获取。
    所以,可以使用LREM来移除列表中与缓存id 相等的元素。同时在使用Lpush重新再List插入最新的浏览商品,这样既能保证浏览的记录放在最顶,又能保证不重复

    lrem key count value

2.对于get的考虑

  • 由于此处只考虑最近10条的浏览记录,所以这里不考虑分页的情况。
  • 通过lrange去获取指定长度的数据

    lrange key start stop
    其中stop可以取-1,表示最后一个元素;-2,表示倒数第二个元素
    所以lrange key 0 -1,获取全部10条

3.最后的实现代码(未考虑原子性)

// 每个用户userId为一个list
String key = RedisConstant.RECENT_BROWSE_RECORD + userId;
// 为了保证浏览的 唯一性,每次添加前,将list 中该recordId去掉,再加入,以保证其浏览的最新的记录在最前面
redisUtil.lRem(key, 1, recordId);
// 将value lpush到该key下的list中
redisUtil.lPush(key, recordId);
// 使用ltrim将10个数据之后的数据剪切掉[start,end]
redisUtil.lTrim(key, 0, 9);
// 设置缓存时间为一个月
redisUtil.expire(key, 60 * 60 * 24 * 30);
String key = RedisConstant.RECENT_BROWSE_RECORD + userId;
// 取值所有
List list = redisUtil.lRange(key, 0, -1);
相关标签: redis java redis

上一篇: 二进制中有多少个1

下一篇: