需求:例如用户浏览商品需要保存用户最近浏览的N条记录,同一个商品浏览多次只保存最近一条。
实现思路:使用redis 的 zSet 有序集合,zSet.add(String k,String v,Double score),
k : 为用户浏览商品在redis中的标识 例如 "recent_browse_list:" + userId
v : 为商品id
score : score为一个分值,需要把最近浏览的商品id 的分值设置为最大值,此处我们可以设置为当前时间System.currentTimeMillis()
这样最近浏览的商品id的分值一定最大。
由于zset 的集合特性当插入已经存在的 v 值 (商品id) 时只会更新score 值,
用户可能无限制浏览商品,需要确保zSet 不能无限制插入,需要控制zSet 的大小,也就是指保存最近N条浏览记录。
需要在插入第N+1 条后移除最开始浏览的第一条。
但zSet 没有查询到类似的方法,所以想到的办法是当size > num , 保留最近的num条。
实现代码如下:
@RequestMapping("/recentBrowseList")
@ResponseBody
public Object recentBrowseList(String goodId) {
String userId = "tony"; // token或session 中获取当前用户id
int num = 5; // 保留最近 5条
String redisKey = "recent_browse_list:"