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 sets = jedis.keys("*");
        System.out.println(sets.size());
        
         //key
         Set 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 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 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 map = new HashMap();
         map.put("telphone","1245786875");
         map.put("address","jane");
         map.put("email","abc@163.com");
         jedis.hmset("hash2",map);
         List 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 s1 = jedis.zrange("zset01",0,-1);
         for (Iterator iterator = s1.iterator(); iterator.hasNext();) {
           String string = (String) iterator.next();
           System.out.println(string);
         }
    }
}

发表评论