Redis 有序集合Zset的使用

 使用测试代码如下:

public static void main(String[] args) {
        String host = "172.*.*.*";
        int port = 6379;
        Jedis jedis = new Jedis(host, port);
        jedis.ping();

        //使用Jedis客户端操作有序集合Zset
        jedis.zadd("programingLanguages", 1, "C");
        jedis.zadd("programingLanguages", 2, "C++");
        jedis.zadd("programingLanguages", 3, "Java");
        jedis.zadd("programingLanguages", 0, "Python");
        Set<String> programingLanguagesDesc = jedis.zrevrange("programingLanguages", 0, 3);
        Set<String> programingLanguagesAsc = jedis.zrange("programingLanguages", 0, 3);
        System.out.println("********降序********");
        for (String language : programingLanguagesDesc) {
            System.out.println(language);
        }
        System.out.println("********升序********");
        for (String language : programingLanguagesAsc) {
            System.out.println(language);
        }
        //对于字符串的下标,左数从0开始,右数从-1开始
        System.out.println("****降序****取score占比最大的值********"+jedis.zrevrange("programingLanguages", 0, 0));
        System.out.println("****升序****取score占比最大的值********"+jedis.zrange("programingLanguages", -1, -1));
        System.out.println("****降序****取score占比前3名值********"+jedis.zrevrange("programingLanguages", 0, 2));
        Boolean contains3=Optional.of(programingLanguagesAsc).map(score->score.contains("Java")).orElse(false);
        System.out.println("***********是否包含score3***********"+contains3);

        // Python,C,C++,Java 顺序
        //    0   1  2  3
        //    -4  -3 -2  -1

        //Java,C++,C,Python   降序
        //    0   1  2  3
        //    -4  -3 -2  -1
}

运行反应值如下: 

对于字符串的下标,左数从0开始,右数从-1开始

 使用场景:

1:排行榜 

2:检查本服务器是否为集群中最晚启动完成的服务器(分布式环境中可以使用时间戳为score,添加服务器ip地址)

/**
	 * 启动后, 在Redis中添加本服务器的启动时间
	 */
	@PostConstruct
	public void register() {
		try {
			zSetOperations.add(ZSET_KEY_STARTED_SERVER_IPS, SERVER_IP, System.currentTimeMillis());
			log.info("[{}] registered in Redis", SERVER_IP);
		} catch (Exception e) {
			log.warn("[{}] Redis Failed: {}, {}", SERVER_IP, ZSET_KEY_STARTED_SERVER_IPS, e.getMessage());
		}
	}


/**
	 * 退出前, 在Redis中删除本服务器的启动时间
	 */
	@PreDestroy
	public void unregister() {
		try {
			zSetOperations.remove(ZSET_KEY_STARTED_SERVER_IPS, SERVER_IP);
			log.info("[{}] removed from Redis", SERVER_IP);
		} catch (Exception e) {
			log.warn("[{}] Redis Failed: {}, {}", SERVER_IP, ZSET_KEY_STARTED_SERVER_IPS, e.getMessage());
		}
	}

   public boolean isLatestStartedServer() {
		try {
			Set<String> serverIps = zSetOperations.range(ZSET_KEY_STARTED_SERVER_IPS, -1, -1);
			if (CollectionUtils.isEmpty(serverIps)) {
				register();
				return true;
			}
			return Optional.of(serverIps)
					.map(server -> server.contains(SERVER_IP))
					.orElse(false);
		} catch (Exception e) {
			log.warn("Redis Failed: {}", e.getMessage());
			return false;
		}
	}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis有序集合(Sorted Set)是一种特殊的集合数据结构,它除了包含成员元素外,还维护了一个分数字段,使得集合内的元素可以按照分数排序。以下是 Redis 中一些常用的操作有序集合的命令: 1. **ZADD (ZSet Add)**: 向有序集合添加新成员,同时指定一个分数(score)。如果成员已存在,可以选择替换旧分数或忽略。 - ZADD key score member [score ...] - ZADD key nx score member [score ...] (仅当成员不存在时插入) - ZADD key ch score member [score ...] (仅当成员存在且当前得分小于给定值时插入) 2. **ZRANGE (Range by Score)**: 获取有序集中指定范围内的成员及其分数。支持多种形式的范围查询,如指定最小分值、最大分值、区间等。 - ZRANGE key start end [WITHSCORES] - ZRANGEBYSCORE key min max [LIMIT offset count] 3. **ZRANK (Rank)**: 返回指定成员在有序集合中的排名(基于分数),默认从0开始计数。 - ZRANK key member 4. **ZREVRANK (Reverse Rank)**: 返回指定成员在有序集合中倒序排名的位置。 - ZREVRANK key member 5. **ZREM (Remove Member)**: 删除有序集合中的成员。可以删除所有指定成员,也可以根据分数删除。 - ZREM key member [member ...] 6. **ZCOUNT (Count Members)**: 统计有序集合内满足条件的成员数量。 - ZCOUNT key min max 7. **ZCARD (Cardinality)**: 查询有序集合中的成员数量。 8. **ZINCRBY (Increment Score by)**: 对指定成员在有序集合中的分数进行递增并返回新的分数。 - ZINCRBY key member increment 以上是一些基本的有序集合操作命令,还有其他如ZLEXCOUNT(按字典顺序)和ZUNIONSTORE等高级命令。有序集合在需要对数据进行复杂排序和过滤的应用场景中非常有用,例如排行榜、相似度计算等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值