Redis集合(SortedSet)方法使用詳解-創(chuàng)新互聯(lián)

目錄
    • 一、簡介
    • 二、常用方法
      • 2.1、ZADD
      • 2.2、ZREM
      • 2.3、ZSCORE
      • 2.4、ZINCRBY
      • 2.5、ZCARD
      • 2.6、ZRANK、ZREVRANK
      • 2.7、ZRANGE、ZREVRANGE
      • 2.8、ZRANGEBYSCORE、ZREVRANGEBYSCORE
      • 2.9、ZCOUNT
      • 2.10、ZREMRANGEBYRANK
      • 2.11、ZREMRANGEBYSCORE
      • 2.12、ZINTERSTORE、ZUNIONSTORE
      • 2.13、ZRANGEBYLEX、ZREVRANGEBYLEX
      • 2.14、ZLEXCOUNT
      • 2.15、ZREMRANGEBYLEX
      • 2.16、ZPOPMAX、ZPOPMIN
      • 2.17、BZPOPMAX、BZPOPMIN

成都創(chuàng)新互聯(lián)專業(yè)提供四川樂山服務(wù)器托管服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買四川樂山服務(wù)器托管服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。一、簡介

??本文今天主要是集合(Sorted Set)的方法的使用,以及redis對(duì)應(yīng)的Java實(shí)現(xiàn)該怎么用。因?yàn)槠鶈栴},我這里寫了一個(gè)測試類,引入RedisTemplate對(duì)象,后面例子里就不一一引入了。大家理解就行,如果大家還不知道如何通過Spring Boot整合redis則可以查看我之前的文章:SpringBoot整合redis(redis支持單節(jié)點(diǎn)和集群),這一章注定是枯燥的,但是可能也是實(shí)際中反而用得多的,大家看著辦了。

package com.alian.datastruct;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisSortedSetTest {@Autowired
    private RedisTemplateredisTemplate;
}
二、常用方法 2.1、ZADD
  • ZADD向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)

語法

ZADD KEY_NAME SCORE1 MEMBER1... SCOREn MEMBERn

命令操作

127.0.0.1:6379>zadd zset1 95.0  taojianwen
(integer) 1
127.0.0.1:6379>zadd zset1 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 3
127.0.0.1:6379>zrange zset1 0 -1
1) "luokaocong"
2) "wanglin"
3) "tangpeng"
4) "taojianwen"
  • 向集合(zset1)中加入一個(gè)成員:taojianwen
  • 向集合(zset1)中加入多個(gè)成員:tangpeng、wanglin、luokaocong
  • 獲取集合(zset1)的成員,得到:luokaocong、wanglin、tangpeng、taojianwen

Java操作

@Test
    public void zAdd() {String redisKey = "zSet1";
        redisTemplate.delete(redisKey);
        // 添加一個(gè)成員
        redisTemplate.opsForZSet().add(redisKey, "taojianwen",95.0);

        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 獲取成員的信息
        Setrange = redisTemplate.opsForZSet().range(redisKey, 0, -1);
        log.info("獲取集合的信息:{}", range);
    }
獲取集合的信息:[luokaocong, wanglin, tangpeng, taojianwen]
2.2、ZREM
  • ZREM移除有序集合中的一個(gè)或多個(gè)成員

語法

ZREM KEY_NAME MEMBER [MEMBER ...]

命令操作

127.0.0.1:6379>zadd zset2 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zrem zset2 luokaocong
(integer) 1
127.0.0.1:6379>zrange zset2 0 -1
1) "wanglin"
2) "tangpeng"
3) "taojianwen"
  • 向集合(zset2)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 從集合(zset2)中移除成員luokaocong
  • 獲取集合(zset2)的成員,得到:wanglin、tangpeng、taojianwen

Java操作

@Test
    public void zRem() {String redisKey = "zSet2";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 移除成員
        Long num = redisTemplate.opsForZSet().remove(redisKey, "luokaocong");
        log.info("移除成員的個(gè)數(shù):{}", num);
        // 獲取成員的信息
        Setrange = redisTemplate.opsForZSet().range(redisKey, 0, -1);
        log.info("獲取集合的信息:{}", range);
    }
移除成員的個(gè)數(shù):1
獲取集合的信息:[wanglin, tangpeng, taojianwen]
2.3、ZSCORE
  • ZSCORE返回有序集中,成員的分?jǐn)?shù)值

語法

ZSCORE KEY_NAME MEMBER

命令操作

127.0.0.1:6379>zadd zset3 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zscore zset3 taojianwen
"95"
  • 向集合(zset3)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 從集合(zset3)中獲取成員taojianwen的分?jǐn)?shù),得到:95

Java操作

@Test
    public void zScore() {String redisKey = "zSet3";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 獲取成員的分?jǐn)?shù)
        Double score = redisTemplate.opsForZSet().score(redisKey, "taojianwen");
        log.info("獲取成員的分?jǐn)?shù):{}", score);
    }
獲取成員的分?jǐn)?shù):95.0
2.4、ZINCRBY
  • ZINCRBY有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment

語法

ZINCRBY KEY_NAME increment MEMBER

命令操作

127.0.0.1:6379>zadd zset4 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zincrby zset4 2 taojianwen
"97"
127.0.0.1:6379>zincrby zset4 2 tangpeng
"94"
  • 向集合(zset4)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 給集合(zset4)中獲取成員taojianwen的分?jǐn)?shù)加2分,得到:97
  • 給集合(zset4)中獲取成員tangpeng的分?jǐn)?shù)加2分,得到:94

Java操作

@Test
    public void zIncrBy() {String redisKey = "zSet4";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 獲取成員的分?jǐn)?shù)
        redisTemplate.opsForZSet().incrementScore(redisKey, "taojianwen",2);
        redisTemplate.opsForZSet().incrementScore(redisKey, "tangpeng",2);
        // 獲取成員的分?jǐn)?shù)
        Double score = redisTemplate.opsForZSet().score(redisKey, "taojianwen");
        log.info("成員taojianwen的分?jǐn)?shù):{}", score);
        Double score2 = redisTemplate.opsForZSet().score(redisKey, "tangpeng");
        log.info("成員tangpeng的分?jǐn)?shù):{}", score2);
    }
成員taojianwen的分?jǐn)?shù):97.0
成員tangpeng的分?jǐn)?shù):94.0
2.5、ZCARD
  • ZCARD獲取有序集合的成員數(shù)

語法

ZCARD KEY_NAME

命令操作

127.0.0.1:6379>zadd zset5 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zcard zset5
(integer) 4
  • 向集合(zset4)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 獲取集合(zset4)中成員的個(gè)數(shù),得到:4

Java操作

@Test
    public void zCard() {String redisKey = "zSet5";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 獲取成員的分?jǐn)?shù)
        Long size = redisTemplate.opsForZSet().size(redisKey);
        log.info("成員的個(gè)數(shù):{}", size);
    }
成員的個(gè)數(shù):4
2.6、ZRANK、ZREVRANK
  • ZRANK返回有序集合中指定成員的排名
  • ZREVRANK返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序

語法

ZRANK KEY_NAME MEMBER
ZREVRANK KEY_NAME MEMBER

命令操作

127.0.0.1:6379>zadd zset6 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zrank zset6 taojianwen
(integer) 3
127.0.0.1:6379>zrank zset6 luokaocong
(integer) 0
127.0.0.1:6379>zrevrank zset6 taojianwen
(integer) 0
127.0.0.1:6379>zrevrank zset6 luokaocong
(integer) 3

ZRANK

排名0123
分值90.091.092.095.0
成員luokaocongwanglintangpengtaojianwen

ZREVRANK

排名0123
分值95.092.091.090.0
成員taojianwentangpengwanglinluokaocong

Java操作

@Test
    public void zRankAndZRevRank() {String redisKey = "zSet6";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 返回有序集中指定成員的排名
        Long rank1 = redisTemplate.opsForZSet().rank(redisKey,"taojianwen");
        log.info("有序集中指定成員的(升序)排名為:{}", rank1);
        Long rank2 = redisTemplate.opsForZSet().rank(redisKey,"luokaocong");
        log.info("有序集中指定成員的(升序)排名為:{}", rank2);

        Long rank3 = redisTemplate.opsForZSet().reverseRank(redisKey, "taojianwen");
        log.info("有序集中指定成員的(降序)排名為:{}", rank3);
        Long rank4 = redisTemplate.opsForZSet().reverseRank(redisKey, "luokaocong");
        log.info("有序集中指定成員的(降序)排名為:{}", rank4);
    }
有序集中指定成員的(升序)排名為:3
有序集中指定成員的(升序)排名為:0
有序集中指定成員的(降序)排名為:0
有序集中指定成員的(降序)排名為:3
2.7、ZRANGE、ZREVRANGE
  • ZRANGE通過索引區(qū)間返回有序集合指定區(qū)間內(nèi)的成員
  • ZREVRANGE通過索引區(qū)間返回有序集合指定區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低

語法

ZRANGE KEY_NAME start stop [WITHSCORES]
ZREVRANGE KEY_NAME start stop [WITHSCORES]

命令操作

127.0.0.1:6379>zadd zset7 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zrange zset7 0 -1
1) "luokaocong"
2) "wanglin"
3) "tangpeng"
4) "taojianwen"
127.0.0.1:6379>zrevrange zset7 0 -1
1) "taojianwen"
2) "tangpeng"
3) "wanglin"
4) "luokaocong"

ZRANGE

索引0123
分值90.091.092.095.0
成員luokaocongwanglintangpengtaojianwen

ZREVRANGE

索引0123
分值95.092.091.090.0
成員taojianwentangpengwanglinluokaocong

從 到 -1 就是全部

Java操作

@Test
    public void zRangeAndZRevRange() {String redisKey = "zSet7";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 返回有序集中指定區(qū)間的成員
        Setrange = redisTemplate.opsForZSet().range(redisKey, 0, -1);
        log.info("有序集中指定區(qū)間的成員(分值升序):{}", range);
        Setrange2 = redisTemplate.opsForZSet().reverseRange(redisKey, 0, -1);
        log.info("有序集中指定區(qū)間的成員(分值降序):{}", range2);
    }
有序集中指定區(qū)間的成員(分值升序):[luokaocong, wanglin, tangpeng, taojianwen]
有序集中指定區(qū)間的成員(分值降序):[taojianwen, tangpeng, wanglin, luokaocong]
2.8、ZRANGEBYSCORE、ZREVRANGEBYSCORE
  • ZRANGEBYSCORE通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員
  • ZREVRANGEBYSCORE返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序

語法

ZRANGEBYSCORE KEY_NAME min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE KEY_NAME max min [WITHSCORES] [LIMIT offset count]

命令操作

127.0.0.1:6379>zadd zset8 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zrangebyscore zset8 91 92 WITHSCORES
1) "wanglin"
2) "91"
3) "tangpeng"
4) "92"
127.0.0.1:6379>zrevrangebyscore zset8 92 91 WITHSCORES
1) "tangpeng"
2) "92"
3) "wanglin"
4) "91"
#查全部
127.0.0.1:6379>zrangebyscore zset8 -INF +INF WITHSCORES
1) "luokaocong"
2) "90"
3) "wanglin"
4) "91"
5) "tangpeng"
6) "92"
7) "taojianwen"
8) "95"
#查大于91小于等于95的
127.0.0.1:6379>zrangebyscore zset8 (91 95 WITHSCORES
1) "tangpeng"
2) "92"
3) "taojianwen"
4) "95"

Java操作

@Test
    public void zRangeBySoreAndZRevRangeBySore() {String redisKey = "zSet8";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員
        Setrange = redisTemplate.opsForZSet().rangeByScore(redisKey, 91.0, 92.0);
        log.info("通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員(分值升序):{}", range);
        Setrange2 = redisTemplate.opsForZSet().reverseRangeByScore(redisKey, 91.0, 92.0);
        log.info("通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員(分值降序):{}", range2);
    }
通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員(分值升序):[wanglin, tangpeng]
通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員(分值降序):[tangpeng, wanglin]
2.9、ZCOUNT
  • ZCOUNT計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)

語法

ZCOUNT KEY_NAME min max

命令操作

127.0.0.1:6379>zadd zset9 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zcount zset9 91 92
(integer) 2
127.0.0.1:6379>zcount zset9 90 95
(integer) 4
  • 向集合(zset9)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 集合(zset9)中分?jǐn)?shù)在9192范圍的成員有:2個(gè)
  • 集合(zset9)中分?jǐn)?shù)在9095范圍的成員有:4個(gè)

Java操作

@Test
    public void zCount() {String redisKey = "zSet9";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 返回指定區(qū)間分?jǐn)?shù)的成員數(shù)
        Long count = redisTemplate.opsForZSet().count(redisKey, 91.0, 92.0);
        log.info("返回指定區(qū)間分?jǐn)?shù)的成員數(shù):{}", count);
        Long count2 = redisTemplate.opsForZSet().count(redisKey, 90.0, 95.0);
        log.info("返回指定區(qū)間分?jǐn)?shù)的成員數(shù):{}", count2);
    }
返回指定區(qū)間分?jǐn)?shù)的成員數(shù):2
返回指定區(qū)間分?jǐn)?shù)的成員數(shù):4
2.10、ZREMRANGEBYRANK
  • ZREMRANGEBYRANK移除有序集合中給定的排名區(qū)間的所有成員

語法

ZREMRANGEBYRANK KEY_NAME start stop

命令操作

127.0.0.1:6379>zadd zset10 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zremrangebyrank zset10 1 2
(integer) 2
127.0.0.1:6379>zrange zset10 0 -1 withscores
1) "luokaocong"
2) "90"
3) "taojianwen"
4) "95"
  • 向集合(zset10)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 集合(zset10)中移除排名從12的成員有:2個(gè)

Java操作

@Test
    public void zRemRangeByRank() {String redisKey = "zSet10";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 移除有序集合中給定的排名區(qū)間的所有成員
        Long num = redisTemplate.opsForZSet().removeRange(redisKey, 1, 2);
        log.info("移除的成員數(shù):{}", num);
        // 獲取成員的信息
        Setrange = redisTemplate.opsForZSet().range(redisKey, 0, -1);
        log.info("獲取集合的信息:{}", range);
    }
移除的成員數(shù):2
獲取集合的信息:[luokaocong, taojianwen]
2.11、ZREMRANGEBYSCORE
  • ZREMRANGEBYSCORE移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員

語法

ZREMRANGEBYSCORE KEY_NAME min max

命令操作

127.0.0.1:6379>zadd zset11 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zremrangebyscore zset11 91 96
(integer) 3
127.0.0.1:6379>zrange zset11 0 -1 withscores
1) "luokaocong"
2) "90"
  • 向集合(zset11)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 集合(zset11)中移除分?jǐn)?shù)在9196的成員
  • 集合(zset11)只剩余一個(gè)成員luokaocong

Java操作

@Test
    public void zRemRangeByScore() {String redisKey = "zSet11";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple=new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey,tuple);
        // 移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員
        Long num  = redisTemplate.opsForZSet().removeRangeByScore(redisKey, 91, 96);
        log.info("移除的成員數(shù):{}", num);
        // 獲取成員的信息
        Setrange = redisTemplate.opsForZSet().range(redisKey, 0, -1);
        log.info("獲取集合的信息:{}", range);
    }
移除的成員數(shù):3
獲取集合的信息:[luokaocong]
2.12、ZINTERSTORE、ZUNIONSTORE
  • ZINTERSTORE計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 destination 中
  • ZUNIONSTORE計(jì)算給定的一個(gè)或多個(gè)有序集的并集,并存儲(chǔ)在新集合 destination 中

語法

ZINTERSTORE destination numkeys key [key ...]
ZUNIONSTORE destination numkeys key [key ...]

命令操作

127.0.0.1:6379>zadd zset12 95.0 taojianwen 92.0 tangpeng 91.0 wanglin
(integer) 3
127.0.0.1:6379>zadd zset13 88.0 tangpeng 80.0 wanglin
(integer) 2
127.0.0.1:6379>zinterstore interStore 2 zset12 zset13
(integer) 2
127.0.0.1:6379>zrange interStore 0 -1 withscores
1) "wanglin"
2) "171"
3) "tangpeng"
4) "180"
127.0.0.1:6379>zunionstore unionStore 2 zset12 zset13
(integer) 3
127.0.0.1:6379>zrange unionStore 0 -1 withscores
1) "taojianwen"
2) "95"
3) "wanglin"
4) "171"
5) "tangpeng"
6) "180"

Java操作

@Test
    public void zInterStoreAndZUnionStore() {String redisKey = "zSet12";
        String redisKey1 = "zSet13";
        redisTemplate.delete(redisKey);
        redisTemplate.delete(redisKey1);

        redisTemplate.opsForZSet().add(redisKey,"taojianwen", 95.0);
        redisTemplate.opsForZSet().add(redisKey,"tangpeng", 92.0);
        redisTemplate.opsForZSet().add(redisKey,"wanglin", 91.0);

        redisTemplate.opsForZSet().add(redisKey1,"tangpeng", 88.0);
        redisTemplate.opsForZSet().add(redisKey1,"wanglin", 80.0);

        // 計(jì)算給定的一個(gè)或多個(gè)有序集的交集,存儲(chǔ)到集合interStore
        Long num  = redisTemplate.opsForZSet().intersectAndStore(redisKey, redisKey1, "interStore");
        log.info("交集的成員數(shù):{}", num);
        // 獲取成員的信息
        Setrange = redisTemplate.opsForZSet().range("interStore", 0, -1);
        log.info("獲取集合的信息:{}", range);

        // 計(jì)算給定的一個(gè)或多個(gè)有序集的并集,存儲(chǔ)到集合unionStore
        Long num1  = redisTemplate.opsForZSet().unionAndStore(redisKey, redisKey1, "unionStore");
        log.info("并集的成員數(shù):{}", num1);
        // 獲取成員的信息
        Setrange1 = redisTemplate.opsForZSet().range("unionStore", 0, -1);
        log.info("獲取集合的信息:{}", range1);
    }
交集的成員數(shù):2
獲取集合的信息:[wanglin, tangpeng]
并集的成員數(shù):3
獲取集合的信息:[taojianwen, wanglin, tangpeng]
2.13、ZRANGEBYLEX、ZREVRANGEBYLEX
  • ZRANGEBYLEX獲取字典序指定范圍內(nèi)的成員
  • ZREVRANGEBYLEX逆序返回有序集合中指定范圍內(nèi)的成員

語法

ZRANGEBYLEX KEY_NAME min max
ZREVRANGEBYLEX KEY_NAME max min

命令操作

127.0.0.1:6379>zadd zset14 100 aa 100 ab 100 bb 100 bc 100 cc 100 cd 100 dd
(integer) 7
127.0.0.1:6379>zrangebylex zset14 - +
1) "aa"
2) "ab"
3) "bb"
4) "bc"
5) "cc"
6) "cd"
7) "dd"
127.0.0.1:6379>zrangebylex zset14 (bb [cd
1) "bc"
2) "cc"
3) "cd"
127.0.0.1:6379>zrevrangebylex zset14 [cd (bb
1) "cd"
2) "cc"
3) "bc"
  • 集合(zset14)中加入了7個(gè)成員
  • 查詢集合(zset14)中所有的成員,最小值和大值分別為-+
  • 查詢集合(zset14)中以bb開始,但是不包含bb,并且以cd結(jié)束的,但是包含cd的成員,這里的(就類似于大于,[就類似于小于等于

Java操作

@Test
    public void zRangeByLexAndZRevRangeByLex() {String redisKey = "zSet14";
        redisTemplate.delete(redisKey);

        redisTemplate.opsForZSet().add(redisKey, "aa", 100);
        redisTemplate.opsForZSet().add(redisKey, "ab", 100);
        redisTemplate.opsForZSet().add(redisKey, "bb", 100);
        redisTemplate.opsForZSet().add(redisKey, "bc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cd", 100);
        redisTemplate.opsForZSet().add(redisKey, "dd", 100);

        RedisZSetCommands.Range range = new RedisZSetCommands.Range();
        range.gt("bb");
        range.lte("cd");
        // 字典序指定范圍內(nèi)的成員
        Setset1 = redisTemplate.opsForZSet().rangeByLex(redisKey, range);
        log.info("字典序指定范圍內(nèi)的成員:{}", set1);
        Setset2 = redisTemplate.opsForZSet().reverseRangeByLex(redisKey, range);
        log.info("字典序指定范圍內(nèi)的成員:{}", set2);
    }

結(jié)果未生效,官方文檔說明暫不支持該命令

在這里插入圖片描述

2.14、ZLEXCOUNT
  • ZLEXCOUNT在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量

語法

ZLEXCOUNT KEY_NAME MIN MAX

命令操作

127.0.0.1:6379>zadd zset15 100 aa 100 ab 100 bb 100 bc 100 cc 100 cd 100 dd
(integer) 7
127.0.0.1:6379>zlexcount zset15 (bb [cd
(integer) 3

Java操作

@Test
    public void zLexCount() {String redisKey = "zSet15";
        redisTemplate.delete(redisKey);

        redisTemplate.opsForZSet().add(redisKey, "aa", 100);
        redisTemplate.opsForZSet().add(redisKey, "ab", 100);
        redisTemplate.opsForZSet().add(redisKey, "bb", 100);
        redisTemplate.opsForZSet().add(redisKey, "bc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cd", 100);
        redisTemplate.opsForZSet().add(redisKey, "dd", 100);

        RedisZSetCommands.Range range = new RedisZSetCommands.Range();
        range.gt("bb");
        range.lte("cd");
        // 計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量
        Long count = redisTemplate.opsForZSet().lexCount(redisKey, range);
        log.info("計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量:{}", count);
    }

結(jié)果未生效,官方文檔說明暫不支持該命令(見上圖)

2.15、ZREMRANGEBYLEX
  • ZREMRANGEBYLEX移除有序集合中給定的字典區(qū)間的所有成員

語法

ZREMRANGEBYLEX KEY_NAME min max

命令操作

127.0.0.1:6379>zadd zset16 100 aa 100 ab 100 bb 100 bc 100 cc 100 cd 100 dd
(integer) 7
127.0.0.1:6379>zremrangebylex zset16 (bb [cd
(integer) 3
127.0.0.1:6379>zrange zset16 0 -1 withscores
1) "aa"
2) "100"
3) "ab"
4) "100"
5) "bb"
6) "100"
7) "dd"
8) "100"

Java操作

@Test
    public void zRemRangeByLex() {String redisKey = "zSet16";
        redisTemplate.delete(redisKey);

        redisTemplate.opsForZSet().add(redisKey, "aa", 100);
        redisTemplate.opsForZSet().add(redisKey, "ab", 100);
        redisTemplate.opsForZSet().add(redisKey, "bb", 100);
        redisTemplate.opsForZSet().add(redisKey, "bc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cc", 100);
        redisTemplate.opsForZSet().add(redisKey, "cd", 100);
        redisTemplate.opsForZSet().add(redisKey, "dd", 100);

        RedisZSetCommands.Range range = new RedisZSetCommands.Range();
        range.gt("bb");
        range.lte("cd");
        // 移除有序集合中給定的字典區(qū)間的所有成員
        Long count = redisTemplate.opsForZSet().removeRangeByLex(redisKey, range);
        log.info("移除有序集合中給定的字典區(qū)間的所有成員:{}", count);
    }

結(jié)果未生效,官方文檔說明暫不支持該命令(見上圖)

2.16、ZPOPMAX、ZPOPMIN
  • ZPOPMAX彈出分?jǐn)?shù)最高的成員
  • ZPOPMIN彈出分?jǐn)?shù)最低的成員

語法

ZPOPMAX KEY_NAME [COUNT]
ZPOPMIN KEY_NAME [COUNT]

命令操作

127.0.0.1:6379>zadd zset17 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>zpopmax zset17 2
1) "taojianwen"
2) "95"
3) "tangpeng"
4) "92"
127.0.0.1:6379>zpopmin zset17 2
1) "luokaocong"
2) "90"
3) "wanglin"
4) "91"
  • 向集合(zset17)中加入多個(gè)成員:taojianwen、tangpeng、wanglin、luokaocong
  • 彈出集合(zset17)中分?jǐn)?shù)最高的兩個(gè)成員,彈出了taojianwentangpeng
  • 彈出集合(zset17)中分?jǐn)?shù)最低的兩個(gè)成員,彈出了luokaocongwanglin

Java操作

@Test
    public void zPopMaXAndZPopMin() {String redisKey = "zSet17";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple = new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey, tuple);
        // 彈出分?jǐn)?shù)最高的兩個(gè)成員
        Set>typedTuples1 = redisTemplate.opsForZSet().popMax(redisKey, 2);
        log.info("彈出分?jǐn)?shù)最高的兩個(gè)成員:{}", typedTuples1);
        // 彈出分?jǐn)?shù)最低的兩個(gè)成員
        Set>typedTuples2 = redisTemplate.opsForZSet().popMin(redisKey, 2);
        log.info("彈出分?jǐn)?shù)最低的兩個(gè)成員:{}", typedTuples2);
    }
彈出分?jǐn)?shù)最高的兩個(gè)成員:[DefaultTypedTuple [score=95.0, value=taojianwen], DefaultTypedTuple [score=92.0, value=tangpeng]]
彈出分?jǐn)?shù)最低的兩個(gè)成員:[DefaultTypedTuple [score=90.0, value=luokaocong], DefaultTypedTuple [score=91.0, value=wanglin]]
2.17、BZPOPMAX、BZPOPMIN
  • BZPOPMAX阻塞式彈出分?jǐn)?shù)最高的成員
  • BZPOPMIN阻塞式彈出分?jǐn)?shù)最低的成員

語法

命令操作

127.0.0.1:6379>zadd zset18 95.0 taojianwen 92.0 tangpeng 91.0 wanglin 90.0 luokaocong
(integer) 4
127.0.0.1:6379>bzpopmax zset18 10
1) "zset18"
2) "taojianwen"
3) "95"
127.0.0.1:6379>bzpopmin zset18 10
1) "zset18"
2) "luokaocong"
3) "90"

Java操作

@Test
    public void zBPopMaXAndZBPopMin() {String redisKey = "zSet18";
        redisTemplate.delete(redisKey);
        // 添加多個(gè)成員
        Set>tuple = new HashSet<>();
        tuple.add(new DefaultTypedTuple<>("taojianwen", 95.0));
        tuple.add(new DefaultTypedTuple<>("tangpeng", 92.0));
        tuple.add(new DefaultTypedTuple<>("wanglin", 91.0));
        tuple.add(new DefaultTypedTuple<>("luokaocong", 90.0));
        redisTemplate.opsForZSet().add(redisKey, tuple);
        // 阻塞式彈出分?jǐn)?shù)最高的成員,如果沒有,則直到超時(shí)
        ZSetOperations.TypedTupleobjectTypedTuple = redisTemplate.opsForZSet().popMax(redisKey, 10, TimeUnit.SECONDS);
        log.info("彈出分?jǐn)?shù)最高的成員:{}", objectTypedTuple);
        // 阻塞式彈出分?jǐn)?shù)最低的成員,如果沒有,則直到超時(shí)
        ZSetOperations.TypedTupleobjectTypedTuple2 = redisTemplate.opsForZSet().popMin(redisKey, 10, TimeUnit.SECONDS);
        log.info("彈出分?jǐn)?shù)最低的成員:{}", objectTypedTuple2);
    }
彈出分?jǐn)?shù)最高的成員:DefaultTypedTuple [score=95.0, value=taojianwen]
彈出分?jǐn)?shù)最低的成員:DefaultTypedTuple [score=90.0, value=luokaocong]

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:Redis集合(SortedSet)方法使用詳解-創(chuàng)新互聯(lián)
新聞來源:http://bm7419.com/article2/gejoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站營銷、靜態(tài)網(wǎng)站微信公眾號(hào)、ChatGPT用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)