Redis 5种数据类型
INCR / DECR / INCRBY / DECRBYSTRLENGETRANGESETRANGESETRX / SETNXMSET / MGETGETSET2️⃣ Hash(哈希)HMSET / HMGETHGETALLHDELHLENHEXISTSHKEYS / HVALSHINCRBYHSETNX3️⃣ List(列表)LPOP RPOPLINDEXLLENLREMLTRI
文章目录
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>
更多推荐
所有评论(0)