redis 有序集合(sorted set)(redis学习七)

基本命令

入门
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

可视化工具观察

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个 Redis 有序集合的代码实例: ``` import redis # 连接 Redis 数据库 r = redis.Redis(host='localhost', port=6379, db=0) # 添加有序集合数据 r.zadd('my_sorted_set', {'member1': 1, 'member2': 2, 'member3': 3}) # 获取有序集合成员数量 count = r.zcard('my_sorted_set') print('成员数量:', count) # 获取有序集合成员分数区间内的成员数量 count_range = r.zcount('my_sorted_set', 2, 3) print('分数在2-3之间的成员数量:', count_range) # 获取有序集合成员分数 score = r.zscore('my_sorted_set', 'member1') print('member1的分数:', score) # 获取有序集合排名 rank = r.zrank('my_sorted_set', 'member2') print('member2的排名:', rank) # 获取有序集合反向排名 reverse_rank = r.zrevrank('my_sorted_set', 'member2') print('member2的反向排名:', reverse_rank) # 获取有序集合指定排名范围内的成员信息 range_data = r.zrange('my_sorted_set', 0, 1, withscores=True) print('排名在0-1之间的成员信息:', range_data) # 获取有序集合指定分数范围内的成员信息 range_by_score_data = r.zrangebyscore('my_sorted_set', 1, 3, withscores=True) print('分数在1-3之间的成员信息:', range_by_score_data) # 删除有序集合成员 r.zrem('my_sorted_set', 'member1') # 获取所有有序集合成员信息 members = r.zrange('my_sorted_set', 0, -1, withscores=True) print('所有成员信息:', members) # 删除有序集合 r.delete('my_sorted_set') ``` 上述代码演示了 Redis 有序集合的基本操作,包括添加数据、获取数据、删除数据等。通过这个实例,你可以更好地理解 Redis 有序集合的使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值