本文摘自PHP中文网,作者藏色散人,侵删。
下面由Redis教程栏目给大家介绍关于java基于redis有序集合实现排行榜,希望对需要的朋友有所帮助!
前言
排行榜作为互联网应用中几乎必不可少的一个元素,能勾起人类自身对比的欲望,某宝中的商品销量排行,店铺信誉排行等,实现排行榜的方式也有很多种,可以使用快速排序算法 + 实现Comparator接口实现按某项权重排序,现在很多公司都在使用redis这个nosql数据库实现排行榜的功能
基于redis实现排行榜
现在要做的是对公司进行排行,排行的标准是用户对公司的搜索次数,做一个前十公司的排行榜
1.相关的redis知识
与排行榜功能实现相关的redis数据结构是sort set(有序集合)
关于sort set
我们知道set是一种集合,集合有一个特点就是无重复元素,sort set除了无重复元素外,还有一个特点就是有序性。
数据结构组成:
- key:sort set 的唯一标识
- 权重:也叫分数(score)redis通过权重为集合中的元素进行升序排序(默认),权重可以重复
- value:集合元素,元素不可重复
1 | String(set key),double(权重),String(value)
|
sort set是通过哈希表实现的,所以添加,函数,查找的时间复杂度都是O(1),每个集合可以存储40多亿个元素
基本命令
向集合中添加一个或多个元素
1 | ZADD "KEY" SCORE "VALUE" [ SCORE "VALUE" ]
|
效果:
1 | MyRedis:0>ZADD test 1 "one" "1" MyRedis:0>zadd test 4 "four" 5 "five" "2"
|
获取集合的元素数量
效果
获取指定元素分数(权重)
效果
1 | MyRedis:0>ZSCORE "test" "one" "2"
|
指定集合的指定元素增加指定分数
1 | ZINCRBY "key" score "value"
|
效果:
1 | MyRedis:0>ZSCORE "test" "one" "2" MyRedis:0>ZINCRBY "test" 1 "one" "3" MyRedis:0>ZSCORE "test" "one" "3"
|
获取指定范围的元素(默认按照分数|权重的升序排列)
效果
1 2 3 | MyRedis:0>ZRANGE "test" 0 1
1) "two"
2) "one"
|
完成这个需求大概需要这么多命令,接下来开始实现我们的这个需求
2.springboot + redis实现
导入redis依赖
1 2 3 4 | <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
|
编写工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public boolean sortSetAdd(String key,double score,String value){
try {
return redisTemplate.opsForZSet().add(key,value,score);
} catch (Exception e){
e.printStackTrace();
return false;
}
}
public double sortSetZincrby(String key,String value,double i){
try {
return redisTemplate.opsForZSet().incrementScore(key, value, i);
} catch (Exception e){
e.printStackTrace();
return -1;
}
}
public Set sortSetRange(String key,int start,int end ){
try {
return redisTemplate.opsForZSet().reverseRange(key, start, end );
} catch (Exception e){
e.printStackTrace();
return null;
}
}
|
业务实现:
阅读剩余部分
相关阅读 >>
关于redis数据库数量配置、切换及指定数据库
redis的数据结构的使用场景介绍
redis分布式锁实现原理是什么
连接redis需要密码吗
redis删除策略和逐出策略
redis锁的简单应用介绍
redis注册成window服务的方法介绍
redis是线程安全的吗
为什么redis是单线程,为什么这么快?
redis可以采用什么方式实现限流
更多相关阅读请进入《Java》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 关于java基于redis有序集合实现排行榜