edis - 五种数据类型与常用操作详解-2

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: edis - 五种数据类型与常用操作详解-2

edis - 五种数据类型与常用操作详解-1https://developer.aliyun.com/article/1390296

【6】Zset(sorted set)


Redis 的Zset和Set一样也是string类型元素的集合,且不允许重复的成员。


不同的是Zset的每个元素都会关联一个double类型的分数。


Redis正是通过分数来为集合中的成员进行从小到大的排序。


Zset的成员是唯一的,但是分数是可以重复的。


(1)ZADD key score member [[score member] [score member] …]


将一个或多个 member 元素及其 score 值加入到有序集 key 当中。


如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。


score 值可以是整数值或双精度浮点数。


如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。


当 key 存在但不是有序集类型时,返回一个错误。

实例如下:

127.0.0.1:6379> ZADD myzset 1.0 1 2.0 2
(integer) 2

(2)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 的格式表示。


客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。


实例如下:

127.0.0.1:6379> ZRANGE myzset 0 -1
1) "1"
2) "2"
127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "1"
2) "1"
3) "2"
4) "2"


(3)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 值一起返回。


区间及无限

min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。


默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。


举个例子:

ZRANGEBYSCORE zset (1 5


返回所有符合条件 1 < score <= 5 的成员,而

ZRANGEBYSCORE zset (5 (10

则返回所有符合条件 5 < score < 10 的成员。

实例如下:

redis> ZADD salary 2500 jack                        # 测试数据
(integer) 0
redis> ZADD salary 5000 tom
(integer) 0
redis> ZADD salary 12000 peter
(integer) 0
redis> ZRANGEBYSCORE salary -inf +inf               # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"
redis> ZRANGEBYSCORE salary -inf +inf WITHSCORES    # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"
redis> ZRANGEBYSCORE salary -inf 5000 WITHSCORES    # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"
redis> ZRANGEBYSCORE salary (5000 400000            # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"

(4)ZREM key member [member …]

移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

当 key 存在但不是有序集类型时,返回一个错误。

实例如下:

127.0.0.1:6379> ZRANGE myzset 0 -1
1) "1"
2) "2"
127.0.0.1:6379> ZREM myzset 1
(integer) 1
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "2"

(5)ZCARD key

返回有序集 key 的基数。


实例如下:

127.0.0.1:6379> ZCARD myzset
(integer) 1
127.0.0.1:6379> ZADD myzset 3.0 3 4.0 4
(integer) 2
127.0.0.1:6379> ZCARD myzset
(integer) 3

(6)ZCOUNT key min max

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。


实例如下:

127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "2"
2) "2"
3) "3"
4) "3"
5) "4"
6) "4"

(7)ZRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。


实例如下:

127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "2"
2) "2"
3) "3"
4) "3"
5) "4"
6) "4"
127.0.0.1:6379> ZRANK myzset 1
(nil)
127.0.0.1:6379> ZRANK myzset 2
(integer) 0
127.0.0.1:6379> ZRANK myzset 3
(integer) 1


(8)ZSCORE key member

返回有序集 key 中,成员 member 的 score 值。

如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。


实例如下:

127.0.0.1:6379> ZSCORE myzset 3
"3"

(9)ZREVRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。

排名以 0 为底,也就是说, score 值最大的成员排名为 0 。


实例如下:

127.0.0.1:6379> ZRANK myzset 2
(integer) 0
127.0.0.1:6379> ZREVRANK myzset 2
(integer) 2

(10)ZREVRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。


其中成员的位置按 score 值递减(从大到小)来排列。


具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。


除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。


实例如下:

127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "2"
2) "2"
3) "3"
4) "3"
5) "4"
6) "4"
127.0.0.1:6379> ZREVRANGE myzset 0 -1 withscores
1) "4"
2) "4"
3) "3"
4) "3"
5) "2"
6) "2"

(11)ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]


返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。


具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。


除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。


实例如下:

127.0.0.1:6379> ZADD myzset 0.5 1
(integer) 1
127.0.0.1:6379> ZRANGE myzset 0 -1 withscores
1) "1"
2) "0.5"
3) "2"
4) "2"
5) "3"
6) "3"
7) "4"
8) "4"
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> ZRANGEBYSCORE myzset 0 5 withscores
1) "1"
2) "0.5"
3) "2"
4) "2"
5) "3"
6) "3"
7) "4"
8) "4"
127.0.0.1:6379> ZREVRANGE myzset 0 -1 withscores
1) "4"
2) "4"
3) "3"
4) "3"
5) "2"
6) "2"
7) "1"
8) "0.5"
127.0.0.1:6379> ZREVRANGEBYSCORE myzset 5 0 withscores
1) "4"
2) "4"
3) "3"
4) "3"
5) "2"
6) "2"
7) "1"
8) "0.5"

Redis 的命令参考与其他 文档可以参考:

http://redisdoc.com/



【7】使用Java测试数据操作

源码简单示例如下:

public class TestAPI {
  public static void main(String[] args) 
  {
    Jedis jedis = new Jedis("127.0.0.1",6379);
    jedis.set("k1","v1");
    jedis.set("k2","v2");
    jedis.set("k3","v3");
    System.out.println(jedis.get("k3"));
    Set<String> sets = jedis.keys("*");
    System.out.println(sets.size());
       //key
       Set<String> keys = jedis.keys("*");
       for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
         String key = (String) iterator.next();
         System.out.println(key);
       }
       System.out.println("jedis.exists====>"+jedis.exists("k2"));
       System.out.println(jedis.ttl("k1"));
       //String
       //jedis.append("k1","myreids");
       System.out.println(jedis.get("k1"));
       jedis.set("k4","k4_redis");
       System.out.println("----------------------------------------");
       jedis.mset("str1","v1","str2","v2","str3","v3");
       System.out.println(jedis.mget("str1","str2","str3"));
       //list
       System.out.println("----------------------------------------");
       //jedis.lpush("mylist","v1","v2","v3","v4","v5");
       List<String> list = jedis.lrange("mylist",0,-1);
       for (String element : list) {
         System.out.println(element);
       }
       //set
       jedis.sadd("orders","jd001");
       jedis.sadd("orders","jd002");
       jedis.sadd("orders","jd003");
       Set<String> set1 = jedis.smembers("orders");
       for (Iterator iterator = set1.iterator(); iterator.hasNext();) {
         String string = (String) iterator.next();
         System.out.println(string);
       }
       jedis.srem("orders","jd002");
       System.out.println(jedis.smembers("orders").size());
       //hash
       jedis.hset("hash1","userName","lisi");
       System.out.println(jedis.hget("hash1","userName"));
       Map<String,String> map = new HashMap<String,String>();
       map.put("telphone","1245786875");
       map.put("address","jane");
       map.put("email","abc@163.com");
       jedis.hmset("hash2",map);
       List<String> result = jedis.hmget("hash2", "telphone","email");
       for (String element : result) {
         System.out.println(element);
       }
       //zset
       jedis.zadd("zset01",60d,"v1");
       jedis.zadd("zset01",70d,"v2");
       jedis.zadd("zset01",80d,"v3");
       jedis.zadd("zset01",90d,"v4");
       Set<String> s1 = jedis.zrange("zset01",0,-1);
       for (Iterator iterator = s1.iterator(); iterator.hasNext();) {
         String string = (String) iterator.next();
         System.out.println(string);
       }
  }
}



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
存储 索引 Python
Python中可变数据类型和不可变数据类型
【2月更文挑战第18天】
194 8
|
3月前
|
存储 索引 Python
元组的常用操作小结
元组的常用操作小结
30 1
|
2月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
40 0
|
7月前
|
C++ 索引
C++中字符串常用操作
C++中字符串常用操作
65 2
|
6月前
|
C++ 索引
C++ string类常用操作
C++ string类常用操作
|
7月前
|
存储 索引 Python
python 数据类型之集合
python 数据类型之集合
|
索引 Python
Python编程 字典的常用操作
Python编程 字典的常用操作
87 0
|
Python
Python数据类型-字典操作
字典以大括号“{}”包围的以“键:值”对方式声明和存在的数据集合,“键:值”对之间用“英文逗号”隔开
|
Python
Python——字符串数据类型及常用操作
Python——字符串数据类型及常用操作
167 1
Python——字符串数据类型及常用操作