redis zset利用并集求差集

解决的痛点是缓存里的数据结构 zset 有序集合,它只能做并集、交集 不能做差集
我的需求是需要它做差集(总的内容缓存 差 用户已看的缓存)就能得到 用户没有看的,也就是接下来要给用户看的内容我的思路是利用并集操作完成。

内容的缓存池 value当成是内容的ID,score当成权重  要以这个降序排序返回给用户(每次五条)

它俩一并集操作,凡是相同的ID分数就会叠加  并出来的结果正负一抵消就变成0了,然后我把小于等于0的都删掉就求出并集了。

兄弟们感觉有用的话就点个👍🏻吧

初始化数据


    @Test
    public void diffByScore(){
        long start = System.currentTimeMillis();
        //推荐池
        redisTemplate.boundZSetOps("key_zset_sort").add(1,10);
        redisTemplate.boundZSetOps("key_zset_sort").add(2,20);
        redisTemplate.boundZSetOps("key_zset_sort").add(3,30);
        redisTemplate.boundZSetOps("key_zset_sort").add(10,100);

        long end = System.currentTimeMillis();
        System.out.println("程序执行花费时间:" + (end - start)/1000.0);
    }

    @Test
    public void diffByScore1(){
        long start = System.currentTimeMillis();
        //用户已看
        redisTemplate.boundZSetOps("key_zset_sort_my").add(1,-10);
        redisTemplate.boundZSetOps("key_zset_sort_my").add(2,-20);
        redisTemplate.boundZSetOps("key_zset_sort_my").add(3,-30);
        redisTemplate.boundZSetOps("key_zset_sort_my").add(8,-80);
        long end = System.currentTimeMillis();
        System.out.println("程序执行花费时间:" + (end - start)/1000.0);
    }

并集操作

    @Test
    public void diffByScore2(){
        long start = System.currentTimeMillis();
        //筛选出 待看
        redisTemplate.opsForZSet().unionAndStore("key_zset_sort","key_zset_sort_my","tmp");
        redisTemplate.boundZSetOps("tmp").removeRangeByScore(Integer.MIN_VALUE,0);
        long end = System.currentTimeMillis();
        System.out.println("程序执行花费时间:" + (end - start)/1000.0);
    }

返回数据

先返回索引0-9的数据,然后删除索引0-9

    @Test
    public void testDiff4(){
        long start = System.currentTimeMillis();
        //返回数据
        final Set<Integer> tmp = redisTemplate.opsForZSet().range("tmp", 0, 9);
        for(Integer id:tmp){
            System.out.println(id);
        }
        System.out.println("====");
        Long i = redisTemplate.opsForZSet().removeRange("tmp",0,9);
        System.out.println(i);
        redisTemplate.boundZSetOps("tmp").removeRangeByScore(Integer.MIN_VALUE,0);
        long end = System.currentTimeMillis();
        System.out.println("程序执行花费时间:" + (end - start)/1000.0);
    }

测试结果

* 100万-50万
* 程序执行花费时间:4.209
*
* 100万-10万
* 程序执行花费时间:3.371
*
* 50万-10万
* 程序执行花费时间:1.879
*
* 50万-1万
* 程序执行花费时间:1.089

本次需求在50万-1万这个档次,再加上预加载上的优化,响应时间可以做到秒级以内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值