RedisTemplate 实现最近浏览、最近访问,最近使用功能。

本文介绍如何利用RedisTemplate的zSet有序集合实现最近浏览、最近访问功能。通过设置key为'recent_browse_list:' + userId,value为商品id,score为当前时间戳,保证最近浏览的记录优先。当zSet大小超过预设值时,需要移除最早记录,目前的清除方式可能存在不优雅的问题,欢迎提供更好的实现思路。
摘要由CSDN通过智能技术生成

需求:例如用户浏览商品需要保存用户最近浏览的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:"
使用RedisTemplate实现set去重,你可以使用Redis的Set数据结构以及RedisTemplate中提供的相关方法。下面是一个简单示例代码: ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.SetOperations; // 在使用之前,请确保已经正确配置了RedisTemplate public class SetDeduplicationExample { private RedisTemplate<String, String> redisTemplate; public SetDeduplicationExample(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public void deduplicateSet(String key, String... values) { SetOperations<String, String> setOperations = redisTemplate.opsForSet(); // 将元素添加到Set中,返回添加成功的元素个数 Long addedCount = setOperations.add(key, values); // 获取Set中的所有元素 Set<String> allElements = setOperations.members(key); // 如果添加成功的元素个数等于values数组的长度,表示所有元素都是新的,无需去重 if (addedCount != null && addedCount == values.length) { System.out.println("All elements are new, no deduplication needed."); return; } // 如果Set中的元素个数等于values数组的长度,表示所有元素都已存在,无需去重 if (allElements != null && allElements.size() == values.length) { System.out.println("All elements already exist, no deduplication needed."); return; } // 从Set中移除已存在的元素 setOperations.remove(key, values); // 将剩余的新元素重新添加到Set中 setOperations.add(key, values); System.out.println("Deduplication completed."); } } ``` 在上面的示例中,`deduplicateSet`方法接收一个键(key)和一个或多个值(values)作为参数,它会将所有的值添加到Redis的Set中,并进行去重操作。如果所有的值都是新的,或者所有的值都已存在于Set中,则不执行去重操作。否则,它会从Set中移除已存在的元素,并重新添加剩余的新元素。 注意:这只是一个简单的示例,实际使用时需要根据具体的业务需求进行适当的调整和错误处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值