使用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对应素材的缓存中取出对象;
  1. @Test
  2. public void test2(){
  3. String key = "mls_AnswerIdsByQuersionId:"+123;
  4. redisTemplate.opsForZSet().add(key,234L,5); //添加单条
  5.  
  6. redisTemplate.opsForZSet().add(key,4565L,13);
  7.  
  8. redisTemplate.opsForZSet().add(key,2345L,15);
  9.  
  10. Set<ZSetOperations.TypedTuple<Long>> var2 = new HashSet<>();
  11. ZSetOperations.TypedTuple<Long> answerVoInZset1 = new AnswerVoInZset(2345L, 12);
  12. ZSetOperations.TypedTuple<Long> answerVoInZset2 = new AnswerVoInZset(5675L, 16);
  13. ZSetOperations.TypedTuple<Long> answerVoInZset4 = new AnswerVoInZset(4565L, 11);
  14. var2.add(answerVoInZset1);
  15. var2.add(answerVoInZset2);
  16. var2.add(answerVoInZset4);
  17. redisTempalte.opsForZSet().add(key, var2);//批量添加
  18. redisTemplate.opsForZSet().remove(key,4565L); //移除单个元素
  19.  
  20. Set<Long> longs = redisTempalte.opsForZSet().reverseRange(key, 0, 3);
  21. }
  22. //用于批量添加的对象;
  23.  
  24. class AnswerVoInZset implements ZSetOperations.TypedTuple<Long>{
  25. Long id;
  26. double score;
  27. public AnswerVoInZset(Long id, double score) {
  28. this.id = id;
  29. this.score = score;
  30. }
  31. @Override
  32. public Long getValue() {
  33. return id;
  34. }
  35. @Override
  36. public Double getScore() {
  37. return score;
  38. }
  39. @Override
  40. public int compareTo(ZSetOperations.TypedTuple<Long> o) {
  41. AnswerVoInZset o1 = (AnswerVoInZset) o;
  42. return new Double(this.score).compareTo(o1.getScore());
  43. }
  44. }
  45. //时间排序;(参考别人的)
  46. @Resource(name = "redisTemplate")
  47. private RedisTemplate<String, Long> redisTempalte;
  48.  
  49. public void addRecentBrowsingPosition(long userId, long positionId) {
  50. String key = "mls_AnswerIdsByQuersionId:" + 123;
  51. // 获取已缓存的最近浏览的职位
  52. ZSetOperations<String, Long> zSetOperations = redisTempalte.opsForZSet();
  53. // zset内部是按分数来排序的,这里用当前时间做分数
  54. zSetOperations.add(key, positionId, System.currentTimeMillis());
  55. // 环形结构--4,-3,-2,-1,0,1,2,3,4
  56. zSetOperations.removeRange(key, 0, -6);
  57. }
  58.  
  59. public List<Long> getRecentBrowsingPositionIds(long userId) {
  60. if (userId <= 0) {
  61. return Collections.emptyList();
  62. }
  63. // 获取用户最近浏览的职位id
  64. String key = "mls_AnswerIdsByQuersionId:" + 123;
  65. Set<Long> positionIds = redisTempalte.opsForZSet().reverseRange(key, 0, 4);
  66. return new ArrayList<>(positionIds);
  67. }

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

  1. 目录和文件 按创建时间排序du -h --time --max-depth=1 . |sort -r -t $'\t' -k 2 Linux查看文件夹大小,并按文件夹创建时间排序

    目录和文件 按创建时间排序 # du -h --time --max-depth=1 . |sort -r -t $'\t' -k 230M 2020-04-01 14:54 .28K 2020-04 ...

  2. Linux中ls对文件进行按大小排序和按时间排序,设置ls时间格式

    1 按文件大小排序 使用 ll -S | grep '^[^d]' // 格式化文件大小形式 ll -Sh | grep '^[^d]' 2 按文件修改时间排序显示 使用 ll -rt 3 设置ls ...

  3. "《算法导论》之‘排序’":线性时间排序

    本文参考自一博文与<算法导论>. <算法导论>之前介绍了合并排序.堆排序和快速排序的特点及运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O( ...

  4. git branch 分支创建时间排序

    git branch日期排序 vi ~/.gitconfig [alias]lb = !"for k in `git branch -a|perl -pe s/^..//`;do echo ...

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

    今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: SELECT * FROM  Stude ...

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

    文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表   首先,ls --help查看ls相关的与时间排序相关的参数:   > ...

  7. Java汉字排序(2)按拼音排序

    对于包含汉字的字符串来说,排序的方式主要有两种:一种是拼音,一种是笔画. 本文就讲述如何实现按拼音排序的比较器(Comparator). 作者:Jeff 发表于:2007年12月21日 11:27 最 ...

  8. LINUX的文件按时间排序

    转载 2014年12月29日 00:49:23 20298 > ls -alt # 按修改时间排序 > ls --sort=time -la # 等价于> ls -alt > ...

  9. 【linux】的文件按时间排序

    > ls -alt # 按修改时间排序 > ls --sort=time -la # 等价于> ls -alt > ls -alc # 按创建时间排序 > ls -alu ...

随机推荐

  1. python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03

    目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...

  2. Python验证码登录(Tesseract安装配置)

    1.安装py库:pytesseract,PIL pip install pytesseract pip install PILLOW 如果安装时,出现权限不足: pip install --user ...

  3. Python爬虫 Selenium与PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Sele ...

  4. vue路由(基于VScode开发)

    index.js如果在router目录下,代表这个js文件只是路由使用 main.js中为全局,需要引入使用到的组件,一般vue中不用写东西vue中el挂载哪个就哪个组件为根目录,传值数据绑定的时候在 ...

  5. mysql 5.7.24 root密码重置

    sudo mysql -u root -p 初始root密码没有,直接按回车 show databases: use mysql; update user set authentication_str ...

  6. Golang中的匿名函数(闭包)

    GO语言的匿名函数就是闭包,以下是<GO语言编程>中对闭包的解释 基本概念闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代 ...

  7. Hive Server2(五)

    HiveServer2 基本概念介绍 1.HiveServer2基本介绍 HiveServer2 (HS2) is a server interface that enables remote cli ...

  8. ImportError: attempted relative import with no known parent package

    或者检查所导包是否存在__init__.py文件,没有则添加上即可使当前文件夹变为包.

  9. Iview 在Table组件中添加图片

    要先简单了解render函数的使用. 直接上代码: { title: "商品图片", key: "commodityPhoto", align: 'center ...

  10. grunt的安装及使用

    windows下安装grunt需要先安装ruby和nodejsruby -v 测试ruby是否安装成功node -v 测试nodejs是否安装成功npm -v 测试npm是否安装成功(npm是node ...