RedisTemplate zSet的使用, 根据点赞排序,和创建时间排序2种方式
2017-08-01 17:48
489 查看
使用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根据问题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); }
相关文章推荐
- Spring RedisTemplate 批量获取值的2种方式
- redis使用(三):事务,过期时间,排序,订阅/发布,持久化
- RedisTemplate的使用说明(序列化以及事物)
- java根据时间排序list,使用collections.sort()
- Springboot使用RedisTemplate基本步骤
- js中使用new Date(str)创建时间对象不兼容firefox和ie的解决方式
- python 根据文件创建时间排序
- List排序问题:根据list对象的创建时间排序,后用lambda表达式
- 在ssm项目中使用redisTemplate
- spring整合redis以及使用RedisTemplate的方法
- 使用RedisTemplate 存储键值出现乱码
- RedisTemplate 使用
- 创建索引时应该考虑该列使用时最可能的排序方式
- RedisTemplate的简单使用
- Spring集成Redis使用RedisTemplate
- 在TFileListBox的子类里重写ReadFileNames那个虚方法(见filectrl.pas),根据文件创建时间进行排序。
- java根据时间排序list,使用collections.sort()
- spring-data-redis使用RedisTemplate模板存储时键值与预设不一致的解决方法
- C#中使用快速排序按文件创建时间将文件排序的源码
- 使用RedisTemplate的操作类访问Redis(转)