sorted set操作

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

 

1.向有序集合添加一个或多个成员,或者更新已存在成员的分数ZADD key score1 member1 [score2 member2] 向集合zset中放入zs和li的姓名和成绩

2.通过索引区间返回有序集合成指定区间内的成员ZRANGE key start stop [WITHSCORES] 

3.获取有序集合的成员数ZCARD key 

4.计算在有序集合中指定区间分数的成员数ZCOUNT key min max 

如:查询分数在90和100之间的学员个数

5.返回有序集合中指定成员的索引ZRANK key member 

 

6.移除有序集合中的一个或多个成员ZREM key member [member ...] 

7.移除有序集合中给定的排名区间的所有成员ZREMRANGEBYRANK key start stop 

8.移除有序集合中给定的分数区间的所有成员ZREMRANGEBYSCORE key min max 

9.返回有序集中,成员的分数值ZSCORE key member 

10.返回有序集中指定区间内的成员,通过索引,分数从高到底ZREVRANGE key start stop [WITHSCORES] 

11.返回有序集中指定分数区间内的成员,分数从高到低排序 ZREVRANGEBYSCORE key max min [WITHSCORES] 

12.有序集合中对指定成员的分数加上增量 increment ZINCRBY key increment member 

 

sort set 代码操作:

package com.study.util;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;

public class RedisSortSet {

    public static void main(String[] args) {
        Jedis jedis = RedisUtil.getJedis();
        //向有序集合zset中添加zs和li的成绩和姓名
        
        //jedis.zadd("zset", 99, "zs");
        Map<String, Double> scoreMembers = new HashMap<String,Double>();
        scoreMembers.put("zs", 90.0);
        scoreMembers.put("li", 89.0);
        jedis.zadd("zset", scoreMembers);
        
        //通过索引返回有序集合指定区间的成员
        Set<Tuple> scores = jedis.zrangeWithScores("zset", 0, -1);
        System.out.println("zset的成员:");
        for (Tuple tuple : scores) {
            System.out.println(tuple.getElement());
            System.out.println(tuple.getScore());
        }
        
        //获取有序集合的成员数
        long count = jedis.zcard("zset");
        System.out.println("集合的个数:" + count);
        
        //查询分数在90和100之间的学员个数
        count = jedis.zcount("zset", 90, 100);
        System.out.println("分数在90和100之间的学员个数:" + count);
        
        //返回li在集合中的索引 redis是安装score从小到大排序的,所以li在一位
        long index = jedis.zrank("zset", "li");
        System.out.println("li在集合中的索引:" + index);
        
        //移除学员li
        jedis.zrem("zset", "li");
        
        //根据排名移除集合中的元素
        jedis.zremrangeByRank("zset", 0, 2);
        
        scoreMembers.put("zs", 80.0);
        scoreMembers.put("ls", 90.0);
        scoreMembers.put("ws", 85.0);
        jedis.zadd("zset", scoreMembers);
        
        //根据分数移除集合中的元素
        jedis.zremrangeByScore("zset", 80, 85);
        
        //返回ls的分值
        double score = jedis.zscore("zset", "ls");
        System.out.println("ls的分值:" + score);
        
        jedis.zadd("zset", 95, "zs");
        
        //通过索引,从高到低返回指定区间的元素
        scores = jedis.zrevrangeWithScores("zset", 0, -1);
        for (Tuple tuple : scores) {
            System.out.println(tuple.getElement());
            System.out.println(tuple.getScore());
        }
        //通过分数,从高到低返回指定区间的元素
        scores = jedis.zrevrangeByScoreWithScores("zset", 95, 80);
        for (Tuple tuple : scores) {
            System.out.println(tuple.getElement());
            System.out.println(tuple.getScore());
        }
        //将ls的分数加10
        jedis.zincrby("zset", 10, "li");
        scores = jedis.zrangeWithScores("zset", 0, -1);
        System.out.println("zset的成员:");
        for (Tuple tuple : scores) {
            System.out.println(tuple.getElement());
            System.out.println(tuple.getScore());
        }
        jedis.close();
    }
}
View Code

 

代码git地址:https://gitee.com/sjcq/redis.git

posted on 2018-04-30 11:46  四季常青  阅读(319)  评论(0编辑  收藏  举报

导航