redis 有序集合(sorted set)(redis學習七)

dengjili發表於2018-12-08

基本命令

入門

localhost:6379> zadd test 1 redis
(integer) 1
localhost:6379> zadd test 2 mysql
(integer) 1
localhost:6379> zadd test 3 oracle
(integer) 1
localhost:6379> zadd test 4 mysql
(integer) 0
localhost:6379> zrange test 0 10
1) "redis"
2) "oracle"
3) "mysql"
localhost:6379> zrange test 0 10 withscores
1) "redis"
2) "1"
3) "oracle"
4) "3"
5) "mysql"
6) "4"

Zadd 命令

用於將一個或多個成員元素及其分數值加入到有序集當中。
如果某個成員已經是有序集的成員,那麼更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上。
分數值可以是整數值或雙精度浮點數。
如果有序集合 key 不存在,則建立一個空的有序集並執行 ZADD 操作。
當 key 存在但不是有序集型別時,返回一個錯誤。

localhost:6379> zadd test 2 java
(integer) 1
localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "oracle"
6) "3"
7) "mysql"
8) "4"

Zcard 命令

用於計算集合中元素的數量。

localhost:6379> zcard test
(integer) 4

Zcount 命令

用於計算有序集合中指定分數區間的成員數量。

localhost:6379> zcount test 1 3
(integer) 3
localhost:6379> zcount test 2 3
(integer) 2

Zincrby 命令

對有序集合中指定成員的分數加上增量 increment
可以通過傳遞一個負數值 increment ,讓分數減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
當 key 不存在,或分數不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
當 key 不是有序集型別時,返回一個錯誤。
分數值可以是整數值或雙精度浮點數。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "oracle"
6) "3"
7) "mysql"
8) "4"
localhost:6379> zincrby test 2 oracle
"5"
localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"

Zinterstore 命令

計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 引數指定,並將該交集(結果集)儲存到 destination 。
預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zrange test2 0 -1 withscores
1) "java"
2) "1"
3) "mysql"
4) "1"
5) "redis"
6) "1"
localhost:6379> zinterstore teststore 2 test test2
(integer) 3
localhost:6379> zrange teststore 0 -1 withscores
1) "redis"
2) "2"
3) "java"
4) "3"
5) "mysql"
6) "5"

Zlexcount 命令

在計算有序集合中指定字典區間內成員數量。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zlexcount test - +
(integer) 4

Zrange

返回有序集中,指定區間內的成員。
其中成員的位置按分數值遞增(從小到大)來排序。
具有相同分數值的成員按字典序(lexicographical order )來排列。
如果你需要成員按
值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。
下標引數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。
你也可以使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"

Zrangebylex

通過字典區間返回有序集合的成員。

localhost:6379> zrange myzset 0 -1 withscores
 1) "a"
 2) "0"
 3) "b"
 4) "0"
 5) "c"
 6) "0"
 7) "d"
 8) "0"
 9) "e"
10) "0"
11) "f"
12) "0"
13) "g"
14) "0"
localhost:6379> zrangebylex myzset 0 -1 - [c
(error) ERR min or max not valid string range item
localhost:6379>  zrangebylex myzset - [c
1) "a"
2) "b"
3) "c"
localhost:6379>  zrangebylex myzset - (c
1) "a"
2) "b"
localhost:6379>  zrangebylex myzset [c (g
1) "c"
2) "d"
3) "e"
4) "f"
localhost:6379> zadd myzset 1 h
(integer) 1
localhost:6379> zrangebylex myzset [e [h
1) "e"
2) "f"
3) "g"
4) "h"
localhost:6379>

Zrangebyscore

返回有序集合中指定分數區間的成員列表。有序整合員按分數值遞增(從小到大)次序排列。
具有相同分數值的成員按字典序來排列(該屬性是有序集提供的,不需要額外的計算)。
預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給引數前增加 ( 符號來使用可選的開區間 (小於或大於)。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zrangebyscore test (2 5
1) "mysql"
2) "oracle"
localhost:6379> zrangebyscore test (2 (5
1) "mysql"

Zrank

返回有序集中指定成員的排名。其中有序整合員按分數值遞增(從小到大)順序排列。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zrank test java
(integer) 1
localhost:6379> zrank test oracle
(integer) 3

Zrem 命令

用於移除有序集中的一個或多個成員,不存在的成員將被忽略。
當 key 存在但不是有序集型別時,返回一個錯誤。

localhost:6379> zrange myzset 0 -1 withscores
 1) "a"
 2) "0"
 3) "b"
 4) "0"
 5) "c"
 6) "0"
 7) "d"
 8) "0"
 9) "e"
10) "0"
11) "f"
12) "0"
13) "g"
14) "0"
15) "h"
16) "1"
localhost:6379> zrem myzset a e
(integer) 2
localhost:6379> zrange myzset 0 -1 withscores
 1) "b"
 2) "0"
 3) "c"
 4) "0"
 5) "d"
 6) "0"
 7) "f"
 8) "0"
 9) "g"
10) "0"
11) "h"
12) "1"

Zremrangebylex 命令

用於移除有序集合中給定的字典區間的所有成員。

localhost:6379> zrange myzset 0 -1
1) "b"
2) "c"
3) "d"
4) "f"
5) "g"
6) "h"
localhost:6379> zremrangebylex myzset [b [f
(integer) 4
localhost:6379> zrange myzset 0 -1
1) "g"
2) "h"

Zremrangebyrank 命令

用於移除有序集中,指定排名(rank)區間內的所有成員。

localhost:6379> zrange myzset 0 -1
1) "a"
2) "b"
3) "c"
4) "g"
5) "h"
localhost:6379> zrank myzset b
(integer) 1
localhost:6379> zrank myzset g
(integer) 3
localhost:6379> zremrangebyrank myzset 1 3
(integer) 3
localhost:6379> zrange myzset 0 -1
1) "a"
2) "h"

Zremrangebyscore 命令

用於移除有序集中,指定分數(score)區間內的所有成員。

localhost:6379> zrange myzset 0 -1
1) "a"
2) "h"
localhost:6379> zremrangebyscore myzset 0 0
(integer) 1
localhost:6379> zrange myzset 0 -1
1)	"h"

Zrevrange 命令

返回有序集中,指定區間內的成員。
其中成員的位置按分數值遞減(從大到小)來排列。
具有相同分數值的成員按字典序的逆序(reverse lexicographical order)排列。
除了成員按分數值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zrevrange test 0 -1 withscores
1) "oracle"
2) "5"
3) "mysql"
4) "4"
5) "java"
6) "2"
7) "redis"
8) "1"

Zrevrangebyscore

返回有序集中指定分數區間內的所有的成員。有序整合員按分數值遞減(從大到小)的次序排列。
具有相同分數值的成員按字典序的逆序(reverse lexicographical order )排列。

localhost:6379> zrevrangebyscore test 4 2 withscores
1) "mysql"
2) "4"
3) "java"
4) "2"

Zrevrank 命令

返回有序集中成員的排名。其中有序整合員按分數值遞減(從大到小)排序。
排名以 0 為底,也就是說, 分數值最大的成員排名為 0 。
使用 ZRANK 命令可以獲得成員按分數值遞增(從小到大)排列的排名。

localhost:6379> zrevrange test 0 -1 withscores
1) "oracle"
2) "5"
3) "mysql"
4) "4"
5) "java"
6) "2"
7) "redis"
8) "1"
localhost:6379> zrevrank test mysql
(integer) 1

Zscore 命令

返回有序集中,成員的分數值。 如果成員元素不是有序集 key 的成員,或 key 不存在,返回 nil 。

localhost:6379> zrange test 0 -1 withscores
1) "redis"
2) "1"
3) "java"
4) "2"
5) "mysql"
6) "4"
7) "oracle"
8) "5"
localhost:6379> zscore test mysql
"4"

Zunionstore 命令

計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 引數指定,並將該並集(結果集)儲存到 destination 。
預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和 。

localhost:6379> zrange programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
localhost:6379> zrange manager 0 -1 WITHSCORES
1) "peter"
2) "1500"
3) "herry"
4) "2000"
5) "mary"
6) "3500"
7) "bob"
8) "4000"
localhost:6379> zunionstore salary 2 programmer manager weights 0 2
(integer) 6
localhost:6379> ZRANGE salary 0 -1 WITHSCORES
 1) "jack"
 2) "0"
 3) "tom"
 4) "0"
 5) "peter"
 6) "3000"
 7) "herry"
 8) "4000"
 9) "mary"
10) "7000"
11) "bob"
12) "8000"

spring呼叫redis

pom.xml配置 核心依賴

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>
		<!-- slf4j日誌統一管理 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
		</dependency>
		<!-- spring中的redis -->
		<dependency>
		    <groupId>org.springframework.data</groupId>
		    <artifactId>spring-data-redis</artifactId>
		    <version>1.8.4.RELEASE</version>
		</dependency>

zset-redis.xml spring配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd   
    http://www.springframework.org/schema/context   
    http://www.springframework.org/schema/context/spring-context-4.3.xsd"
    default-lazy-init="false">
    
    <!-- 佔位符配置檔案 -->  
    <!-- <context:property-placeholder location="classpath:redis.properties" />   -->
    
    <!-- redis 連線池配置-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="50" />
        <property name="maxTotal" value="100" />
        <property name="maxWaitMillis" value="20000" />
    </bean>

    <!-- Spring-redis連線池工廠配置 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="127.0.0.1" />
        <property name="port" value="6379" />
        <property name="timeout" value="2000" />
        <property name="poolConfig" ref="poolConfig" />
    </bean>
    
	<!-- 序列化 String型別 -->
	<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
	<!-- 序列化 物件 -->
	<!-- <bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> -->

    <!-- redisTemplate 定義 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer" ref="stringRedisSerializer" />
        <property name="valueSerializer" ref="stringRedisSerializer" />
    </bean>
    
</beans>

測試程式碼1

package redis.zset;

import java.util.HashSet;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;

public class RedisZsetTest {

	private static final Logger logger = LoggerFactory.getLogger(RedisZsetTest.class);

	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("redis-conf/zset/zset-redis.xml");
		RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
		ZSetOperations opsForZSet = redisTemplate.opsForZSet();
		Set<TypedTuple<String>> set1 = new HashSet<>();
		Set<TypedTuple<String>> set2 = new HashSet<>();

		int j = 9;
		for (int i = 1; i < 10; i++) {
			j--;
			Double score1 = Double.valueOf(i);
			String value1 = "x" + i;
			Double score2 = Double.valueOf(j);
			String value2 = j % 2 == 1 ? "y" + j : "x" + j;

			TypedTuple<String> typedTuple1 = new DefaultTypedTuple<String>(value1, score1);
			TypedTuple<String> typedTuple2 = new DefaultTypedTuple<String>(value2, score2);
			set1.add(typedTuple1);
			set2.add(typedTuple2);
		}
		// 1.新增
		opsForZSet.add("zset1", set1);
		opsForZSet.add("zset2", set2);
		// 2.讀取元素,但是不返回分數
		Set zset1 = opsForZSet.range("zset1", 0, -1);
		Set zset2 = opsForZSet.range("zset2", 0, -1);
		logger.debug("zset1所有值值:{}", zset1);
		logger.debug("zset1所有值值:{}", zset2);
		// 3.求元素個數
		Long zCard = opsForZSet.zCard("zset1");
		logger.debug("zset1的元素個數:{}", zCard);
		// 4.求分數在3-6之間的元素個數
		Long count = opsForZSet.count("zset1", 6, 9);
		logger.debug("zset1數在3-6之間的元素個數:{}", count);
		// 5.讀取元素,並返回分數
		Set<TypedTuple<String>> rangeWithScores1 = opsForZSet.rangeWithScores("zset1", 0, -1);
		Set<TypedTuple<String>> rangeWithScores2 = opsForZSet.rangeWithScores("zset2", 0, -1);
		logger.debug("zset1所有值值:{}", rangeWithScores1);
		for (TypedTuple<String> object : rangeWithScores1) {
			Double score = object.getScore();
			String value = object.getValue();
			logger.debug("值:{}, 分數:{}", value, score);
		}
		logger.debug("zset1所有值值:{}", rangeWithScores2);
		for (TypedTuple<String> object : rangeWithScores2) {
			Double score = object.getScore();
			String value = object.getValue();
			logger.debug("值:{}, 分數:{}", value, score);
		}
		// 6.交集,分數相加
		opsForZSet.intersectAndStore("zset1", "zset2", "inter_zset");
		Set<TypedTuple<String>> inter_zset = opsForZSet.rangeWithScores("inter_zset", 0, -1);
		logger.debug("zset1所有值值:{}", inter_zset);
		for (TypedTuple<String> object : inter_zset) {
			Double score = object.getScore();
			String value = object.getValue();
			logger.debug("值:{}, 分數:{}", value, score);
		}
	}
}

視覺化工具 redis-desktop-manager下載

redis-desktop-manager-0.9.99.zip工具下載:
連結:https://pan.baidu.com/s/1BB-MvTfx6T1SDD_eq5tq5w
提取碼:snby

視覺化工具觀察

在這裡插入圖片描述

相關文章