RedisTemplate zSet的使用, 根据点赞排序,和创建时间排序2种方式

使用Redis 对问题下的回答按点赞数排序的思路;

1根据问题id查出所有的回答列表;

2吧回答的ids添加到zset1中; key为id,value为赞的数量;(用于点赞排行);

//批量添加 Long add(K var1, Set<ZSetOperations.TypedTuple<V>> var2);

2-2吧回答的ids添加到zset2中;key为id,value为createTime.getLong();(用于创建时间排行);

3对回答进行点赞(取消)的时候

更改zset1中的指定key的value加减1;

4-1发表回答的时候zset1,zset2中增加元素,

//redisTemplate.opsForZSet().add(key,4565L,13);

4-2删除的时候移除元素;

//redisTemplate.opsForZSet().remove(key,4565L)

5获取排序后的分页数据;结果为回答的ids;

6迭代ids 去每个回答的id对应素材的缓存中取出对象;

    @Test
   public void test2(){
      String key = "mls_AnswerIdsByQuersionId:"+123;
      redisTemplate.opsForZSet().add(key,234L,5); //添加单条

      redisTemplate.opsForZSet().add(key,4565L,13);

      redisTemplate.opsForZSet().add(key,2345L,15);

      Set<ZSetOperations.TypedTuple<Long>> var2 = new HashSet<>();
      ZSetOperations.TypedTuple<Long> answerVoInZset1 = new AnswerVoInZset(2345L, 12);
      ZSetOperations.TypedTuple<Long> answerVoInZset2 = new AnswerVoInZset(5675L, 16);
      ZSetOperations.TypedTuple<Long> answerVoInZset4 = new AnswerVoInZset(4565L, 11);
      var2.add(answerVoInZset1);
      var2.add(answerVoInZset2);
      var2.add(answerVoInZset4);
      redisTempalte.opsForZSet().add(key, var2);//批量添加
      redisTemplate.opsForZSet().remove(key,4565L); //移除单个元素

      Set<Long> longs = redisTempalte.opsForZSet().reverseRange(key, 0, 3);
   }
//用于批量添加的对象;

   class AnswerVoInZset implements ZSetOperations.TypedTuple<Long>{
      Long id;
      double score;
      public AnswerVoInZset(Long id, double score) {
         this.id = id;
         this.score = score;
      }
      @Override
      public Long getValue() {
         return id;
      }
      @Override
      public Double getScore() {
         return score;
      }
      @Override
      public int compareTo(ZSetOperations.TypedTuple<Long> o) {
         AnswerVoInZset o1 = (AnswerVoInZset) o;
         return new Double(this.score).compareTo(o1.getScore());
      }
   }
   //时间排序;(参考别人的)
   @Resource(name = "redisTemplate")
   private RedisTemplate<String, Long> redisTempalte;

   public void addRecentBrowsingPosition(long userId, long positionId) {
      String key = "mls_AnswerIdsByQuersionId:" + 123;
      // 获取已缓存的最近浏览的职位
      ZSetOperations<String, Long> zSetOperations = redisTempalte.opsForZSet();
      // zset内部是按分数来排序的,这里用当前时间做分数
      zSetOperations.add(key, positionId, System.currentTimeMillis());
      // 环形结构--4,-3,-2,-1,0,1,2,3,4
      zSetOperations.removeRange(key, 0, -6);
   }

   public List<Long> getRecentBrowsingPositionIds(long userId) {
      if (userId <= 0) {
         return Collections.emptyList();
      }
      // 获取用户最近浏览的职位id
      String key = "mls_AnswerIdsByQuersionId:" + 123;
      Set<Long> positionIds = redisTempalte.opsForZSet().reverseRange(key, 0, 4);
      return new ArrayList<>(positionIds);
   }

原文地址:https://www.cnblogs.com/zhuyeshen/p/11433857.html

时间: 2024-08-30 14:16:28

RedisTemplate zSet的使用, 根据点赞排序,和创建时间排序2种方式的相关文章

算法导论-排序(四)计数排序(线性时间排序)

目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn);   而计数排序不需要对数进行比较就可以进行排序:很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)..哈哈,那么神奇,下面开讲!!!! 限制:计数排序只能对非负整数(0,1,2,3...N)进行排序 排序思想:计数排序的基本思想就是对每一个输入元素 x,确定出小于 x

排序算法之冒泡排序的两种方式

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中. 冒泡排序有两种方式,相邻的两个数比较,把大的数(或者小的数)放在上面,依次进行,像水泡一样,逐渐上浮. 也可以以相反的过程,把较大的数(或者较小的数)放在下面,推入湖底.这两种方式都是冒泡排序,因为冒泡排序是比较相邻的两个数,下标不具有跳跃性,同时也是一种稳定的算法. 方式一:较大的数(或者较小的数)上浮 1 void BubbleSort(int a[], int n) 2 { 3 for(int i=0; i<n-1

Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句

今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY -ID DESC 或者: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY (ID + 1) mysql时间格式化,按时间段查询MYSQL语句   2011-04-15 09:01:08| 

Mysql数据库里面的String类型按照数字来排序以及按时间排序的sql语句

今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决办法: 如: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY -ID DESC 或者: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY (ID + 1) mysql时间格式化,按时间段查询MYSQL语句   2011-04-15 09:01:08| 

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,

ls按时间排序输出文件列表

首先,ls --help查看ls相关的与时间排序相关的参数: > ls --help|grep -E "time|sort" 如果不指定 -cftuSUX 或 --sort 任何一个选项,则根据字母大小排序. -c                         配合 -lt:根据 ctime 排序及显示 ctime (文件 配合 -l:显示 ctime 但根据名称排序 否则:根据 ctime 排序 -f                         do not sort,

使用redis zset实现抽奖,奖池商品按时间随机分布

话不多说,直接上需求描述: 最近需要上一期活动,这个活动是以转盘抽奖为形式的抽奖活动,要求每个用户用积分进行抽奖,且中奖率为100%即不可出现不中任何奖品的情况,之后,又加了一个要求,即不能实行纯随机的抽取,如果如此会产生一个极端情况,如果开始的时候活动极其火爆由于随机的不可控性头一天用户便将所有优质奖品全部抽走,那么后来的用户将只会抽到保底奖品. 那么奖品就需要按时间分布在从活动开始到结束的时间段,其次需要做的是,在某些特殊的时间段,我们希望多投放一些奖品给用户抽到. 需求分析: 那么开奖策略

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组