使用redis缓存来实现最近的浏览记录
感谢实现的思路与考虑: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);
上一篇: 二进制中有多少个1
推荐阅读
-
使用redis缓存来实现最近的浏览记录
-
【重要总结】使用gulp来解决浏览器缓存的问题。还有遇到的bug。missing script: gulp和Task function must be specified
-
PHP使用redis实现统计缓存mysql压力的方法,redismysql_PHP教程
-
nodejs使用redis作为缓存介质实现的封装缓存类示例
-
java使用动态代理来实现AOP(日志记录)的实例代码
-
java使用动态代理来实现AOP(日志记录)的实例代码
-
SpringBoot使用Redis缓存的实现方法
-
Django使用redis缓存服务器的实现代码示例
-
使用Browserify来实现CommonJS的浏览器加载方法
-
jQuery.cookie.js实现记录最近浏览过的商品功能示例