實時排行榜
環境:SpringBoot2.0
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
實例
/**
* 排行榜的KEY
*/
public String KEY_DD="test:countMoney";
public String KEY_DD1="countMoney1";
public String KEY_DD2="countMoney2";
public String KEY_DD3="countMoney3";
/**
* 初始數據
*/
public void init() {
ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
Set<ZSetOperations.TypedTuple<User>> users = new HashSet<>();
for (int i = 0; i < 50; i++) {
//爲用戶初始化數據
User user = new User(i, "sjy" + i, "https://www.baidu.com?" + i);
users1.add(user);
DefaultTypedTuple<User> tuple = new DefaultTypedTuple<User>( user, 0d);
users.add(tuple);
}
// 批量新增
zSet.add(KEY_DD, users);
}
/**
* 隨機人隨機加分
*/
public void addSource() {
Random random = new Random();
for (int j = 0; j < 100; j++) {
int i = random.nextInt(50);
ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
int i1 = new Random().nextInt(6);
// 加法運算 i1是正增量
zSet.incrementScore(KEY_DD,users1.get(i),i1 );
//更新 替換
//zSet.add(KEY_DD,users1.get(i),i1 );
}
}
/**
* 查詢集合中所有的成員
*/
public Set<User> all(){
ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
return zSet.reverseRange(KEY_DD, 0, -1);
}
/**
* 查看前十名
*/
public Set<ZSetOperations.TypedTuple<User>> top10(){
ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
// 獲取分數前十名的用戶
Set<User> userSet = zSet.reverseRange(KEY_DD, 0, 9);
assert userSet != null;
System.out.println(userSet.size());
for (Serializable serializable : userSet) {
System.out.print(serializable.toString()+", ");
}
// 獲取分數前十名的用戶以及對應的分數
Set<ZSetOperations.TypedTuple<User>> scores = zSet.reverseRangeWithScores(KEY_DD, 0, 10);
System.out.println();
assert scores != null;
System.out.println(scores.size());
for (ZSetOperations.TypedTuple<User> score : scores) {
System.out.print(score.getValue()+" : "+(score.getScore().intValue())+", ");
}
return scores;
}
/**
* 分數之間的用戶人數
*/
public void limitNum1toNum2Count(){
Long count = redisTemplate.opsForZSet().count(KEY_DD, 0, 10);
}
public void intersectAndStore(){
// KEY_DD1集合與KEY_DD2集合,共同的交集元素存到KEY_DD3(複製),返回元素個數
redisTemplate.opsForZSet().intersectAndStore(KEY_DD1,KEY_DD2,KEY_DD3);
// KEY_DD1集合與KEY_DD2集合,共同的並集元素存到KEY_DD3(複製),返回元素個數
redisTemplate.opsForZSet().unionAndStore(KEY_DD1,KEY_DD2,KEY_DD3);
}
/**
* 刪除集合中的元素
*/
public void remove(){
//刪除集合
redisTemplate.opsForZSet().remove(KEY_DD,users1.get(0));
//刪除數組中0<=~<=2索引的元素 數據是倒敘的所以刪除的是最小的三個值
//redisTemplate.opsForZSet().removeRange(KEY_DD,0,2);
// 刪除集合中分數是0<=~<=10的元素
// redisTemplate.opsForZSet().removeRangeByScore(KEY_DD, 0, 9);
}
}
class User implements Serializable {
private static final long serialVersionUID=0L;
private Integer id; //id
private String name; //姓名
private String url; //地址
public User() {
}
public User(Integer id, String name, String url) {
this.id = id;
this.name = name;
this.url = url;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
總結
1. 添加
//添加
Boolean add(K var1, V var2, double var3);
//批量添加
Long add(K var1, Set<ZSetOperations.TypedTuple<V>> var2);
2. 刪除
//刪除
Long remove(K var1, Object... var2);
3. 運算
//加減運算 var3是增量
Double incrementScore(K var1, V var2, double var3);
4. 檢索
//返回元素在集合的排名,有序集合時按照元素的score值由小到大排列
Long rank(K var1, Object var2);
//返回元素在集合的排名,按元素的score值由大到小排列
Long reverseRank(K var1, Object var2);
//獲取集合的元素, 從小到大排序, start開始位置, end結束位置
Set<V> range(K var1, long var2, long var4);
//獲取集合元素, 並且把score值也獲取,
Set<ZSetOperations.TypedTuple<V>> rangeWithScores(K var1, long var2, long var4);
//根據Score值查詢集合元素的值, 從小到大排序
Set<V> rangeByScore(K var1, double var2, double var4);
//根據Score值查詢集合元素, 從小到大排序
Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K var1, double var2, double var4);
//根據Score值查詢集合元素的值, 從小到大排序
Set<V> rangeByScore(K var1, double var2, double var4, long var6, long var8);
//根據Score值查詢集合元素, 從小到大排序
Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K var1, double var2, double var4, long var6, long var8);
Set<V> reverseRange(K var1, long var2, long var4);
Set<ZSetOperations.TypedTuple<V>> reverseRangeWithScores(K var1, long var2, long var4);
// 根據Score值查詢集合元素, 從大到小排序
Set<V> reverseRangeByScore(K var1, double var2, double var4);
// 根據Score值查詢集合元素,並且把score值也獲取 從大到小排序
Set<ZSetOperations.TypedTuple<V>> reverseRangeByScoreWithScores(K var1, double var2, double var4);
//據score值獲取集合元素數量
Long count(K var1, double var2, double var4);
//獲取集合大小
Long size(K var1);
//獲取集合大小
Long zCard(K var1);
//獲取集合中value元素的score值
Double score(K var1, Object var2);
//移除指定索引位置的成員
Long removeRange(K var1, long var2, long var4);
//根據指定的score值的範圍來移除成員
Long removeRangeByScore(K var1, double var2, double var4);
//獲取var1和var2的並集並存儲在var3中
Long unionAndStore(K var1, K var2, K var3);
// KEY_DD1集合與KEY_DD2集合,共同的交集元素存到KEY_DD3(複製),返回元素個數
Long intersectAndStore(K var1, K var2, K var3);