redis数据类型-sorted set

       在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在集合中,还能够获得分数最高或最低的前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();
}

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值