Jedis里SortedSet相关操作

Jedis里SortedSet相关操作Jedis 里的 SortedSet 可以理解为有序集合或者优先队列 每个 key 都是有分值的 所以可以应用于排行榜或者某个用户的成就值成就排名之类的关于分值排行相关当然 index 也都是从 0 开始的 1 结尾的 有双向性 默认排名是从小到大 Jedisjedis newJedis jedis flushAll 清空 SortedSet 有序集合 优先队

Jedis里的SortedSet 可以理解为有序集合或者优先队列,每个key都是有分值的,所以可以应用于排行榜或者某个用户的成就值 成就排名之类的关于分值排行相关

当然index也都是从0开始的,-1结尾的,有双向性,默认排名是从小到大

Jedis jedis=new Jedis(); jedis.flushAll();//清空 /* * SortedSet有序集合(优先队列) * 每个key有分值的 * 应用:排行榜 */ String rankKey="rankKey"; jedis.zadd(rankKey, 15,"jim"); jedis.zadd(rankKey, 35,"ben"); jedis.zadd(rankKey, 85,"candy"); jedis.zadd(rankKey, 75,"david"); jedis.zadd(rankKey, 95,"mei"); print(30,jedis.zcard(rankKey));//有多少kv对 print(31,jedis.zcount(rankKey,61,100));//在61到100分值的有几人 print(32,jedis.zscore(rankKey, "candy"));//查找某个用户的分值 jedis.zincrby(rankKey, 10, "ben");//对某个人提分 print(33,jedis.zscore(rankKey, "ben")); jedis.zincrby(rankKey, 5, "lucy");//不存在某个人 对他提分 则新加入其中 print(34,jedis.zcount(rankKey,0,100)); print(35,jedis.zrange(rankKey, 0, 2));//排名前3位的 (默认从小到大) index从0开始 print(36,jedis.zrevrange(rankKey, 0, 2));//排名前3位的 (从大到小) //tuple可以理解为元组 里面有equals compareto等方法 for(Tuple tuple:jedis.zrangeByScoreWithScores(rankKey, 0, 100)){ print(37,tuple.getElement()+":"+String.valueOf(tuple.getScore())); } print(38,jedis.zrank(rankKey, "ben"));//ben排名第几 排名从0开始 比如:成就值排名* print(39,jedis.zrevrank(rankKey, "ben"));//

30, 5 31, 3 32, 85.0 33, 45.0 34, 6 35, [lucy, jim, ben] 36, [mei, candy, david] 37, lucy:5.0 37, jim:15.0 37, ben:45.0 37, david:75.0 37, candy:85.0 37, mei:95.0 38, 2 39, 3 

具体方法:

/ * SortedSet(有序集合) * ZADD,ZCARD,ZCOUNT,ZINCRBY,ZRANGE,ZRANGEBYSCORE,ZRANK,ZREM,ZREMRANGEBYRANK,ZREMRANGEBYSCORE,ZREVRANGE * ZREVRANGEBYSCORE,ZREVRANK,ZSCORE,ZUNIONSTORE,ZINTERSTORE,ZSCAN,ZRANGEBYLEX,ZLEXCOUNT,ZREMRANGEBYLEX */ public class SortedSetTypeTest { private Jedis jedis; private static final String KEY = "sorted_set"; private static final String VALUE = "layman"; @Before public void setUp() { this.jedis = new Jedis(new JedisShardInfo("192.168.133.188", 6379)); } / * ZADD key score member [[score member] [score member] ...] * 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 * 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。 * score 值可以是整数值或双精度浮点数。 * 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。 * 当 key 存在但不是有序集类型时,返回一个错误。 */ @Test public void ZADD() { Map 
     
       sourceMember = new HashMap 
      
        (); for (int i = 0; i < 3; i++) { double score = getRandomInt(); sourceMember.put(VALUE + score, score); } jedis.zadd(KEY, sourceMember); ZRANGE(); } / * ZCARD key * 返回有序集 key 的基数。 */ @Test public void ZCARD() { System.out.println(jedis.zcard(KEY)); } / * ZCOUNT key min max * 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 * 关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。 */ @Test public void ZCOUNT() { System.out.println(jedis.zcount(KEY, "-inf", "+inf")); System.out.println(jedis.zcount(KEY, 24, 45)); } / * ZINCRBY key increment member * 为有序集 key 的成员 member 的 score 值加上增量 increment 。 * 可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。 * 当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。 * 当 key 不是有序集类型时,返回一个错误。 * score 值可以是整数值或双精度浮点数。 */ @Test public void ZINCRBY() { ZRANGE(); // jedis.zincrby(KEY, getRandomInt(), VALUE + 10); // ZRANGE(); jedis.zincrby(KEY, 20, VALUE + 10); ZRANGE(); } / * ZRANGE key start stop [WITHSCORES] * 返回有序集 key 中,指定区间内的成员。 * 其中成员的位置按 score 值递增(从小到大)来排序。 * 具有相同 score 值的成员按字典序(lexicographical order )来排列。 * 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。 * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 * 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 * 超出范围的下标并不会引起错误。 * 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。 * 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。 * 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。 * 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。 * 
       

* ZREVRANGE key start stop [WITHSCORES] * 返回有序集 key 中,指定区间内的成员。 * 其中成员的位置按 score 值递减(从大到小)来排列。 * 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。 * 除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。 */ @Test public void ZRANGE() { // System.out.println(jedis.zrange(KEY, 0, -1)); Set tuples = jedis.zrangeWithScores(KEY, 0, -1); for (Tuple tuple : tuples) { System.out.println(tuple.getElement() + ":" + tuple.getScore()); } } / * ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] * 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 * 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。 * 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。 * 可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。 * 该选项自 Redis 2.0 版本起可用。 * 区间及无限 * min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。 * 默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。 *

* ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] * 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。 * 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。 * 除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。 */ @Test public void ZRANGEBYSCORE() { System.out.println(jedis.zrangeByScore(KEY, 0, 100)); System.out.println(jedis.zrangeByScore(KEY, 0, 100, 8, 15)); System.out.println(jedis.zrangeByScore(KEY, "-inf", "+inf")); System.out.println(jedis.zrangeByScore(KEY, "-inf", "+inf", 8, 1)); Set tuples = jedis.zrangeByScoreWithScores(KEY, "-inf", "+inf", 8, 1); for (Tuple tuple : tuples) { System.out.println(tuple.getElement() + "=" + tuple.getScore()); } } / * ZRANK key member * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。 * 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。 * 使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。 *

* ZREVRANK key member * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。 * 排名以 0 为底,也就是说, score 值最大的成员排名为 0 。 * 使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。 */ @Test public void ZRANK() { System.out.println(jedis.zrank(KEY, "layman56.0")); } / * ZREM key member [member ...] * 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。 * 当 key 存在但不是有序集类型时,返回一个错误。 */ @Test public void ZREM() { ZRANGE(); jedis.zrem(KEY, "layman72.0", "layman77.0"); System.out.println("#"); ZRANGE(); } / * ZREMRANGEBYRANK key start stop * 移除有序集 key 中,指定排名(rank)区间内的所有成员。 * 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。 * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 * 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 */ @Test public void ZREMRANGEBYRANK() { ZRANGE(); jedis.zremrangeByRank(KEY, 0, 1); System.out.println(""); ZRANGE(); } / * ZREMRANGEBYSCORE key min max * 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 * 自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。 */ @Test public void ZREMRANGEBYSCORE() { ZRANGE(); jedis.zremrangeByScore(KEY, "53", "63");//删除53 - + , 命令将返回有序集合中的所有元素。 */ @Test public void ZRANGEBYLEX() { / * redis> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g (integer) 7 redis> ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" redis> ZRANGEBYLEX myzset - (c 1) "a" 2) "b" redis> ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" */ ZRANGE(); System.out.println(jedis.zrangeByLex(KEY, "-", "+")); System.out.println(jedis.zrangeByLex(KEY, "-", "+", 1, 2)); } / * ZLEXCOUNT key min max * 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会返回该集合中, 成员介于 min 和 max 范围内的元素数量。 * 这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义一样。 */ @Test public void ZLEXCOUNT() { System.out.println(jedis.zlexcount(KEY, "-", "+")); } / * ZREMRANGEBYLEX key min max * 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。 * 这个命令的 min 参数和 max 参数的意义和 ZRANGEBYLEX 命令的 min 参数和 max 参数的意义一样。 */ @Test public void ZREMRANGEBYLEX() { ZRANGE(); jedis.zremrangeByLex(KEY, "-", "+"); System.out.println(""); ZRANGE(); } private int getRandomInt() { return new Random().nextInt(100); } private void ZADDForKey(String key) { if (StringUtils.isEmpty(key)) { key = KEY; } Map sourceMember = new HashMap (); for (int i = 0; i < 3; i++) { double score = getRandomInt(); sourceMember.put(VALUE + score, score); } jedis.zadd(key, sourceMember); } }










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177677.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:57
下一篇 2026年3月26日 下午6:58


相关推荐

  • rst markdown_r语言markdown导出

    rst markdown_r语言markdown导出markdown文件转RST文件时遇到的一些问题最近需要把一些markdown文件转成RST文件,第一次接触RST文件,使用中会有一些语法问题需要注意。在这里做个记录。转化工具我们可以先采用工具对整体做个初步的转换。因为转换工具不能做到完美转换,在初步转换完成后再根据实际的显示情况进行下一步的调整。这里推荐一个网站:MD在线转换成RST如果不注册的话,每天最多可以转化10个文件。后续调整转换后的大体格式是正确的,包括不同级别的标题,一些加粗斜体显示等,但是很多细节还是要自己调整的。1.网页链

    2022年9月30日
    7
  • C++ int转char_c语言中int转char

    C++ int转char_c语言中int转char文章目录1.通过ascii码:2.直接转换(更简单,推荐)1.通过ascii码:chara=’0′;intia=(int)a;/*notethattheintcastisnotnecessary–intia=awouldsuffice*/cout<<ia<<endl;结果如下:可以看出这种方法得到的其实是ch…

    2022年10月2日
    5
  • stringutils中的isempty和isblank_java stringbuilder和stringbuffer

    stringutils中的isempty和isblank_java stringbuilder和stringbuffer主要的区别在于“空格”判断isNotEmpty(”空格”)=>true isNotBlank(”空格”)=>falseisNotEmpty(str)等价于str!=null&&str.length>0isNotBlank(str)等价于str!=null&&str.length>0&am…

    2026年4月16日
    4
  • maven中的GroupID和ArtifactID怎么写

    maven中的GroupID和ArtifactID怎么写原文地址 http www cnblogs com panxuejun p 6184072 html 由于本人年纪大了 每次创建 maven 项目的时候总是纠结很久不知道怎么写 id 网上看了一篇文章还不错 推荐一下 groupId theuniqueide nbsp artifact

    2026年3月17日
    3
  • 配置windows怎么关闭计算机,准备配置WINDOWS,请勿关闭计算机。

    配置windows怎么关闭计算机,准备配置WINDOWS,请勿关闭计算机。图片发自简书App早上,想着在台式计算机机上面进行修改些文字,但是,开机后屏幕上一直就是打开电脑后的那一行字:准备配置WINDOWS,请勿关闭计算机。一直那样子。弄得,弄得我没有办法进入机内去修改了。这样,过于依赖的机器之后,有的时候也是一种很不好的事情。回想原来,笔墨时代,就会简单。过去时代,人们生活中依赖机器的事情,并不多,虽说“工欲善其事,必先利其器”,但是所谓的“器”,那时候,不外乎也是些…

    2022年6月26日
    35
  • 解决gitignore不起作用

    解决gitignore不起作用gitignore 中已经标明忽略的文件目录下的文件 gitpush 的时候还会出现在 push 的目录中 原因是因为在 git 忽略目录中 新建的文件在 git 中会有缓存 修改的文件已经被纳入了版本管理中 就算是在 gitignore 中声明了忽略路径也是不起作用的 这时候我们就应该先把本地缓存删除 然后再进行 git 的 push 这样就不会出现忽略的文件了 git 清除本地缓存命令如下 gitr

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号