在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等于分数有关的操作。
在某些方面有序集合和列表类型有些相似。
(1)都是有序的
(2)都可以获得某一范围的元素
差别:
(1)列表类型是通过链表实现的,获取靠近两端的数据极快,而当元素增多后,访问中间数据的速度会变慢。
(2)有序集合类型使用散列表实现,所有即使读取位于中间的部分的数据也很快。
(3)列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
(4)有序集合要比列表类型更耗费内存。
1.添加
192.168.153.128:6379> zadd scorebord 80 zhangsan 90 lisi 87 wangwu
(integer) 3
// 虽然这里继续给lisi添加值返回为0但是他照样会把值改变掉
192.168.153.128:6379> zadd scorebord 98 lisi
(integer) 0
192.168.153.128:6379> zscore scorebord lisi
"98"
2.获得排名在某个范围的元素列表
192.168.153.128:6379> zrange scorebord 0 1
1) "zhangsan"
2) "wangwu"
// 照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
192.168.153.128:6379> zrevrange scorebord 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
// 如果需要获得元素的分数可以在命令尾部加上withscores参数
192.168.153.128:6379> zrevrange scorebord 0 -1 withscores
1) "lisi"
2) "98"
3) "wangwu"
4) "87"
5) "zhangsan"
6) "80"
3.获得分数指定范围的元素
192.168.153.128:6379> zrangebyscore scorebord 80 87 withscores
1) "zhangsan"
2) "80"
3) "wangwu"
4) "87"
4.增加某个元素的分数,返回值是更改后的分数
// 给张三加5分
192.168.153.128:6379> zincrby scorebord 5 zhangsan
"85"
// 查看集合中元素的数量
192.168.153.128:6379> zcard scorebord
(integer) 3
// 获得指定分数范围内的元素个数
192.168.153.128:6379> zcount scorebord 80 90
(integer) 2
5.其他命令
// 按照排名范围删除元素
192.168.153.128:6379> zremrangebyrank myset2 0 1
(integer) 2
// 查看某个元素排第几
192.168.153.128:6379> zrank myset2 衣服
(integer) 1
测试类:
@Test
public void teststoreset() {
Jedis jedis = new Jedis("192.168.153.128", 6379);
jedis.flushAll();
// 单个添加
jedis.zadd("myset2", 100, "衣服");
// 多个添加
HashMap<String, Double> map = new HashMap<>();
map.put("电子产品", 1000D);
map.put("生活用品", 135D);
jedis.zadd("myset2", map);
// 获得元素的分数
Double zscore = jedis.zscore("myset2", "电子产品");
System.out.println(zscore);
// 获得排名的范围的元素(前两名)
Set<String> myset2 = jedis.zrange("myset2", 0, 1);
System.out.println(myset2);
// 从大到小排序
Set<String> myset21 = jedis.zrevrange("myset2", 0, 2);
System.out.println(myset21);
// 带着元素参数
Set<Tuple> myset22 = jedis.zrevrangeWithScores("myset2", 0, 2);
for (Tuple t : myset22) {
String element = t.getElement();
double score = t.getScore();
System.out.println("元素:" + element + "====分数:" + score);
}
// 增加某个元素的分数
jedis.zincrby("myset2", 100, "衣服");
Long zrank = jedis.zrank("myset2", "衣服");
System.out.println("排名:"+zrank);
jedis.close();
}