1. /**
  2. * SortedSet(有序集合)
  3. * ZADD,ZCARD,ZCOUNT,ZINCRBY,ZRANGE,ZRANGEBYSCORE,ZRANK,ZREM,ZREMRANGEBYRANK,ZREMRANGEBYSCORE,ZREVRANGE
  4. * ZREVRANGEBYSCORE,ZREVRANK,ZSCORE,ZUNIONSTORE,ZINTERSTORE,ZSCAN,ZRANGEBYLEX,ZLEXCOUNT,ZREMRANGEBYLEX
  5. */
  6. public class SortedSetTypeTest {
  7.  
  8. private Jedis jedis;
  9.  
  10. private static final String KEY = "sorted_set";
  11.  
  12. private static final String VALUE = "layman";
  13.  
  14. @Before
  15. public void setUp() {
  16. this.jedis = new Jedis(new JedisShardInfo("192.168.133.188", 6379));
  17. }
  18.  
  19. /**
  20. * ZADD key score member [[score member] [score member] ...]
  21. * 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
  22. * 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
  23. * score 值可以是整数值或双精度浮点数。
  24. * 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
  25. * 当 key 存在但不是有序集类型时,返回一个错误。
  26. */
  27. @Test
  28. public void ZADD() {
  29. Map<String, Double> sourceMember = new HashMap<String, Double>();
  30. for (int i = 0; i < 3; i++) {
  31. double score = getRandomInt();
  32. sourceMember.put(VALUE + score, score);
  33. }
  34. jedis.zadd(KEY, sourceMember);
  35. ZRANGE();
  36. }
  37.  
  38. /**
  39. * ZCARD key
  40. * 返回有序集 key 的基数。
  41. */
  42. @Test
  43. public void ZCARD() {
  44. System.out.println(jedis.zcard(KEY));
  45. }
  46.  
  47. /**
  48. * ZCOUNT key min max
  49. * 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
  50. * 关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。
  51. */
  52. @Test
  53. public void ZCOUNT() {
  54. System.out.println(jedis.zcount(KEY, "-inf", "+inf"));
  55. System.out.println(jedis.zcount(KEY, 24, 45));
  56. }
  57.  
  58. /**
  59. * ZINCRBY key increment member
  60. * 为有序集 key 的成员 member 的 score 值加上增量 increment 。
  61. * 可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
  62. * 当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
  63. * 当 key 不是有序集类型时,返回一个错误。
  64. * score 值可以是整数值或双精度浮点数。
  65. */
  66. @Test
  67. public void ZINCRBY() {
  68. ZRANGE();
  69. // jedis.zincrby(KEY, getRandomInt(), VALUE + 10);
  70. // ZRANGE();
  71. jedis.zincrby(KEY, 20, VALUE + 10);
  72. ZRANGE();
  73.  
  74. }
  75.  
  76. /**
  77. * ZRANGE key start stop [WITHSCORES]
  78. * 返回有序集 key 中,指定区间内的成员。
  79. * 其中成员的位置按 score 值递增(从小到大)来排序。
  80. * 具有相同 score 值的成员按字典序(lexicographical order )来排列。
  81. * 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
  82. * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
  83. * 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  84. * 超出范围的下标并不会引起错误。
  85. * 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
  86. * 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
  87. * 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
  88. * 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
  89. * <p/>
  90. * ZREVRANGE key start stop [WITHSCORES]
  91. * 返回有序集 key 中,指定区间内的成员。
  92. * 其中成员的位置按 score 值递减(从大到小)来排列。
  93. * 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
  94. * 除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
  95. */
  96. @Test
  97. public void ZRANGE() {
  98. // System.out.println(jedis.zrange(KEY, 0, -1));
  99. Set<Tuple> tuples = jedis.zrangeWithScores(KEY, 0, -1);
  100. for (Tuple tuple : tuples) {
  101. System.out.println(tuple.getElement() + ":" + tuple.getScore());
  102. }
  103. }
  104.  
  105. /**
  106. * ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
  107. * 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
  108. * 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
  109. * 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
  110. * 可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
  111. * 该选项自 Redis 2.0 版本起可用。
  112. * 区间及无限
  113. * min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
  114. * 默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
  115. * <p/>
  116. * ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  117. * 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
  118. * 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。
  119. * 除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
  120. */
  121. @Test
  122. public void ZRANGEBYSCORE() {
  123. System.out.println(jedis.zrangeByScore(KEY, 0, 100));
  124. System.out.println(jedis.zrangeByScore(KEY, 0, 100, 8, 15));
  125. System.out.println(jedis.zrangeByScore(KEY, "-inf", "+inf"));
  126. System.out.println(jedis.zrangeByScore(KEY, "-inf", "+inf", 8, 1));
  127. Set<Tuple> tuples = jedis.zrangeByScoreWithScores(KEY, "-inf", "+inf", 8, 1);
  128. for (Tuple tuple : tuples) {
  129. System.out.println(tuple.getElement() + "=" + tuple.getScore());
  130. }
  131. }
  132.  
  133. /**
  134. * ZRANK key member
  135. * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
  136. * 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
  137. * 使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
  138. * <p/>
  139. * ZREVRANK key member
  140. * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
  141. * 排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
  142. * 使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。
  143. */
  144. @Test
  145. public void ZRANK() {
  146. System.out.println(jedis.zrank(KEY, "layman56.0"));
  147. }
  148.  
  149. /**
  150. * ZREM key member [member ...]
  151. * 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
  152. * 当 key 存在但不是有序集类型时,返回一个错误。
  153. */
  154. @Test
  155. public void ZREM() {
  156. ZRANGE();
  157. jedis.zrem(KEY, "layman72.0", "layman77.0");
  158. System.out.println("######################");
  159. ZRANGE();
  160. }
  161.  
  162. /**
  163. * ZREMRANGEBYRANK key start stop
  164. * 移除有序集 key 中,指定排名(rank)区间内的所有成员。
  165. * 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
  166. * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
  167. * 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  168. */
  169. @Test
  170. public void ZREMRANGEBYRANK() {
  171. ZRANGE();
  172. jedis.zremrangeByRank(KEY, 0, 1);
  173. System.out.println("##################");
  174. ZRANGE();
  175. }
  176.  
  177. /**
  178. * ZREMRANGEBYSCORE key min max
  179. * 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
  180. * 自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。
  181. */
  182. @Test
  183. public void ZREMRANGEBYSCORE() {
  184. ZRANGE();
  185. jedis.zremrangeByScore(KEY, "53", "63");//删除53<score<63
  186. System.out.println("#####################");
  187. ZRANGE();
  188. }
  189.  
  190. /**
  191. * ZSCORE key member
  192. * 返回有序集 key 中,成员 member 的 score 值。
  193. * 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
  194. */
  195. @Test
  196. public void ZSCORE() {
  197. System.out.println(jedis.zscore(KEY, "layman84.0"));
  198. }
  199.  
  200. /**
  201. * ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
  202. * 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
  203. * 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
  204. * WEIGHTS
  205. * 使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),
  206. * 每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。
  207. * 如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
  208. * AGGREGATE
  209. * 使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
  210. * 默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,
  211. * 可以将所有集合中某个成员的最小score值作为结果集中该成员的score值;而参数MAX则是将所有集合中某个成员的最大score值作为结果集中该成员的score值。
  212. */
  213. @Test
  214. public void ZUNIONSTORE() {
  215. ZADDForKey(KEY + 0);
  216. ZRANGE();
  217. System.out.println("###############################");
  218. System.out.println(jedis.zrange(KEY + 0, 0, -1));
  219. ZParams zParams = new ZParams();
  220. zParams.aggregate(ZParams.Aggregate.MAX);
  221. // zParams.weightsByDouble(1);
  222. jedis.zunionstore(KEY, zParams, KEY, KEY + 0);
  223. System.out.println("###############################");
  224. System.out.println(jedis.zrange(KEY, 0, -1));
  225. }
  226.  
  227. /**
  228. * ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
  229. * 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
  230. * 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
  231. * 关于 WEIGHTS 和 AGGREGATE 选项的描述,参见 ZUNIONSTORE 命令。
  232. */
  233. @Test
  234. public void ZINTERSTORE() {
  235. System.out.println(jedis.zrange(KEY, 0, -1));
  236. System.out.println("###############################");
  237. ZParams zParams = new ZParams();
  238. zParams.aggregate(ZParams.Aggregate.MIN);
  239. // zParams.weightsByDouble(1d);
  240. System.out.println(jedis.zrange(KEY + 0, 0, -1));
  241. jedis.zinterstore(KEY, zParams, KEY, KEY + 0);
  242. System.out.println("###############################");
  243. System.out.println(jedis.zrange(KEY, 0, -1));
  244. }
  245.  
  246. /**
  247. * ZRANGEBYLEX key min max [LIMIT offset count]
  248. * 当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
  249. * 而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员。
  250. * 如果有序集合里面的成员带有不同的分值, 那么命令返回的结果是未指定的(unspecified)。
  251. * 命令会使用 C 语言的 memcmp() 函数, 对集合中的每个成员进行逐个字节的对比(byte-by-byte compare), 并按照从低到高的顺序, 返回排序后的集合成员。
  252. * 如果两个字符串有一部分内容是相同的话, 那么命令会认为较长的字符串比较短的字符串要大。
  253. * 可选的 LIMIT offset count 参数用于获取指定范围内的匹配元素 (就像 SQL 中的 SELECT LIMIT offset count 语句)。 需要注意的一点是,
  254. * 如果 offset 参数的值非常大的话, 那么命令在返回结果之前, 需要先遍历至 offset 所指定的位置, 这个操作会为命令加上最多 O(N) 复杂度。
  255. * 如何指定范围区间
  256. * 合法的 min 和 max 参数必须包含 ( 或者 [ , 其中 ( 表示开区间(指定的值不会被包含在范围之内), 而 [ 则表示闭区间(指定的值会被包含在范围之内)。
  257. * 特殊值 + 和 - 在 min 参数以及 max 参数中具有特殊的意义, 其中 + 表示正无限, 而 - 表示负无限。 因此, 向一个所有成员的分值都相同的有序集合发送命令
  258. * ZRANGEBYLEX <zset> - + , 命令将返回有序集合中的所有元素。
  259. */
  260. @Test
  261. public void ZRANGEBYLEX() {
  262. /**
  263. *
  264. redis> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
  265. (integer) 7
  266. redis> ZRANGEBYLEX myzset - [c
  267. 1) "a"
  268. 2) "b"
  269. 3) "c"
  270.  
  271. redis> ZRANGEBYLEX myzset - (c
  272. 1) "a"
  273. 2) "b"
  274.  
  275. redis> ZRANGEBYLEX myzset [aaa (g
  276. 1) "b"
  277. 2) "c"
  278. 3) "d"
  279. 4) "e"
  280. 5) "f"
  281. */
  282. ZRANGE();
  283. System.out.println(jedis.zrangeByLex(KEY, "-", "+"));
  284. System.out.println(jedis.zrangeByLex(KEY, "-", "+", 1, 2));
  285. }
  286.  
  287. /**
  288. * ZLEXCOUNT key min max
  289. * 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会返回该集合中, 成员介于 min 和 max 范围内的元素数量。
  290. * 这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义一样。
  291. */
  292. @Test
  293. public void ZLEXCOUNT() {
  294. System.out.println(jedis.zlexcount(KEY, "-", "+"));
  295. }
  296.  
  297. /**
  298. * ZREMRANGEBYLEX key min max
  299. * 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。
  300. * 这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义一样。
  301. */
  302. @Test
  303. public void ZREMRANGEBYLEX() {
  304. ZRANGE();
  305. jedis.zremrangeByLex(KEY, "-", "+");
  306. System.out.println("#################");
  307. ZRANGE();
  308. }
  309.  
  310. private int getRandomInt() {
  311. return new Random().nextInt(100);
  312. }
  313.  
  314. private void ZADDForKey(String key) {
  315. if (StringUtils.isEmpty(key)) {
  316. key = KEY;
  317. }
  318. Map<String, Double> sourceMember = new HashMap<String, Double>();
  319. for (int i = 0; i < 3; i++) {
  320. double score = getRandomInt();
  321. sourceMember.put(VALUE + score, score);
  322. }
  323. jedis.zadd(key, sourceMember);
  324. }
  325. }

Jedis操作Redis--SortedSet类型的更多相关文章

  1. Jedis操作Redis技巧详解

    对于Redis的部署模式有两种,单机模式 和 集群模式.因此,本文的介绍也从这两个方面进行介绍.众所周知,Jedis是最著名的Redis java客户端操作类库,几乎支持所有的Redis操作.本文就是 ...

  2. Java中Jedis操作Redis与Spring的整合

    Redis是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop. ...

  3. Redis入门和Java利用jedis操作redis

    Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...

  4. Jedis操作Redis数据库

    添加Maven依赖: <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</grou ...

  5. Jedis操作Redis

    Jedis操作Redis的常用封装方法 @Resource(name="jedispool") private JedisPool pool=null; /** * 设置缓存对象过 ...

  6. 四、Jedis操作Redis

    前言:  原来我们操作mysql需要用的jdbc,现在操作redis则需要jedis,jedis是客户端,而redis是服务器,使用jedis客户端来操作redis. 在这里要使用jedis操作red ...

  7. JAVA中通过Jedis操作Redis连接与插入简单库

    一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...

  8. jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

  9. Java中使用Jedis操作Redis(转载)

    整理 1.字符串 添加:set keyname value 查询:get keyname 拼接:append keyname value 删除:del keyname 添加多个: mset keyna ...

  10. jedis操作redis全指南

    package com.wujintao.redis; import java.util.Date; import java.util.HashMap; import java.util.Iterat ...

随机推荐

  1. helm安装MINIO文件服务器

    MinIO Quickstart Guide MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例 ...

  2. [填坑] ubuntu检测不到外接显示器

    笔记本是win10+ubuntu18双系统,今天ubuntu(开启nivida独显状态)突然无法连外接屏幕,但切换win10就可以显示. 贴吧找到的简单解决方法,不需要重装驱动,记录分享在这里: su ...

  3. TreeSet类的排序

    TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系, ...

  4. Hack The Box Web Pentest 2019

    [20 Points] Emdee five for life [by L4mpje] 问题描述: Can you encrypt fast enough? 初始页面,不管怎么样点击Submit都会显 ...

  5. 常用GDB命令行调试命令

    po po是print-object的简写,可用来打印所有NSObject对象.使用举例如下: (gdb) po self <LauncherViewController: 0x552c570& ...

  6. hdoj 3555 BOMB(数位dp)

    //hdoj 3555 //2013-06-27-16.53 #include <stdio.h> #include <string.h> __int64 dp[21][3], ...

  7. powermockito单元测试之深入实践

    概述 由于最近工作需要, 在项目中要做单元测试, 以达到指定的测试用例覆盖率指标.项目中我们引入的powermockito来编写测试用例, JaCoCo来监控单元测试覆盖率.关于框架的选择, 网上讨论 ...

  8. jQuery插件之路(一)——试着给jQuery的一个Carousel插件添加新的功能

    前几日在网上看到了一个关于Carousel插件的教学视频,于是也顺便跟着学习着做了一下.但是在做完之后发现,在别的网站上面看到类似的效果要比现在做的这个要多一个功能,也就是在底下会有一些按钮,当鼠标放 ...

  9. DMP大数据营销

    一.下载大数据营销APP 使用手机浏览器扫描二维码 二.使用大数据营销APP 1.打开app,如果手机没有打开蓝牙和GPS定位app会自动提示让您打开,若app没有提示请手动去打开蓝牙和GPS 2.搜 ...

  10. Sqlserver 查询分组 记录

    select b.* from (select a.*,row_number() over (partition by 列1 order by 列2 desc) rn from a) b ; --如需 ...