redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型

主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash

image-20230901163317120

结构类型 结构存储的值 结构的读写能力
String字符串 可以是字符串、整数或浮点数 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
List列表 一个链表,链表上的每个节点都包含一个字符串 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set集合 包含字符串的无序集合 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Hash散列 包含键值对的无序散列表 包含方法有添加、获取、删除单个元素
Zset有序集合 和散列一样,用于存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

String字符串

应用场景:
常规计数:微博数、粉丝数、直播平台

简介:

String是redis最基本的类型,一个key对应一个value。

  • String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
  • String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M

set (key) (value)

设置键值对

# 创建一个key
127.0.0.1:6379> set name test
OK

setex (key) (seconds) expire

设置键过期时间

# 创建一个key并设置生存时间
127.0.0.1:6379> set age 18 ex 100
OK

mset (key1) (value1) (key2) (value2)

用于同时设置一个或多个 key-value 对

# 创建多个key
127.0.0.1:6379> mset name test age 19 gender m
OK
127.0.0.1:6379> KEYS *
1) "name"
2) "gender"
3) "age"

GETSET

用来获取 key 所对应的 value,并对 key 进行重置,如果没有则创建

#查看value是否有值,有则显示,没有则创建key
127.0.0.1:6379> GETSET name bbbccc
"bbbccc"
127.0.0.1:6379> GETSET test bbbccc
(nil)
127.0.0.1:6379> GET test
"bbbccc"
127.0.0.1:6379> 

incr (key)

value + 1(默认加一)

# 计数器 递增(默认步长1)
127.0.0.1:6379> INCR age
(integer) 22
127.0.0.1:6379> INCR age
(integer) 23
127.0.0.1:6379> INCR age
(integer) 24
# 计数器 指定步长 递增
127.0.0.1:6379> INCRBY age 10
(integer) 34
127.0.0.1:6379> INCRBY age 10
(integer) 44
127.0.0.1:6379> INCRBY age 10
(integer) 54
# 计数器 浮点型 递增    //数值过大递增可能会出现异常
127.0.0.1:6379> INCRBYFLOAT age 1.1
"22.1"
127.0.0.1:6379> INCRBYFLOAT age 1.1
"23.2"
127.0.0.1:6379> INCRBYFLOAT age 1.1
"24.3"
127.0.0.1:6379> INCRBYFLOAT age 1.1
"25.4"

decr (key)

value - 1(默认减一)

# 计数器 递减(默认步长1)
127.0.0.1:6379> DECR age
(integer) 53
127.0.0.1:6379> DECR age
(integer) 52
127.0.0.1:6379> DECR age
(integer) 51
# 计数器 指定步长 递减
127.0.0.1:6379> DECRBY age 10
(integer) 41
127.0.0.1:6379> DECRBY age 10
(integer) 31
127.0.0.1:6379> DECRBY age 10
(integer) 21

del

删除一个key

#查看所有key
127.0.0.1:6379> KEYS *
1) "test"
2) "name"
3) "age"
#删除test
127.0.0.1:6379> del test
(integer) 1
127.0.0.1:6379> KEYS *
1) "name"
2) "age"

setrange (key) (begin) (xxxx)

从begin下标开始设置xxx值,将原有的替换掉

#查看value
127.0.0.1:6379> get name
"bbbccc"
#修改第一个为a   //元素值是从0开始算起,所有这里是把第一个b替换a
127.0.0.1:6379> SETRANGE name 0 a
(integer) 6
127.0.0.1:6379> get name
"abbccc"
127.0.0.1:6379> 

getrange (key) (begin) (end)

获取[begin,end]下标范围内的值,如果是(0,-1)就是获取所有值

127.0.0.1:6379> GETRANGE name 0 -1
"abbccc"
127.0.0.1:6379> 

append (key) (value)

向指定的key的value后追加字符串

## 字符串追加
127.0.0.1:6379> set name test
OK
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> append name 123
(integer) 7
127.0.0.1:6379> get name
"test123"

EXPIRE (key)num:

给key设定一个生存时间

127.0.0.1:6379> EXPIRE name 100
(integer) 1

PERSIST (key)

取消一个key的生产时间

127.0.0.1:6379> PERSIST name
(integer) 0

注意:当使用ttl查看key生存时间的时候,返回-1或者-2的时候:

  • -1: key存在,并且没有生存周期
  • -2:key不存在或者key生存周期到了

**keys ***

*查看所有key(如果指定key,则可以判断这个key值是否存在,keys 慎用,在企业中数据量庞大的情况下有很大风险程度)**

#查看所有key
127.0.0.1:6379> KEYS *
1) "name"
2) "age"
#查看指定key
127.0.0.1:6379> KEYS  name
1) "name"

get (key)

返回key值

## 查看key的值
127.0.0.1:6379> get name
"test123"

strlen key

返回key所存储的字符串的长度

## 查看字符串长度
127.0.0.1:6379> strlen name
(integer) 7

type (key)

返回字符串类型

## 查看字符串类型
127.0.0.1:6379> type name
string

mget

根据多个key获取多个String类型的value

127.0.0.1:6379> KEYS *
1) "name"
2) "age"
#查看两个key
127.0.0.1:6379> MGET name age
1) "test123"
2) "25.4"

getrange key start end

返回从start下标开始,到end下标结束的全部字符串,即通过start和end的两个下标截取字符串(包含start和end两个下标对应的字符串)

127.0.0.1:6379> get name
"test123"
127.0.0.1:6379> GETRANGE name 0 3
"test"
127.0.0.1:6379> GETRANGE name 0 4
"test1"

ttl (key):

查看key生存时间

#以秒为单位查看
127.0.0.1:6379> ttl name
(integer) 94
127.0.0.1:6379> ttl name
(integer) 70
127.0.0.1:6379> ttl name
(integer) 62
#以毫秒为单位查看
127.0.0.1:6379> pttl name
(integer) 993714

hash数据类型(字典类型)

应用场景:
存储部分变更的数据,如用户信息,商品信息等。
最接近表结构的一种类型。

hset key field value

添加或者修改哈希类型key的field的值

# 创建hash类型数据
127.0.0.1:6379> hset stu_1 name aaa age 18 gender m
(integer) 3
127.0.0.1:6379> KEYS *
1) "stu_1"
127.0.0.1:6379> hmset stu_2 name bbb age 20
OK

hdel key field2[field]

删除一个或者多个字段

## 删key
127.0.0.1:6379> del stu_2
(integer) 1
127.0.0.1:6379> hgetall stu_1
1) "name"
2) "aaa"
3) "age"
4) "18"
5)"gender"
6) "m"
## 删除指定字段
127.0.0.1:6379> hdel stu_1 gender
(integer) 1
127.0.0.1:6379> hgetall stu_1
1) "name"
2) "aaa"
3) "age"
4) "18"

hset key field value

如果没有相同字段,则追加,有相同字段,则修改

## 修改,如果没有相同字段,则追加,有相同字段,则修改
127.0.0.1:6379[2]> HGETALL stu_1
1) "name"
2) "aaa"
3) "age"
4) "18"
5) "gender"
6) "m"
127.0.0.1:6379[2]> hset stu_1 gender f
(integer) 0
127.0.0.1:6379[2]> HGETALL stu_1
1) "name"
2) "aaa"
3) "age"
4) "18"
5) "gender"
6) "f"
## hash类型计数器
127.0.0.1:6379[2]> hincrby stu_1 age 1
(integer) 19
127.0.0.1:6379[2]> hincrby stu_1 age 1
(integer) 20
127.0.0.1:6379[2]> hincrby stu_1 age 1
(integer) 21
127.0.0.1:6379[2]> hincrby stu_1 age 1
(integer) 22
127.0.0.1:6379[2]> KEYS *
1) "stu_1"
127.0.0.1:6379[2]> HGETALL stu_1
1) "name"
2) "aaa"
3) "age"
4) "22"            #//数值增加4
5) "gender"
6) "f"

hget key field

获取一个hsash类型的key的field值

## 查看单个字段
127.0.0.1:6379> hget stu_1 name
"aaa"
127.0.0.1:6379> hget stu_1 age
"22"
127.0.0.1:6379> hget stu_1 gender
"f"
## 查看所有字段
127.0.0.1:6379[2]> HGETALL stu_1
1) "name"
2) "aaa"
3) "age"
4) "22"           
5) "gender"
6) "f"
## 查看指定字段(多个)
127.0.0.1:6379> hmget stu_1 name age
1) "aaa"
2) "22"

hkeys key

获取一个hash类型的key中的所有的field[相当于字段]

127.0.0.1:6379[2]> HKEYS stu_1
1) "name"
2) "age"
3) "gender"

hvals key

获取一个hash类型的key中的所有的value

127.0.0.1:6379[2]> HVALS stu_1
1) "aaa"
2) "22"
3) "f"

拓展:

hincrby:让一个hash类型的key的字段值自增并指定步长
hsetnx:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
hlen key:获取哈希表中字段的数量
hexists: 查看key中指定的字段是否存在
hdel key field2[field]: 删除一个或者多个字段
hincrby key field increment: 为字段加上指定的增量值
hincrbyfloat key field increment: 为字段加上制定的曾量值

List列表类型

应用场景:
消息队列系统列表(list)用于存储多个有序的字符串。可以充当栈和队列的角色

一般有序会采用数组或者是双向链表,其中双向链表由于有前后指针实际上会很浪费内存。

image-20230901163403402

操作命令

操作类型 命令
添加 rpush、lpush、linsert
修改 lset
删除 lpop、rpop、lrem、ltrim
查询 lrange、lindex、llen
阻塞操作 blpop、brpop
弹出/ rpoplpush

Rpush

从列表右边插入元素

#语法:Rpush key 元素1 [元素2 ...]
[127.0.0.1:6379> rpush mylist lisa jack rose  # 从List列表右侧依次插入元素
(integer) 3

# [lrange key start stop] 根据下标查询元素
[127.0.0.1:6379> lrange mylist 0 -1   #下标从0开始,-1表示最后的下标位置 
1) "lisa"
2) "jack"
3) "rose"

Lpush

从列表左边插入元素

#语法:Lpush key 元素1 [元素2 ...]
[127.0.0.1:6379> lpush mylist a b c   # 从List列表左侧依次插入元素
(integer) 3

# [lrange key start stop] 根据下标查询元素
[127.0.0.1:6379> lrange mylist 0 -1 #下标从0开始,-1表示最后的下标位置 
1) "c"
2) "b"
3) "a"

Linsert

在目标元素前或后插入元素

前面插入数据:

#语法:Linsert key before|after 目标元素 value
127.0.0.1:6379[2]> LRANGE test 0 -1
 1) "f"
 2) "e"
 3) "d"
 4) "c"
 5) "b"
 6) "a"
 7) "1"
 8) "2"
 9) "3"
10) "4"
11) "5"
#在a前面插入00
127.0.0.1:6379[2]> LINSERT test before a 00
(integer) 13
127.0.0.1:6379[2]> LRANGE test 0 -1
 1) "f"
 2) "e"
 3) "d"
 4) "c"
 5) "b"
 6) "a"
 7) "00"
 8) "1"
 9) "2"
10) "3"
11) "4"
12) "5"

后面插入数据:

#语法:Linsert key before|after 目标元素 value
#在a后面插入00
127.0.0.1:6379[2]> LINSERT test after a 00
(integer) 12
127.0.0.1:6379[2]> LRANGE test 0 -1
 1) "f"
 2) "e"
 3) "d"
 4) "c"
 5) "b"
 6) "00"
 7) "a"
 8) "00"
 9) "1"
10) "2"
11) "3"
12) "4"
13) "5"

rpoplpush key1 key2

从指定key1的右边消费数据,写入后边key2的左边

127.0.0.1:6379> lrange men 0 -1
1) "wangbiao2"
2) "wangbiao"
127.0.0.1:6379> rpoplpush nginx men
"c"
127.0.0.1:6379> lrange men 0 -1
1) "c"
2) "wangbiao2"
3) "wangbiao"

Ltrim (key)start stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4
redis 127.0.0.1:6379> LTRIM mylist 1 -1
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
3) "bar"

LSET KEY_NAME INDEX VALUE

Lset 通过索引来修改元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "hello"
#修改0元素为bar
(integer) 4
redis 127.0.0.1:6379> LSET mylist 0 "bar"
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "bar"
2) "hello"
3) "foo"
4) "hello"

RPOP KEY_NAME

从右边取出数据

redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4
redis 127.0.0.1:6379> RPOP mylist
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello"
3) "foo"

LPOP key

从左边取出数据

redis 127.0.0.1:6379> RPUSH list1 "foo"
(integer) 1
redis 127.0.0.1:6379> RPUSH list1 "bar"
(integer) 2
redis 127.0.0.1:6379> LPOP list1
"foo"

Lindex通过索引获取列表中的元素。

你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

redis 127.0.0.1:6379> LPUSH mylist "World"
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist "Hello"
(integer) 2
redis 127.0.0.1:6379> LINDEX mylist 0
"Hello"
redis 127.0.0.1:6379> LINDEX mylist -1
"World" 
redis 127.0.0.1:6379> LINDEX mylist 3        # index不在 mylist 的区间范围内
(nil)
## 按指定范围查看
redis 127.0.0.1:6379> LINDEX mylist 0 -1
"hello"
"world"

LLEN KEY_NAME

Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

redis 127.0.0.1:6379> RPUSH list1 "foo"
(integer) 1
redis 127.0.0.1:6379> RPUSH list1 "bar"
(integer) 2
redis 127.0.0.1:6379> LLEN list1
(integer) 2

Set集合数据类型

应用场景:
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还
为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等
功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新
的集合中。

交集: 集合一和集合二重复的元素
并集: 集合一和集合二除去重复剩下的所有元素
差集: 集合一和集合二除去重复剩下的元素

#示例
集合:1 2 3 4 5
集合:1 3 5 7 9

交集:1 3 5
并集:1 2 3 4 5 7 9
差集:2 4 7 9

sadd key member1 [member2]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

127.0.0.1:6379> sadd k52 mem1 mem2 
(integer) 2
127.0.0.1:6379> sadd k53 mem1 mem3
(integer) 1

SPOP key [count]

移除并返回集合中的 随机一个 元素

127.0.0.1:6379> SADD k55 m1 m2 m3 m4 m5 m6 m7 m8 m9 m10
(integer) 10
# 随机移除一个元素
127.0.0.1:6379> spop k55
"m9"
127.0.0.1:6379> spop k55
"m2"
127.0.0.1:6379> spop k55
"m3"
# 随机移除3个元素
127.0.0.1:6379> spop k55 3
1) "m5"
2) "m4"
3) "m10"
# 查看所有元素
127.0.0.1:6379> SMEMBERS k55
1) "m1"
2) "m7"
3) "m8"
4) "m6"

SMOVE source destination member

member 元素从 source 集合移动到 destination 集合。

127.0.0.1:6379> SADD k58 m1 m2 m3 m4 m5 m6 m7 m8 m9 m10
(integer) 10
# 移动两个元素到k58_dis
127.0.0.1:6379> SMOVE k58 k58_dis m1
(integer) 1
127.0.0.1:6379> SMOVE k58 k58_dis m2
(integer) 1
#再次移动m1,发现没有变化
127.0.0.1:6379> SMOVE k58 k58_dis m1
(integer) 0
# k58中的m1,m2 已被移除。
127.0.0.1:6379> SMEMBERS k58
1) "m7"
2) "m8"
3) "m5"
4) "m6"
5) "m4"
6) "m10"
7) "m3"
8) "m9"
# k58_dis中的m1,m2
127.0.0.1:6379> SMEMBERS k58_dis
1) "m2"
2) "m1"

SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合

# 查询元素, 注意保存是无序的.
127.0.0.1:6379> SADD k53 m1 m2 m3 m4 m5
(integer) 5
127.0.0.1:6379> SMEMBERS k53
1) "m4"
2) "m3"
3) "m2"
4) "m1"
5) "m5"

SDIFF key [key ...]

前面集合有后面集合没有的元素

127.0.0.1:6379> SADD k64_1 m1 m2 m3 
(integer) 3
127.0.0.1:6379> SADD k64_2 m2 m3 m4 m5 m6 
(integer) 5
# 返回 k64_1 - k64_2    
127.0.0.1:6379> SDIFF k64_1 k64_2
1) "m1"
# 返回 k64_2 - k64_1   
127.0.0.1:6379> SDIFF k64_2 k64_1   
1) "m6"
2) "m4"
3) "m5"

SINTER key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的交集。(类似共同好友)

127.0.0.1:6379> SADD k60_1 m1 m2 m3 m4 m5 
(integer) 5
127.0.0.1:6379> SADD k60_2 m2 m3 m4 m5 m6
(integer) 5
127.0.0.1:6379> SADD k60_3 m4 m5 m6 m7 m8
(integer) 5
# 指定了一个key,返回集合的所有元素
127.0.0.1:6379> SINTER k60_1
1) "m4"
2) "m3"
3) "m2"
4) "m1"
5) "m5"
# 多个key的时候,返回集合的交集。
127.0.0.1:6379> SINTER k60_1 k60_2
1) "m4"
2) "m3"
3) "m2"
4) "m5"
# 多个key的时候,返回集合的交集。
127.0.0.1:6379> SINTER k60_1 k60_2 k60_3
1) "m4"
2) "m5"
# k60_4不存在,为空集
127.0.0.1:6379> SINTER k60_1 k60_4
(empty list or set)

SUNION key [key ...]

返回一个集合的全部成员,如果是多个集合(key),返回所有给定集合的并集

127.0.0.1:6379> SADD k62_1 m1 m2 m3 
(integer) 3
127.0.0.1:6379> SADD k62_2 m2 m3 m4 m5 m6 
(integer) 5
# 一个key,返回整个集合。
127.0.0.1:6379> SUNION k62_1
1) "m1"
2) "m2"
3) "m3"
# 多个key,返回并集
127.0.0.1:6379> SUNION k62_1 k62_2
1) "m3"
2) "m1"
3) "m5"
4) "m6"
5) "m2"
6) "m4"

SISMEMBER key member

判断 member 元素是否集合 key 的成员。如果 member 元素是集合的成员,返回 1 。 如果 member 元素不是集合的成员,或 key 不存在,返回 0

127.0.0.1:6379> SADD k54 m1 m2 m3 m4
(integer) 4
127.0.0.1:6379> SISMEMBER k54 m2
(integer) 1
127.0.0.1:6379> SISMEMBER k54 m5
(integer) 0

SCARD key

返回集合 key 的基数(集合中元素的数量)。集合的基数。 当 key 不存在时,返回 0

127.0.0.1:6379> SADD k59 m1 m2 m3 m4 m5 m6 m7 m8 m9 m10
(integer) 10
# 获取元素个数
127.0.0.1:6379> SCARD k59
(integer) 10

SRANDMEMBER key [count]

返回集合中的 随机 count 个元素(不会删除元素)

如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值

127.0.0.1:6379> SADD k56 m1 m2 m3 m4 m5 m6 m7 m8 m9 m10
(integer) 10
# 随机返回一个元素
127.0.0.1:6379> SRANDMEMBER k56 
"m1"
127.0.0.1:6379> SRANDMEMBER k56 
"m9"
127.0.0.1:6379> SRANDMEMBER k56 
"m5"
# count是正数,小于集合的元素数,返回count个元素,无重复元素
127.0.0.1:6379> SRANDMEMBER k56 5
1) "m7"
2) "m1"
3) "m5"
4) "m6"
5) "m3"
# count是正数,大于集合的元素数,返回整个集合
127.0.0.1:6379> SRANDMEMBER k56 20
 1) "m5"
 2) "m6"
 3) "m4"
 4) "m8"
 5) "m7"
 6) "m1"
 7) "m10"
 8) "m3"
 9) "m2"
10) "m9"
# count为负数, 返回20个集合中的元素,元素会重复
127.0.0.1:6379> SRANDMEMBER k56 -20
 1) "m6"
 2) "m6"
 3) "m9"
 4) "m7"
 5) "m6"
 6) "m5"
 7) "m6"
 8) "m9"
 9) "m1"
10) "m6"
11) "m1"
12) "m9"
13) "m2"
14) "m1"
15) "m2"
16) "m5"
17) "m9"
18) "m2"
19) "m4"
20) "m6"

SDIFFSTORE destination key [key ...]

将集合的差集存储到 destination 集合中.

127.0.0.1:6379> SADD k65_1 m1 m2 m3 
(integer) 3
127.0.0.1:6379> SADD k65_2 m2 m3 m4 m5 m6 
(integer) 5
127.0.0.1:6379> SDIFFSTORE k65_dis_1 k65_1 k65_2
(integer) 1
127.0.0.1:6379> SMEMBERS k65_dis_1
1) "m1"
127.0.0.1:6379> SDIFFSTORE k65_dis_2 k65_2 k65_1
(integer) 3
127.0.0.1:6379> SMEMBERS k65_dis_2
1) "m6"
2) "m4"
3) "m5"

SINTERSTORE destination key [key ...]

这个命令类似于 SINTER key [key …] 命令,返回集合的交集。但它将结果保存到 destination 集合,而不是简单地返回结果集。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。

127.0.0.1:6379> SADD k61_1 m1 m2 m3 m4 m5
(integer) 5
127.0.0.1:6379> SADD k61_2 m4 m5 m6 m7 m8
(integer) 5
# 将k61_1 和 k61_2 集合的交集存储到k61_dis中
127.0.0.1:6379> SINTERSTORE k61_dis k61_1 k61_2
(integer) 2
# 查看 k61_dis
127.0.0.1:6379> SMEMBERS k61_dis
1) "m4"
2) "m5"
# k61_1 和 k61_2 没有变化
127.0.0.1:6379> SMEMBERS k61_1
1) "m4"
2) "m3"
3) "m2"
4) "m1"
5) "m5"
127.0.0.1:6379> SMEMBERS k61_2
1) "m7"
2) "m8"
3) "m5"
4) "m6"
5) "m4"
# 如果目标集合(k61_dis)存在,元素会被覆盖掉。
127.0.0.1:6379> SADD k61_3 m1 m2 m3 
(integer) 3
127.0.0.1:6379> SINTERSTORE k61_dis k61_1 k61_3
(integer) 3
127.0.0.1:6379> SMEMBERS k61_dis
1) "m1"
2) "m2"
3) "m3"

SUNIONSTORE destination key [key ...]

同 SINTERSTORE , 只不过存储的是并集的结果。 将多个集合的并集存储到 distination 中。

127.0.0.1:6379> SADD k63_1 m1 m2 m3 
(integer) 3
127.0.0.1:6379> SADD k63_2 m2 m3 m4 m5 m6 
(integer) 5
127.0.0.1:6379> SUNIONSTORE k63_dis k62_1 k62_2
(integer) 6
127.0.0.1:6379> SMEMBERS k63_dis
1) "m3"
2) "m1"
3) "m5"
4) "m6"
5) "m2"
6) "m4"

Sorted-Set有序集合

应用场景:
排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶
的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具
体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

ZRANGE key start stop [WITHSCORES]

通过索引区间返回有序集合key指定区间内的成员,其中成员的位置按分数值递增(从小到大**)来排序。具有相同分数值的成员按字典序(lexicographical order )来排列。该命令在执行时加上withscores参数可以连同分数值score一起返回,使用如下:

#添加两个分数分别是 2 和 3 的两个成员
127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
(integer) 2

zrem key value

删除该集合下,指定值的元素

#删除多个成员变量,返回删除的数量   //没有one,所有这里返回结果只有一个发生变化
127.0.0.1:6379> zrem myzset one two
(integer) 1

zincrby key increment value

为元素的score加上增量

#将成员 one 的分数增加 2,并返回该成员更新后的分数  //因为没有one。所有此处zincrby相当于zadd创建使用
127.0.0.1:6379> zincrby myzset 2 one
"2"
127.0.0.1:6379[2]> zRANGE myzset 0 -1
1) "one"
2) "three"

zrange key start stop [WITHSCORES]:

返回有序集 key 中,下标在start stop之间的元素带WITHSCORES,可以让分数一起和值返回到结果集

## 查看key中的所有字段
zrange key名 0 -1
127.0.0.1:6379> zrange linux_chengji 0 -1
1) "haige"
2) "wyd"
3) "hhh"

# 查看key中所有的字段和他们的值(根据值的大小升序)
zrange key名 0 -1 withscores
127.0.0.1:6379> zrange linux_chengji 0 -1 withscores
1) "haige"
2) "60"
3) "wyd"
4) "98"
5) "hhh"
6) "100"

# 查看key中所有的字段和他们的值(根据值的大小降序)
zrange key名 0 -1 rev withscores
127.0.0.1:6379> zrange linux_chengji 0 -1 rev withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"

# 查看指定key的索引index
zrank key名 要查看的字段名
127.0.0.1:6379> zrank linux_chengji hhh
(integer) 2

# 查看指定key的索引index和值
zrank key名 要查看的字段名 withscore
127.0.0.1:6379> zrank linux_chengji hhh withscore
1) (integer) 2
2) "100"

# 查看key中的成员个数
zcard key名
127.0.0.1:6379> zcard linux_chengji
(integer) 3

# 查看分数在指定范围内的成员个数
zcount key名 起始值 结束值
127.0.0.1:6379> zcount linux_chengji 60 99
(integer) 2

# 查看指定key中指定字段的值
zscore key名 字段名
127.0.0.1:6379> zscore linux_chengji hhh
"100"

# 查看key中指定范围值的字段名
zrangebyscore key名 起始值 结束值
127.0.0.1:6379> zrangebyscore linux_chengji 60 99
1) "haige"
2) "wyd"

# 按照偏移量取出key中指定数量的字段
zrangebyscore key名 -inf +inf limit index位置 要取几个
127.0.0.1:6379> zrangebyscore linux_chengji -inf +inf limit 0 1
1) "haige"

# 删除key中指定值的字段
zremrangebyscore key名 值1 值2
127.0.0.1:6379> zremrangebyscore linux_chengji 60 99
(integer) 2

# 根据索引删除字段
zrerangebyrank key名 index位置
127.0.0.1:6379> zremrangebyrank linux_chengji 0 1

# 指定索引降序排序
zrevrange key名 起始位置 结束位置 withscores
127.0.0.1:6379> zrevrange linux_chengji 0 -1 withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"

# 指定值降序序排序
zrevrangebyscore key名 起始值 结束值
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60
1) "hhh"
2) "wyd"
3) "haige"

# 指定值降序序排序
zrevrangebyscore key名 起始值 结束值 withscores
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60 withscores
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"

# 指定值降序排序 看值大小的前十
zrevrangebyscore key名 起始值 结束值 withscores limit 索引位置 显示几个
127.0.0.1:6379> zrevrangebyscore linux_chengji 100 60 withscores limit 0 10
1) "hhh"
2) "100"
3) "wyd"
4) "98"
5) "haige"
6) "60"