版权声明: https://blog.csdn.net/Master_chaoAndQi/article/details/82933608
Redis (sorted set)有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
zadd key [NX|XX] [CH] [INCR] score member [score member ...] 向集合中增加元素
ZRANGE key start stop [WITHSCORES] 查询集合中的元素
zrem key member [member ...] 移除集合中的某元素
ZCARD key 计算集合中元素的个数
zcount key min max 计算指定分数区间中元素的个数
ZINCRBY key increment member 对指定元素对应的score加上增量
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] 计算一个或多个有序集合的交集并存入新的集合
ZSCORE key member 返回结合中指定元素的分数值
ZREVRANGE key start stop [WITHSCORES] 有序集合降序排列
ZREMRANGEBYRANK key start stop 根据排名删除元素
ZREMRANGEBYSCORE key min max 根据分数范围删除元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 根据评分范围查找元素
1 增加元素 查询元素 排序
127.0.0.1:6379> zadd set 7 zhangsan 1 lisi 10 wangwu
(integer) 3
127.0.0.1:6379> ZRANGE set 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> ZRANGE set 0 -1 withscores
1) "lisi"
2) "1"
3) "zhangsan"
4) "7"
5) "wangwu"
6) "10"
127.0.0.1:6379>
2 移除某个元素
127.0.0.1:6379> ZREM set zhangsan
(integer) 1
127.0.0.1:6379> ZRANGE set 0 -1
1) "lisi"
2) "wangwu"
127.0.0.1:6379>
3 计算元素在指定分数区间的个数
127.0.0.1:6379> ZCOUNT set 1 10
(integer) 2
127.0.0.1:6379> ZCOUNT set 1 2
(integer) 1
127.0.0.1:6379>
4 计算集合中元素个数
127.0.0.1:6379> ZCARD set
(integer) 2
127.0.0.1:6379>
5 对指定元素的score加上一个增量
127.0.0.1:6379> ZINCRBY set 20 lisi
"21"
127.0.0.1:6379> zrange set 0 -1 withscores
1) "wangwu"
2) "10"
3) "lisi"
4) "21"
127.0.0.1:6379>
6 计算两个有序集合的交集并赋值
127.0.0.1:6379> ZINTERSTORE set5 2 set set4
(integer) 0
127.0.0.1:6379> zadd set4 10 zhangsan 11 lisi 1 wangmaz
(integer) 3
127.0.0.1:6379> ZINTERSTORE set5 2 set set4
(integer) 1
127.0.0.1:6379> ZRANGE set5 0 -1
1) "lisi"
127.0.0.1:6379>
7 返回指定元素的分数值
127.0.0.1:6379> ZSCORE set zhangsan
(nil)
127.0.0.1:6379> ZSCORE set lisi
"21"
127.0.0.1:6379>
8 降序排列
127.0.0.1:6379> ZREVRANGE set 0 -1 withscores
1) "lisi"
2) "21"
3) "wangwu"
4) "10"
9 根据排名删除元素 删除第一名
127.0.0.1:6379> ZREMRANGEBYRANK set 0 0
(integer) 1
127.0.0.1:6379> zrange set 0 -1
1) "lisi"
127.0.0.1:6379>
10 根据分数范围删除元素
127.0.0.1:6379> ZREMRANGEBYSCORE set5 0 100
(integer) 1
127.0.0.1:6379> zrange set5 0 -1
(empty list or set)
127.0.0.1:6379>
11 根据评分范围查找元素
127.0.0.1:6379> ZRANGEBYSCORE set 0 100 withscores limit 0 1
1) "lisi"
2) "21"
127.0.0.1:6379>
二 java方式操作
package redisUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class RedisSortSet {
@Test
public void template(){// 模板
Jedis jedis = RedisUtils.getJedis();
jedis.close();
RedisUtils.close();
}
/**
* zadd
* zrange
* zrangebyscore
* @Description: TODO(用一句话描述该文件做什么)
* @author guochao
* @date 2018年10月3日
*
*/
@Test
public void zadd(){// 模板
Jedis jedis = RedisUtils.getJedis();
jedis.zadd("test", 1, "zhangsan");
jedis.zadd("test", 12, "lisi");
jedis.zadd("test", 13, "wanmazi");
jedis.zadd("test", 14, "wuhan");
Map<String,Double> map = new HashMap<String,Double>();
map.put("shenzhen", new Double(4));
map.put("guangzhou", new Double(3));
map.put("河南", new Double(40));
map.put("wuhu", new Double(100));
jedis.zadd("test", map);
Set<String> zrange = jedis.zrange("test", 0, -1);
//[zhangsan, guangzhou, shenzhen, lisi, wanmazi, wuhan, 河南, wuhu]
System.out.println(zrange);
Set<String> zrangeByScore = jedis.zrangeByScore("test", 0, 10);// 查询0 到 10分的
System.out.println("0-10:"+zrangeByScore);
//0-10:[zhangsan, guangzhou, shenzhen]
jedis.close();
RedisUtils.close();
}
@Test
public void query(){
Jedis jedis = RedisUtils.getJedis();
Long zcard = jedis.zcard("test");
System.out.println("结合中的个数"+zcard);
Long zcount = jedis.zcount("test", 0, 5);// 0 到 5
System.out.println("分数在0-5的个数"+zcount);
Double zscore = jedis.zscore("test", "河南");
System.out.println("河南对应的score值"+zscore);
/**
* 结合中的个数8
分数在0-5的个数3
河南对应的score值40.0
*/
jedis.close();
RedisUtils.close();
}
@Test
public void zrem(){
Jedis jedis = RedisUtils.getJedis();
Long zrem = jedis.zrem("test", "河南");
Long zremrangeByScore = jedis.zremrangeByScore("test", 0, 20);
System.out.println("zrem"+zrem);
System.out.println("zremrangeByScore"+zremrangeByScore);
}
}