3.3 Redis 5种数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

1️⃣ String(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的一个键值最大能存储 512MB。

类似于Redis中String这样的使用场景,value值可以是字符串,也可以是其他类型

常见用途:

  • 计数器
  • 统计多单位的数量
  • 一个用户的粉丝数
  • 一个有过期时间的验证码
SET / GET

设置一个 key 的 value 值

获取一个 kye 的 value 值

# 示例:

127.0.0.1:6379> SET name "tom"		# 设置一个 key 的 value 值
OK
127.0.0.1:6379> GET name			# 获取一个 key 的 value 值
"tom"
127.0.0.1:6379> APPEND name " and xiaoming"		# 追加字符串,如果当前 key 不存在,那么就新增一个 key 的值,类似于 set
(integer) 16
127.0.0.1:6379> get name
"tom and xiaoming"
127.0.0.1:6379> STRLEN name			# STRLEN 获取字符串的长度
(integer) 16

INCR / DECR / INCRBY / DECRBY

INCR

对存储在指定key的数值执行原子的加1操作。如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0

如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。

这个操作仅限于64位的有符号整型数据。

注意: 由于redis并没有一个明确的类型来表示整型数据,所以这个操作是一个字符串操作。

执行这个操作的时候,key对应存储的字符串被解析为10进制的64位有符号整型数据

事实上,Redis 内部采用整数形式(Integer representation)来存储对应的整数值,所以对该类字符串值实际上是用整数保存,也就不存在存储整数的字符串表示(String representation)所带来的额外消耗

DECR

对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。

# 示例:
127.0.0.1:6379> set num 3
127.0.0.1:6379> INCR num			# 对存储在指定 key 的数值执行原子的加1操作,如果指定的 key 不存在,那么在执行 incr 操作之前,会先将它的值设定为0,注意:这个操作只能为数字
(integer) 4
127.0.0.1:6379> get num
"4"
127.0.0.1:6379> DECR num			# 对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0,可以为负值。注意:这个操作只能为数字,和 incr 相反
(integer) 3
127.0.0.1:6379> get num
"3"
127.0.0.1:6379> INCRBY num 10		# 设置步长,指定增量 10
(integer) 13
127.0.0.1:6379> get num
"13"
127.0.0.1:6379> DECRBY num 3		# 设置步长,指定减量 3
(integer) 10
127.0.0.1:6379> get num
"10"
STRLEN

查看一个字符串长度

# 示例:
127.0.0.1:6379> set demo "hello world"	# 设置一个 demo 的值
OK
127.0.0.1:6379> STRLEN demo
(integer) 11
GETRANGE

截取字符串

# 示例:
127.0.0.1:6379> set demo "hello world"	# 设置一个 demo 的值
OK
127.0.0.1:6379> STRLEN demo
(integer) 11
127.0.0.1:6379> GETRANGE demo 1 4		# 截取指定下标间的字符串[1 4]
"ello"
127.0.0.1:6379> GETRANGE demo 0 -1		# 截取所有字符串[0 -1],和 get 一样
"hello world"
SETRANGE

替换字符串内容

# 示例:
127.0.0.1:6379> set demo1 1234
OK
127.0.0.1:6379> get demo1
"1234"
127.0.0.1:6379> SETRANGE demo1 2 xxx	# 使用 SETRANGE 替换指定下标内容以及之后的内容
(integer) 5
127.0.0.1:6379> get demo1
"12xxx"
127.0.0.1:6379>
SETRX / SETNX

setex (set with expire) # 设置过期时间

setnx (set if not exist) # 不存在的时候在设置 (常在分布式锁中使用)

# 示例:
127.0.0.1:6379> SETEX demo2 10 "hello world"	# 设置一个值在 10 秒后过期
OK
127.0.0.1:6379> ttl demo2
(integer) 4
127.0.0.1:6379> get demo2
(nil)
127.0.0.1:6379> SETNX myname "mysql"			# 如果 myname 这个 key 不存在,那么则创建 myname
(integer) 1
127.0.0.1:6379> get myname
"mysql"
127.0.0.1:6379> SETNX myname "mariadb"			# 如果 myname 这个 key 存在,则创建失败,使用这个参数可以保存已经存在的值不会被修改
(integer) 0										# 返回 0 为执行失败,返回 1 则执行成功
127.0.0.1:6379> get myname
"mysql"
127.0.0.1:6379>
MSET / MGET

批量设置

批量获取

# 示例:
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3		# 批量设置
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> MGET k1 k2 k3				# 批量获取
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 v1 k4 v4			# msetnx 是一个原子性的操作,要么一起成功,要么一起失败,这里 k1 v1 已经存在,所以整体是失败的,k4 也就不会被创建
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>

# 设置对象
127.0.0.1:6379> MSET user:1 {name:tomc,age:18} user:2 {name:xiaoming,age:10}	# 设置一个 user:1 对象,他的值为一个 json 串来保存一个对象
OK
127.0.0.1:6379> mget user:1 user:2
1) "{name:tomc,age:18}"
2) "{name:xiaoming,age:10}"
127.0.0.1:6379> MSET user:3:name zhangshan user:3:age 18 user:4:name lisi user:4:age 17 	# 或者设计成 user:{id}:{field} 这种格式也可以
OK
127.0.0.1:6379> MGET user:3:name user:4:age
1) "zhangshan"
2) "17"
GETSET

GETSET可以和INCR一起使用实现支持重置的计数功能。

举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。这可以通过GETSET mycounter “0”来实现

# 示例:
127.0.0.1:6379> INCR num
(integer) 1
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> INCR num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> GETSET num 0
"2"
127.0.0.1:6379> get num
"0"
127.0.0.1:6379> 
2️⃣ Hash(哈希)

在这里插入图片描述

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。

但hash设计不是为了存储大量对象的,切记不可滥用,更不可以将hash作为对象列表使用

hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)

hgetall操作可以获取全部属性,如果内部fiekd过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。

每个 hash 可以存储 232 -1 键值对(40多亿)

HSET / HGET

设置 key 指定的哈希集中指定字段的值。

如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。

如果字段在哈希集中存在,它将被重写,重写使用 HMSET。

# 示例:
127.0.0.1:6379> hset student name tom age 19
(integer) 2
127.0.0.1:6379> HGET student name		# 设置 key 指定的哈希集中指定字段的值
"tom"
127.0.0.1:6379> HGET student age		# 返回 key 指定的哈希集中该字段所关联的值
"19"
127.0.0.1:6379>
HMSET / HMGET

设置 key 指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联

HMGET 返回 key 指定的哈希集中指定字段的值。

HMGET 对于哈希集中不存在的每个字段,返回 nil 值。因为不存在的keys被认为是一个空的哈希集,对一个不存在的 key 执行 HMGET 将返回一个只含有 nil 值的列表

# 示例:
127.0.0.1:6379> hset student name tom age 19
(integer) 2
127.0.0.1:6379> HGET student name
"tom"
127.0.0.1:6379> HGET student age
"19"
127.0.0.1:6379> HSET student name "xiaoming"				# HSET 不能重写集合中存在的元素,要使用 HMSET
(integer) 0
127.0.0.1:6379> HMSET student name "xiaoming"				# HMSET 可以重写集合中存在的元素
OK
127.0.0.1:6379> HGET student name age						# HGET 只能获取一个指定的元素值
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> HMGET student name age						# HMGET 可以获取多个指定的元素值
1) "xiaoming"
2) "19"
127.0.0.1:6379> 
HGETALL

获取集合中所有的键值对

# 示例:
127.0.0.1:6379> HGETALL student
1) "name"
2) "xiaoming"
3) "age"
4) "19"
127.0.0.1:6379>
HDEL

删除指定的值

# 示例:
127.0.0.1:6379> HDEL student name		# 删除 hash 指定的 key 值,这样 value 也就没有了
(integer) 1
127.0.0.1:6379> HGETALL student
1) "age"
2) "19"
127.0.0.1:6379>
HLEN

查看 hash 列表字段数量

# 示例:
127.0.0.1:6379> HGETALL student
1) "age"
2) "19"
3) "name"
4) "xiaoming"
127.0.0.1:6379> HLEN student
(integer) 2
127.0.0.1:6379>
HEXISTS

判断 hash 列表中指定 key 字段是否存在

127.0.0.1:6379> HEXISTS student name
(integer) 1
127.0.0.1:6379> 
HKEYS / HVALS

获取所有的 key

获取所有的 value

127.0.0.1:6379> HKEYS student
1) "age"
2) "name"
127.0.0.1:6379> HVALS student
1) "19"
2) "xiaoming"
127.0.0.1:6379>
HINCRBY

增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0

HINCRBY 支持的值的范围限定在 64位 有符号整数

# 示例:
127.0.0.1:6379> HSET student id 1001
(integer) 1
127.0.0.1:6379> HGET student id
"1001"
127.0.0.1:6379> HGETALL student
1) "age"
2) "19"
3) "name"
4) "xiaoming"
5) "id"
6) "1001"
127.0.0.1:6379> HINCRBY student id 1			# 增加 1 
(integer) 1002
127.0.0.1:6379> HINCRBY student id -1			# 减少 1
(integer) 1001
127.0.0.1:6379>
HSETNX

只在 key 指定的哈希集中不存在指定的字段时,设置字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。

# 示例:
127.0.0.1:6379> HSETNX student sex m		# 如果不存在可以设置
(integer) 1
127.0.0.1:6379> HSETNX student sex w		# 如果存在则不可以设置
(integer) 0
127.0.0.1:6379>
3️⃣ List(列表)

在这里插入图片描述

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

LPUSH RPUSH

从左边或者右边添加参数

# 示例:
127.0.0.1:6379> LPUSH num 1						# 从左边添加一个元素(将一个或多个值插入到列表的头部)
(integer) 1
127.0.0.1:6379> LPUSH num 2 3					# 从左边一次添加多个元素
(integer) 3
127.0.0.1:6379> LRANGE num 0 -1					# 通过元素下标查看添加的元素,可知从左边插入的值是最新插入的是在最左边
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> RPUSH num 4						# 从右边添加一个元素(或者多个元素),从右边最新插入的值是在最右边
(integer) 4
127.0.0.1:6379> LRANGE num 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> RPUSH num 5 6
(integer) 6
127.0.0.1:6379> LRANGE num 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
6) "6"

 
LPOP RPOP

从左边或者右边移除参数

# 移除 list 值
127.0.0.1:6379> LPOP num 				# 从左边移除一个值
"7"
127.0.0.1:6379> LRANGE num 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
6) "6"
7) "8"
127.0.0.1:6379> LPOP num 2				# 从左边一次移除两个值
1) "3"
2) "2"
127.0.0.1:6379> LRANGE num 0 -1
1) "1"
2) "4"
3) "5"
4) "6"
5) "8"
127.0.0.1:6379> RPOP num 2				# 从右边一次移除两个值
1) "8"
2) "6"
127.0.0.1:6379> LRANGE num 0 -1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379>
LINDEX

通过下标查找内容

# 通过下标查找值
127.0.0.1:6379> LRANGE num 0 -1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379> LINDEX num 2			# 查找下标为 2 的值
"5"
127.0.0.1:6379>
LLEN

查看 list 长度

# 查看 list 长度
127.0.0.1:6379> LRANGE num 0 -1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379> LLEN num
(integer) 3
127.0.0.1:6379> 
LREM

从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:

  • count > 0: 从头往尾移除值为 value 的元素。
  • count < 0: 从尾往头移除值为 value 的元素。
  • count = 0: 移除所有值为 value 的元素。

比如, LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。

需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。

# 示例:
127.0.0.1:6379> LPUSH mylist "hello" 1 "hello" 2 "hello" 3 "hello" 4
(integer) 8
127.0.0.1:6379> LRANGE mylist 0 -1
1) "4"
2) "hello"
3) "3"
4) "hello"
5) "2"
6) "hello"
7) "1"
8) "hello"
127.0.0.1:6379> LREM mylist 2 hello			# 移除 list 列表中指定个数的 value,精确匹配
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "4"
2) "3"
3) "2"
4) "hello"
5) "1"
6) "hello"
127.0.0.1:6379> 
LTRIM

截取下标指定范围内的值

# 截取指定范围内的值
127.0.0.1:6379> LPUSH mylist one
(integer) 1
127.0.0.1:6379> LPUSH mylist two
(integer) 2
127.0.0.1:6379> LPUSH mylist three
(integer) 3
127.0.0.1:6379> LTRIM mylist 1 -1		# 通过下标截取指定的长度,原本 list 已经被改变,剩下了被截取的元素
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "two"
2) "one"
127.0.0.1:6379> 
RPOPLPUSH

移除一个列表最后一个位置的元素到另外一个列表的第一个位置

# 示例:
127.0.0.1:6379> RPUSH mylist "one" "two" "three"
(integer) 3
127.0.0.1:6379> RPUSH myotherlist "one" "two" "three"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> LRANGE myotherlist 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> RPOPLPUSH mylist myotherlist	# 移除列表的最后一个元素(列表尾部元素), 并把该元素存储到其他的列表的第一个元素位置(列表头部),如果新的列表不存在则会创建
"three"
127.0.0.1:6379> LRANGE mylist 0 -1				# 查看原来的列表
1) "one"
2) "two"
127.0.0.1:6379> LRANGE myotherlist 0 -1			# 查看移动之后的列表
1) "three"
2) "one"
3) "two"
4) "three"
127.0.0.1:6379>
LSET

将列表中指定下标的值替换为另外一个值,更新操作

127.0.0.1:6379> EXISTS mylist					# 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset mylist 1 test				# 如果不存在更新时则会报错
(error) ERR no such key
127.0.0.1:6379> LPUSH mylist demo
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 -1
1) "demo"
127.0.0.1:6379> LSET mylist 0 test				# 更新当前下标值
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "test"
127.0.0.1:6379> LSET mylisy 1 other				# 如果下标不存在,则会报错
(error) ERR no such key
127.0.0.1:6379>
LINSERT

在列表中指定内容的前后插入一个新的值

# 示例:
127.0.0.1:6379> RPUSH mylist 0 1 2 3
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> LINSERT mylist before "1" a			# 在 1 的前面插入 a
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "a"
3) "1"
4) "2"
5) "3"
127.0.0.1:6379> LINSERT mylist after "1" b			# 在 1 的后面插入 b
(integer) 6
127.0.0.1:6379> LRANGE mylist 0 -1
1) "0"
2) "a"
3) "1"
4) "b"
5) "2"
6) "3"
127.0.0.1:6379>
4️⃣ Set(集合)

Redis 的 Set 是 string 类型的无序集合。

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

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

SADD

往 sadd 集合中添加元素

# 示例:
127.0.0.1:6379> SADD dbname redis			# 往 set 集合中添加元素	
(integer) 1
127.0.0.1:6379> SADD dbname mongodb
(integer) 1
127.0.0.1:6379> SADD dbname mysql oracle
(integer) 2
127.0.0.1:6379> SMEMBERS dbname				# 查看 set 集合中的值
1) "mongodb"
2) "redis"
3) "oracle"
4) "mysql"
127.0.0.1:6379> SADD dbname mysql
(integer) 0
127.0.0.1:6379>

**注意:**以上实例中 mysql 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

SMEMBERS

查看 set 集合中的值

127.0.0.1:6379> SADD dbname mysql oracle
(integer) 2
127.0.0.1:6379> SMEMBERS dbname
1) "oracle"
2) "mysql"
SISMEMBER

判断集合中是否存在指定的参数值

127.0.0.1:6379> SADD dbname mysql
(integer) 1
127.0.0.1:6379> SADD dbname redis
(integer) 1
127.0.0.1:6379> SMEMBERS dbname
1) "redis"
2) "mysql"
127.0.0.1:6379> SISMEMBER dbname mysql		# 判断集合中是否存在 mysql 这个值,存在返回 1
(integer) 1
127.0.0.1:6379> SISMEMBER dbname oracle		# 判断集合中是否存在 Oracle 这个值,不存在返回 0
(integer) 0
127.0.0.1:6379>
SCARD

获取 set 集合中的内容元素的个数

127.0.0.1:6379> SCARD dbname
(integer) 2
127.0.0.1:6379>
SREM

移除集合中指定的元素

127.0.0.1:6379> SMEMBERS dbname
1) "redis"
2) "mysql"
127.0.0.1:6379> SREM dbname mysql		# 移除集合中的 mysql 元素
(integer) 1
127.0.0.1:6379> SMEMBERS dbname
1) "redis"
127.0.0.1:6379>
SRANDMEMBER

从集合中随机得到一个值

# 示例:
127.0.0.1:6379> SADD num 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> SMEMBERS num
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> SRANDMEMBER num
"7"
127.0.0.1:6379> SRANDMEMBER num				# 随机抽选出一个元素
"1"
127.0.0.1:6379> SRANDMEMBER num
"4"
127.0.0.1:6379> SRANDMEMBER num 2			# 随机抽选出指定个数的元素
1) "9"
2) "7"
127.0.0.1:6379> SRANDMEMBER num 2
1) "9"
2) "1"
127.0.0.1:6379> 
SPOP

随机移除一个 set 集合中的元素

127.0.0.1:6379> SMEMBERS num
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> SPOP num			# 随机移除一个元素
"4"
127.0.0.1:6379> SMEMBERS num
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"
127.0.0.1:6379> SPOP num 2			# 随机移除多个元素
1) "3"
2) "6"
127.0.0.1:6379> SMEMBERS num
1) "1"
2) "2"
3) "5"
4) "7"
5) "8"
6) "9"
127.0.0.1:6379>
SMOVE

将一个指定的值移动到另外一个 set 集合当中

# 示例:
127.0.0.1:6379> SADD myset redis mysql
(integer) 2
127.0.0.1:6379> SADD dbname oracle mairadb
(integer) 2
127.0.0.1:6379> SMOVE myset dbname mysql		# 将一个 set 集合中的元素转移到另外一个 set 集合当中
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "redis"
127.0.0.1:6379> SMEMBERS dbname
1) "mysql"
2) "oracle"
3) "mairadb"
127.0.0.1:6379> 
SDIFF

返回一个集合与给定集合的差集的元素

# 示例:
127.0.0.1:6379> SADD key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SADD key2 "a" "c"
(integer) 2
127.0.0.1:6379> SADD key3 "c" "e"
(integer) 2
127.0.0.1:6379> SDIFF key1 key2 key3		# 返回 key1 与其他集合相比的差集,不存在的key认为是空集
1) "b"
2) "d"
127.0.0.1:6379> SMEMBERS key1
1) "b"
2) "d"
3) "c"
4) "a"
127.0.0.1:6379>
SINTER

返回指定所有的集合的成员的交集

# 示例:
127.0.0.1:6379> SADD key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SADD key2 "a" "c"
(integer) 2
127.0.0.1:6379> SADD key3 "c" "e"
(integer) 2
127.0.0.1:6379> SINTER key1 key2 key3	# 返回指定所有的集合的成员的交集,例如网络平台的 “共同关注” 功能
1) "c"
127.0.0.1:6379> 
SUNION

返回给定的多个集合的并集中的所有成员

# 示例:
127.0.0.1:6379> SADD key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SADD key2 "a" "c"
(integer) 2
127.0.0.1:6379> SADD key3 "c" "e"
(integer) 2
127.0.0.1:6379> SUNION key1 key2 key3
1) "b"
2) "c"
3) "a"
4) "d"
5) "e"
127.0.0.1:6379> 
5️⃣ zset(sorted set:有序集合)

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

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

zset的成员是唯一的,但分数(score)却可以重复。

使用场景参考:

案例:zset是Redis的数据类型,可以排序,生活中也有案例,班级成绩,员工工资

设置权重,1、普通消息;2、重要消息;添加权重进行消息判断其重要性

ZADD

将所有指定成员添加到键为key有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。

如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。如果key存在,但是类型不是有序集合,将会返回一个错误应答。

分数值是一个双精度的浮点型数字字符串。+inf-inf都是有效值。

ZADD 参数(options) (>= Redis 3.0.2)

ZADD 命令在key后面分数/成员(score/member)对前面支持一些参数,他们是:

  • XX: 仅仅更新存在的成员,不添加新成员。
  • NX: 不更新存在的成员。只添加新成员。
  • CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
  • INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
# 示例:
127.0.0.1:6379> ZADD myset 1 one			# 添加一个值
(integer) 1
127.0.0.1:6379> ZADD myset 1 asd
(integer) 1
127.0.0.1:6379> ZADD myset 2 two 3 three	# 添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1			# 遍历集合(zset 是有序集合)
1) "asd"
2) "one"
3) "two"
4) "three"
127.0.0.1:6379>
ZRANGEBYSCORE

元素被认为是从低分到高分排序的。

具有相同分数的元素按字典序排列(这个根据redis对有序集合实现的情况而定,并不需要进一步计算)

可选参数WITHSCORES会返回元素和其分数,而不只是元素

min和max可以是-inf和+inf,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用ZRANGEBYSCORE这类命令。

默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间(小于或大于)

127.0.0.1:6379> ZADD height 1.8 xiaoming
(integer) 1
127.0.0.1:6379> ZADD height 1.7 xiaohong
(integer) 1
127.0.0.1:6379> ZADD height 1.9 zhangshan
(integer) 1
127.0.0.1:6379> ZADD heigth 1.8 wangwu
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE height -inf +inf		# 从小到大排序
1) "xiaohong"
2) "wangwu"
3) "xiaoming"
4) "zhangshan"
127.0.0.1:6379>
127.0.0.1:6379> ZRANGEBYSCORE height -inf 1.8 withscores		# 获取区间内的值,使用 withscores 可以显示 score 的值
1) "xiaohong"
2) "1.7"
3) "wangwu"
4) "1.8"
5) "xiaoming"
6) "1.8"
127.0.0.1:6379>
ZREVRANGE

返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。

具有相同score值的成员按字典序的反序排列。 除了成员按score值递减的次序排列这一点外,ZREVRANGE命令的其他方面和ZRANGE命令一样

# 示例:
127.0.0.1:6379> ZREVRANGE height 0 -1		# 从大到小进行排序
1) "zhangshan"
2) "xiaoming"
3) "wangwu"
127.0.0.1:6379> ZREVRANGE height 0 -1 withscores
1) "zhangshan"
2) "1.8999999999999999"
3) "xiaoming"
4) "1.8"
5) "wangwu"
6) "1.8"
127.0.0.1:6379>
ZREM

移除一个元素

# 示例:
127.0.0.1:6379> ZRANGE height 0 -1
1) "xiaohong"
2) "wangwu"
3) "xiaoming"
4) "zhangshan"
127.0.0.1:6379> ZREM height xiaohong	# 将 xiaohong 移除
(integer) 1
127.0.0.1:6379> ZRANGE height 0 -1
1) "wangwu"
2) "xiaoming"
3) "zhangshan"
127.0.0.1:6379>
ZCARD

获取集合中的个数

# 示例
127.0.0.1:6379> ZCARD height
(integer) 3
127.0.0.1:6379>
ZCOUNT

统计指定区间内有多少元素

127.0.0.1:6379> ZADD myset 1 one
(integer) 1
127.0.0.1:6379> ZADD myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZCOUNT myset 1 3
(integer) 3
127.0.0.1:6379> ZCOUNT myset 1 2
(integer) 2
127.0.0.1:6379> 

 
 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐