栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

redis zset利用并集求差集

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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万这个档次,再加上预加载上的优化,响应时间可以做到秒级以内

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028856.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号