解决的痛点是缓存里的数据结构 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万这个档次,再加上预加载上的优化,响应时间可以做到秒级以内