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); } } }