当前位置:   article > 正文

Spring使用Redisson工具类操作ZSet集合(基础操作汇总)_redisson zset

redisson zset

手打不易,如果转摘,请注明出处!

注明原文:https://zhangxiaofan.blog.csdn.net/article/details/129625822


目录

前言

Redisson依赖

Redisson配置

Redisson ZSet工具类(基础操作)

总结


前言

Redisson其他工具类,像 String、Hash、Set 网上都有比较全的方法了,这里只列举 ZSet 数据类型的基本操作。

Redisson依赖

Spring工程先引入 redisson:

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson-spring-boot-starter</artifactId>
  4. <version>x.x.x</version>
  5. </dependency>

我这里使用的版本是:

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson-spring-boot-starter</artifactId>
  4. <version>3.17.1</version>
  5. </dependency>

Redisson配置

yaml配置,我这里用的本地单节点测试

  1. spring:
  2. redis:
  3. host: 127.0.0.1
  4. port: 6379
  5. password: 123456

RedissonClient Bean创建

  1. @Slf4j
  2. @Data
  3. @Configuration
  4. @ConfigurationProperties(prefix = "spring.redis")
  5. public class RedissonConfig {
  6. private String host;
  7. private String port;
  8. private String password;
  9. @Bean(destroyMethod = "shutdown")
  10. public RedissonClient redisson() {
  11. // 1、创建配置
  12. Config config = new Config();
  13. config.setCodec(new JsonJacksonCodec())
  14. .useSingleServer()
  15. .setAddress("redis://" + host + ":" + port)
  16. .setPassword(password);
  17. return Redisson.create(config);
  18. }
  19. }

Redisson ZSet工具类(基础操作)

  1. package redisson.utis;
  2. import org.redisson.api.RBatch;
  3. import org.redisson.api.RScoredSortedSet;
  4. import org.redisson.api.RedissonClient;
  5. import org.redisson.client.protocol.ScoredEntry;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Component;
  8. import java.time.Duration;
  9. import java.util.Collection;
  10. import java.util.HashSet;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.Set;
  14. @Component
  15. public class RedissonZSetService {
  16. @Autowired
  17. private RedissonClient client;
  18. public static final String DEFAULT_SCORE_KEY = "default";
  19. /**
  20. * 默认保存时间
  21. */
  22. private static final long DEFAULT_EXPIRE_TIME_SECONDS = 3600L;
  23. /**
  24. * 新增ZSet元素,存在则刷新
  25. *
  26. * @param refreshExpire 过期时间,不为null则重新赋值
  27. */
  28. public <T> void zscoreAddAsync(String key, double score, T member, Long refreshExpire) {
  29. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  30. if (null != refreshExpire) {
  31. scoredSortedSet.expire(Duration.ofSeconds(DEFAULT_EXPIRE_TIME_SECONDS));
  32. }
  33. scoredSortedSet.addAsync(score, member);
  34. }
  35. /**
  36. * 批量新增
  37. */
  38. public <T> void zScoreAddAsyncBatch(String key, Map<String, Double> map, long seconds) {
  39. if (seconds <= 0) {
  40. seconds = DEFAULT_EXPIRE_TIME_SECONDS;
  41. }
  42. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  43. // 只能针对 key 设置过期时间,zset 中的元素不能单独设置.
  44. scoredSortedSet.add(0, DEFAULT_SCORE_KEY);
  45. scoredSortedSet.expire(Duration.ofSeconds(seconds));
  46. RBatch batch = client.createBatch();
  47. map.forEach((member, score) -> {
  48. batch.getScoredSortedSet(key).addAsync(score, member);
  49. });
  50. batch.execute();
  51. }
  52. /**
  53. * 读取指定 key 下所有 member, 按照 score 升序(默认)
  54. */
  55. public Collection<Object> getZSetMembers(String key, int startIndex, int endIndex) {
  56. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  57. return scoredSortedSet.valueRange(startIndex, endIndex);
  58. }
  59. /**
  60. * 取指定 key 下所有 member, 按照 score 降序
  61. */
  62. public Collection<Object> getZSetMembersReversed(String key, int startIndex, int endIndex) {
  63. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  64. return scoredSortedSet.valueRangeReversed(startIndex, endIndex);
  65. }
  66. /**
  67. * 读取 member和score, 按照 score 升序(默认)
  68. */
  69. public Collection<ScoredEntry<Object>> getZSetEntryRange(String key, int startIndex, int endIndex) {
  70. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  71. return scoredSortedSet.entryRange(startIndex, endIndex);
  72. }
  73. /**
  74. * 读取 member和score, 按照 score 降序
  75. */
  76. public Collection<ScoredEntry<Object>> getZSetEntryRangeReversed(String key, int startIndex, int endIndex) {
  77. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  78. return scoredSortedSet.entryRangeReversed(startIndex, endIndex);
  79. }
  80. /**
  81. * 读取指定 key 下 member 的 score
  82. * 返回null 表示不存在
  83. */
  84. public Double getZSetMemberScore(String key, String member) {
  85. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  86. if (!scoredSortedSet.isExists()) {
  87. return null;
  88. }
  89. return scoredSortedSet.getScore(member);
  90. }
  91. /**
  92. * 读取指定 key 下 memberList 的 score
  93. * 返回null 表示不存在
  94. */
  95. public Double getZSetMemberScore(String key, List<String> memberList) {
  96. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  97. if (!scoredSortedSet.isExists()) {
  98. return null;
  99. }
  100. return scoredSortedSet.getScore(memberList);
  101. }
  102. /**
  103. * 读取指定 key 下 member 的 rank 排名(升序情况)
  104. * 返回null 表示不存在, 下标从0开始
  105. */
  106. public Integer getZSetMemberRank(String key, String member) {
  107. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  108. if (!scoredSortedSet.isExists()) {
  109. return null;
  110. }
  111. return scoredSortedSet.rank(member);
  112. }
  113. /**
  114. * 异步删除指定 ZSet 中的指定 memberName 元素
  115. */
  116. public void removeZSetMemberAsync(String key, String memberName) {
  117. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  118. if (!scoredSortedSet.isExists()) {
  119. return;
  120. }
  121. scoredSortedSet.removeAsync(memberName);
  122. }
  123. /**
  124. * 异步批量删除指定 ZSet 中的指定 member 元素列表
  125. */
  126. public void removeZSetMemberAsync(String key, List<String> memberList) {
  127. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  128. if (!scoredSortedSet.isExists()) {
  129. return;
  130. }
  131. RBatch batch = client.createBatch();
  132. memberList.forEach(member -> batch.getScoredSortedSet(key).removeAsync(member));
  133. batch.execute();
  134. }
  135. /**
  136. * 统计ZSet分数范围内元素总数. 区间包含分数本身
  137. * 注意这里不能用 -1 代替最大值
  138. */
  139. public int getZSetCountByScoresInclusive(String key, double startScore, double endScore) {
  140. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  141. if (!scoredSortedSet.isExists()) {
  142. return 0;
  143. }
  144. return scoredSortedSet.count(startScore, true, endScore, true);
  145. }
  146. /**
  147. * 返回ZSet分数范围内 member 列表. 区间包含分数本身.
  148. * 注意这里不能用 -1 代替最大值
  149. */
  150. public Collection<Object> getZSetMembersByScoresInclusive(String key, double startScore, double endScore) {
  151. RScoredSortedSet<Object> scoredSortedSet = client.getScoredSortedSet(key);
  152. if (!scoredSortedSet.isExists()) {
  153. return null;
  154. }
  155. return scoredSortedSet.valueRange(startScore, true, endScore, true);
  156. }
  157. /**
  158. * 获取所有的指定前缀 keys
  159. */
  160. public Set<String> getKeys(String prefix) {
  161. Iterable<String> keysByPattern = client.getKeys().getKeysByPattern(prefix);
  162. Set<String> keys = new HashSet<>();
  163. for (String s : keysByPattern) {
  164. keys.add(s);
  165. }
  166. return keys;
  167. }
  168. }

总结

1.ZSet是不能针对每个元素(member)做过期设置的,只能对整改key做过期时间设置。

2.ZSet针对带权重的排名、计分相关的操作,具有独特优势。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/649502
推荐阅读
相关标签
  

闽ICP备14008679号