redis概述
Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步
操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过
10万次读写操作,是已知性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是
1GB,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高
性 能消息队列服务等等。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能
读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
(1)、会话缓存(Session Cache)
(2)、全页缓存(FPC) (动态页面静态化)
(3)、队列
(4)、排行榜/计数器
(5)、发布/订阅
redis存储
redis 里面的 rdb (Redis DataBase)和 aof (Append Only File)文件 (内存数据库) 数据
持久化
Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁
盘中。
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
redis操作
进入redis:
redis-cli 是 Redis 提供的官方命令行客户端工具,用于与 Redis 服务器进行交互。它以人类可读的
方式显示 Redis 响应,使用户可以直接阅读和理解返回的数据。
语法 : redis-cli
--raw 输出中文
举例:
$ redis-cli
127.0.0.1:6379>
127.0.0.1:6379 表示连接到本地机器上运行的 Redis 服务器,并使用默认的 Redis 端口 6379 进
行通信。
Redis 支持多个数据库(16个数据库),编号从 0 到 15。
默认情况下,Redis 客户端连接到数据库 0。
语法 : select 0-15 自由选择
举例:
$ redis-cli
127.0.0.1:6379> SELECT 2
redis数据类型
1、string---Strings
Strings 具有以下特点:
- 存储字符串数据: Strings
- 二进制安全: Strings 可以存储二进制数据,而不仅限于文本字符串。
- 简单的键值对结构:每个 string 对象都有一个关联的键(key),通过键可以对其进行读取、写
入、更新和删除等操作。
Strings 的常见用途包括: - 缓存数据:可以将经常访问的数据缓存在 Redis 的 Strings 中,加快数据读取的速度。
- 计数器:可以使用 Strings 存储计数器的值,例如网站访问次数、用户在线人数等。
- 分布式锁:可以使用 Strings 实现分布式锁机制,控制对共享资源的访问。
- 序列化对象:可以将对象序列化为字符串后存储在 Strings 中,方便存储和传输对象数据。
Redis 提供了一系列的命令来操作 Strings ,如 SET 、 GET 、 INCR 、 DEL 等,用于设置字符串值、
获取字符串值、增加计数器、删除字符串等操作。
通过使用 Strings ,可以在 Redis 中存储和操作字符串数据,适用于多种场景,包括缓存、计数、序列化等。
# 1、 添加和获取数据?
# 在Redis中,字符串值可以包含双引号或不包含双引号。
# 添加(修改)
# 语法:set 键 值
set name qiye
# 获取
# 语法: get 键
get name
# 补充知识点:
keys * 查看所有的KEY
# 2、 追加数据?
# append 命令向键的字符串值末尾追加字符串。
> set message "Hello"
OK
> append message ", World!"
(integer) 13
> get message
"Hello, World!"
# 如果键不存在,则会创建一个新的键,并将指定的字符串作为其初始值。
> append newkey "Hello"
(integer) 5
> get newkey
"Hello"
# 3、 删除数据 ?
del name # 删除
# 4、批量
#MSET和MGET是Redis中用于批量设置和获取多个键值对的命令。
#设置多个键值对
语法:mset 键1 值1 键2 值2 键3 值3 ...
mset name1 jack1 name2 jack2
#查看多个
语法:mget 键1 键2 键3...
mget name1 name2
## 其它操作
# 1、 自加: incr 命令用于对键的值进行自增操作,它将键的值加上1。
如果键不存在,将会先将键的值初始化为0,然后再执行自增操作。
> set age 10
OK
> incr age
(integer) 11
#在上述示例中,将键counter的值自增1,结果为11。
# 2、 自减: decr 命令用于对键的值进行自减操作,它将键的值减去1。
如果键不存在,将会先将键的值初 始化为0,然后再执行自减操作。
> set age 10
OK
> decr age
(integer) 9
#在上述示例中,将键counter的值自减1,结果为9。
# 3、 增加: incrby 命令用于将键的值增加指定的增量。
> set age 10
OK
> incrby age 5
(integer) 15
#在上述示例中,将键counter的值增加5,结果为15
# 4、 减少: decrby 命令用于将键的值减少指定的减量。
> set age 10
OK
> decrby age 3
(integer) 7
#在上述示例中,将键counter的值减少3,结果为7。
# 5、 type 获取指定键的数据类型
# 语法 : type 键
> set name "John"
OK
> type name
#TYPE命令的返回值可以是以下几种之一:
"string":表示键对应的值是字符串类型。
"list":表示键对应的值是列表类型。
"set":表示键对应的值是集合类型。
"zset":表示键对应的值是有序集合类型。
"hash":表示键对应的值是哈希类型。
"stream":表示键对应的值是流类型。
# 6、 检查键是否存在。如果键存在,则返回1;如果键不存在,则返回0。
# 语法 : exists 键
> set name "John"
OK
> exists name
(integer) 1
# 7、重命名
# 语法: rename 旧键 新键
> set mykey "Hello"
OK
> rename mykey newkey
OK
> get newkey
"Hello"
#需要注意的是,RENAME命令是原子操作,意味着它会立即将键重命名,而不会受到其他操作的影响。这也意味着如果键name2已经存在,它会被覆盖。
计数器:
string类型的incr和decr命令的作用是将key中储存的数字值加一/减一,这两个操作具有原子性,总能安
全地进行加减操作,因此可以用string类型进行计数,如微博的评论数、点赞数、分享数,抖音作品的收藏
数,京东商品的销售量、评价数等。
# 面是一个完整的示例,展示如何使用 Redis 的 Strings 实现一个简单的计数器:
# 初始化计数器
SET visits 0
# 增加计数
INCR visits
# 获取计数
GET visits
# 计数器,适用于跟踪和统计各种计数数据,如网站访问次数、用户操作次数等。
2、过期时间
在 Redis 中,设置过期时间是指为存储在数据库中的键值对设置一个时间限制,当超过该时间时,Redis
将自动删除该键值对。设置过期时间的主要作用如下:
- 缓存管理:Redis 通常用作缓存数据库,通过设置键的过期时间,可以自动清除不再需要的缓存数
据。这有助于释放内存和优化数据库性能。 - 数据有效性控制:通过设置过期时间,可以确保存储在 Redis 中的数据在一定时间后自动过期,强
制客户端更新数据或重新获取最新数据。这对于需要定期更新的数据非常有用,如会话数据、验证
码等。 - 限时功能:通过设置键的过期时间,可以实现一些限时功能,如限时抢购、限时优惠等。在特定时
间范围内,将键设置为有效状态,超过时间后自动失效,从而实现一些临时性的业务逻辑。 - 防止缓存雪崩:缓存雪崩是指缓存中大量的键同时过期或失效,导致大量请求直接访问数据库,给
数据库带来巨大压力。通过为每个键设置不同的过期时间,可以分散过期时间点,减少缓存同时失
效的概率,从而降低缓存雪崩的风险。
总的来说,通过设置过期时间,可以实现数据的自动管理和过期策略,提高缓存的效率和可靠性,减轻
数据库的负担,并支持一些临时性的业务需求。
# 键已创建时设置过期时间:
# set 命令用于设置指定键的值。
# 语法: SET key value [EX seconds] [PX milliseconds] [NX|XX]
其中,key是要设置值的键的名称,value是要设置的值。可选参数包括:
# EX seconds:设置键的过期时间,单位为秒。
# PX milliseconds:设置键的过期时间,单位为毫秒。
# NX:只在键值对不存在时新增,如果存在返回nil。
# XX:只在键值对已存在时覆盖,如果不存则返回nil。
需要注意的是,如果键已经存在且没有设置XX参数,则执行SET命令将会覆盖键的现有值。
# 1、键name的值为"John"。
> set name "John"
OK
# 2、键score的值为100,并设置了过期时间为3600秒。
> set score 100 EX 3600
OK
# 3、键counter的值为10,仅当键不存在时才执行设置操作。
> set counter 10 NX
OK
# 4、键config的值为"enabled",仅当键已存在时才执行设置操作。
> set config "enabled" XX
OK
# 键已存在时设置过期时间:
# expire 命令用于设置键的过期时间,以秒为单位。
expire 命令返回的结果为1,表示设置过期时间成功。
> set name "John"
OK
> expire name 60
(integer) 1
# persist 命令用于取消键的过期时间,使键永远不会过期。
persist 命令返回的结果为1,表示取消过期时间成功。
> set name "John"
OK
> expire name 60
(integer) 1
> ttl name
(integer) 55
3、list---Lists
Lists 具有以下特点:
- 有序性: Lists 中的元素按照插入顺序排列,每个元素都有一个索引来表示其位置。
- 允许重复: Lists 中的元素可以重复,同一个元素可以出现多次。
- 动态性:可以在列表的两端进行元素的添加和移除操作。
Lists 的常见用途包括: - 消息队列:可以将消息以列表的形式存储在 Redis 中,使用 Lists 提供的命令来实现简单的消息
队列功能。 - 日志记录:可以将日志以列表的形式存储在 Redis 中,按照时间顺序记录和检索日志信息。
- 最新消息列表:可以使用 Lists 来存储最新的消息或动态内容,可以快速获取最新的一批数据。
- 任务队列:可以使用 Lists 存储待执行的任务,从列表的一端取出任务进行处理。
Redis 提供了一系列的命令来操作 Lists ,如 LPUSH 、 RPUSH 、 LPOP 、 RPOP 等,用于在列表的头部
或尾部添加元素、从列表的头部或尾部移除元素等操作。
通过使用 Lists ,可以在 Redis 中高效地存储和操作按顺序排列的元素集合,适用于需要保持元素有序
并支持插入和移除操作的场景。
# 消息队列
# 排行榜
list
# 一、创建一个键
# 在 Redis 中新增一个列表,可以使用 RPUSH 或 LPUSH 命令。这两个命令分别用于将一个或多个元素
从右侧或左侧插入到列表中。
# 1、 使用 rpush 命令将一个或多个元素从右侧插入到列表:
# 语法 :
rpush 键 值1 值2 ... 值N
# 例如,将元素 "value1"、"value2" 和 "value3" 从右侧插入到列表 "mylist" 中:
rpush mylist "value1" "value2" "value3"
type mylist
# 2、 使用 lpush 命令将一个或多个元素从左侧插入到列表:
# 语法 :
lpush 键 值1 值2 ... 值N
# 例如,将元素 "value1"、"value2" 和 "value3" 从左侧插入到列表 "mylist" 中:
lpush mylist "value1" "value2" "value3"
type mylist
# 二、lrange、lindex lset 中用于操作列表类型的命令:
# 1、 lrange:用于获取列表中指定范围的元素。
# 语法:
lrange 键 初值 终值
# 示例:
lrange mylist 0 -1
# 该命令返回列表 mylist 中从索引 0 到索引 -1 之间的所有元素。
索引从 0 开始,可以使用负数表示倒数索引。
# 2、 lindex:用于获取列表中指定索引的元素。
# 语法:
lindex 键 index
# 示例:
lindex mylist 3
# 该命令返回列表 mylist 中索引为 3 的元素。
索引从 0 开始,所以 3 表示第四个元素。
# 3、 lset:用于设置列表中指定索引的元素值。
# 语法:
lset 键 下标 值
# 示例:
lset mylist 2 "value10"
# 该命令将列表 mylist 中索引为 2 的元素值设置为 "value10"。
# 列表进行元素的移除和修剪操作:
# 1、 rpop:从列表右侧移除并返回最后一个元素。
# 语法:
rpop 键
# 示例:
rpop mylist
# 这个命令将移除列表 mylist 中最右边的元素,并将其返回作为结果。
# 2、 lpop:从列表左侧移除并返回第一个元素。
# 语法:
lpop 键
# 示例:
lpop mylist
# 这个命令将移除列表 mylist 中最左边的元素,并将其返回作为结果。
# 3、 lrem:根据值的匹配移除指定数量的元素。
# 语法:
lrem 键 count value
# 示例:
lrem mylist 2 "value"
# 这个命令将从列表 mylist 中移除与给定的 value 匹配的元素。count 参数指定了移除的数量:
如果 count 大于 0,则从列表左侧开始移除与 value 相等的元素,移除的数量为 count。
# list3 [aa 1 2 3 aa 6 7 aa 1 2 6 7 aa]
# lrem list3 3 aa --> [ 1 2 3 6 7 1 2 6 7 aa]
如果 count 小于 0,则从列表右侧开始移除与 value 相等的元素,移除的数量为 count 的绝对
值。
# list4 [bb 1 2 3 bb 6 7 bb 1 2 6 7 bb]
4、Hash---Hashes
Hash(哈希):
Hashes 具有以下特点:
1. 键值对存储: Hashes 存储了多个字段(field)和对应的值(value),类似于其他编程语言
中的字典或映射数据结构。
2. 无序性: Hashes 中的字段是无序排列的,没有固定的顺序。
3. 动态性:可以动态地添加、删除和更新字段和对应的值。
# lrem list4 -1 7 --> [bb 1 2 3 bb 6 7 bb 1 2 6 bb]
# lrem list4 -3 bb --> [bb 1 2 3 6 7 1 2 6]
如果 count 等于 0,则移除所有与 value 相等的元素。
lrem list4 0 6 --> [bb 1 2 3 7 1 2]
# 4、 ltrim:保留列表中指定范围的元素,移除其他元素。
# 语法:
ltrim 键 start stop
# 语法翻译:
ltrim 键(列表名) 要保留数据起始下标 要保留数据结束下标
# 示例:
ltrim mylist 0 2
# 这个命令将列表 mylist 中保留索引从 start 到 stop 之间的元素,移除其他元素。
保留的范围包括 start 和 stop 的索引所指向的元素。
list5 [ 1 2 3 4 aa bb cc dd 5 6 7 8 ] 保留list5中的aa bb cc dd
ltrim list5 4 7 ---> [ aa bb cc dd ]
`代码汇总:`
# 一、创建一个键
# 1. 从右侧插入一个或多个元素到列表中
rpush mylist "value1" "value2" "value3"
# 2. 从左侧插入一个或多个元素到列表中
lpush mylist "value1" "value2" "value3"
# 二、操作列表类型的命令
# 1. 获取列表中指定范围的元素
lrange mylist 0 -1
# 2. 获取列表中指定索引的元素
lindex mylist 3
# 3. 设置列表中指定索引的元素值
lset mylist 2 "value10"
# 三、删除
# 列表进行元素的移除和修剪操作
# 1. 从列表右侧移除并返回最后一个元素
rpop mylist
# 2. 从列表左侧移除并返回第一个元素
lpop mylist
# 3. 根据值的匹配移除指定数量的元素
lrem mylist 2 "value"
# 4. 保留列表中指定范围的元素,移除其他元素
ltrim mylist 0 2
4、Hash---Hashes
Hash(哈希):
Hashes 具有以下特点:
- 键值对存储: Hashes 存储了多个字段(field)和对应的值(value),类似于其他编程语言
中的字典或映射数据结构。 - 无序性: Hashes 中的字段是无序排列的,没有固定的顺序。
- 动态性:可以动态地添加、删除和更新字段和对应的值。
lrem list4 -1 7 --> [bb 1 2 3 bb 6 7 bb 1 2 6 bb]
lrem list4 -3 bb --> [bb 1 2 3 6 7 1 2 6]
如果 count 等于 0,则移除所有与 value 相等的元素。
lrem list4 0 6 --> [bb 1 2 3 7 1 2]
4、 ltrim:保留列表中指定范围的元素,移除其他元素。
# 语法:
ltrim 键 start stop
# 语法翻译:
ltrim 键(列表名) 要保留数据起始下标 要保留数据结束下标
# 示例:
ltrim mylist 0 2
# 这个命令将列表 mylist 中保留索引从 start 到 stop 之间的元素,移除其他元素。
保留的范围包括 start 和 stop 的索引所指向的元素。
list5 [ 1 2 3 4 aa bb cc dd 5 6 7 8 ] 保留list5中的aa bb cc dd
ltrim list5 4 7 ---> [ aa bb cc dd ]
代码汇总:
一、创建一个键
1. 从右侧插入一个或多个元素到列表中
rpush mylist "value1" "value2" "value3"
2. 从左侧插入一个或多个元素到列表中
lpush mylist "value1" "value2" "value3"
二、操作列表类型的命令
1. 获取列表中指定范围的元素
lrange mylist 0 -1
2. 获取列表中指定索引的元素
lindex mylist 3
3. 设置列表中指定索引的元素值
lset mylist 2 "value10"
三、删除
列表进行元素的移除和修剪操作
1. 从列表右侧移除并返回最后一个元素
rpop mylist
2. 从列表左侧移除并返回第一个元素
lpop mylist
3. 根据值的匹配移除指定数量的元素
lrem mylist 2 "value"
4. 保留列表中指定范围的元素,移除其他元素
ltrim mylist 0 2
Hashes 的常见用途包括:
- 存储对象属性:可以将一个对象的属性存储在 Hashes 中,每个字段对应对象的一个属性,
值为属性的值。 - 缓存对象:可以将对象的属性存储在 Hashes 中,使用 Hashes 来缓存对象,避免频繁的数
据库查询。 - 存储用户信息:可以用 Hashes 存储用户的信息,如用户名、年龄、地址等。
- 存储配置信息:可以将配置信息存储在 Hashes 中,方便读取和更新配置。
- 存储关系数据:可以用 Hashes 存储关系型数据,如好友关系、用户与权限的对应关系等。
Redis 提供了一系列的命令来操作 Hashes ,如 HSET 、 HGET 、 HGETALL 、 HINCRBY 等,用于添
加字段和对应的值、获取字段的值、获取所有字段和值的列表、对字段的值进行增减等操作。
通过使用 Hashes ,可以在 Redis 中高效地存储和操作键值对的数据,适用于许多不同的应用场
景。
# 购物车
用户的id key 商品的id field 商品的数量作为value
# Redis中的哈希表是一个键值对的集合,可以存储多个字段和对应的值。
keys *
# 一、新增数据:
hset 命令用于设置哈希中指定字段的值。它接受三个参数:哈希的名称(Key)、字段(Field)和值
(Value)。如果字段已经存在于哈希表中,则它的值将被更新;如果字段不存在,则将创建一个新的字段。
# 语法 :
hset 哈希名 字段 值
# 举例:将在名为myhash的哈希表中创建或更新field1字段的值为Hello。
hset myhash field1 "Hello"
# 在redis中新增哈希数据 -> user:{ name: buyu, age: 118, msg: xxxxx }
hset user name buyu age 118 msg xxxxx
# 二、查询数据
hget 命令用于获取哈希中指定字段的值。它接受两个参数:哈希的名称(Key)和字段(Field)。
field 存在,正常读取 field
对应的值。field 不存在,返回 nil。
# 语法 :
hget 哈希名 字段
# 举例: 返回名为myhash的哈希表中field1字段的值。
hget myhash field1
# 三、查询所以的键
如果你想要获取哈希表中的所有键(即字段名),可以使用 hkeys 命令。它接受一个参 数,即哈希表的
名称(Key),然后返回该哈希表中所有的字段名(Field)。
# 语法 :
hkeys 哈希名
# 四、查询所有的值
获取哈希表(Hash)中的所有值,可以使用 hvals 命令。该命令接受一个参数,即哈希表的名称(Key),
然后返回该哈希表中所有字段对应的值。
# 语法 :
hvals 哈希名
# 请注意,返回的值列表中的值是无序的,与字段的顺序无关。
# 五、查询所有键值对
如果需要将字段名和对应的值一起获取,可以使用 hgetall 命令,它会返回键值对列表,其中每个键值对由
字段和值组成,每个键值对按顺序排列。。
# 语法:
hgetall 哈希名
# 需要注意的是:
在处理大型哈希表时,要考虑返回的值列表可能会占用大量内存。确保在内存使用方面有足够的容量来处理
返回的结果。
# 补充:
hlen是Redis中的一个哈希命令,用于获取哈希表中字段(field)的数量。
hlen 哈希名
# 六、批量操作
# hmset 和 hmget 批量操作命令:
可以一次性设置或获取多个字段的值,而不是逐个操作。 这在
处理多个字段的场景下更高效,可以减少与 Redis 服务器的通信次数。
# 1、批量新增
hmset 命令用于一次设置哈希表中的多个字段及其对应的值。它接受三个或更多参数,参数顺序为:哈希名
称、字段1、值1、字段2、值2,以此类推。
# 语法 :
hmset 哈希名 字段1 值1 字段2 值2 ...
# 举例:
hmset myhash field1 value1 field2 value2 field3 value3
# 注意:
field 不存在,直接存储。field 存在,执行覆盖操作
# 2、批量查询
hmget 命令用于一次获取哈希表中多个字段的值。它接受两个或更多参数,参数顺序为:哈希表的名称、字段
1、字段2,以此类推。
# 语法:
hmget 哈希名 字段1 字段2 字段3...
# 举例:
hmget myhash field1 field2 field3
# 七、删除 hdel
hdel 从哈希表(Hash)中同时删除一个或多个字段的命令,返回值是被删除字段的数量。。
hdel 命令接受至少两个参数,第一个参数是哈希表的名称,后续参数是要删除的字段名。可以指定一个或多
个字段名进行删除。
# 语法:
hdel 哈希名 字段1 字段2 字段3...
# 举例:
hdel myhash field1 field2 field3
# hdel 命令的返回值是实际删除的字段数量。可以根据返回值来判断删除操作是否成功。
# hdel 命令执行后,被删除的字段及其对应的值将从哈希表中永久移除。
field 存在,删除字段,返回被删除字段的数量。 field 不存在, 返回0。
# 八、增量(hincrby) 实现加法
#hincrby 是 Redis 中用于对哈希表(Hash)中指定字段的值进行增加操作的命令。
5、set---Sets
Set(集合):
#hincrby 命令接受三个参数:哈希表的名称、字段名和增加的值。
它将指定字段的值按照给定的增量进行增加,并返回增加后的值。 如果指定的
字段已经存在于哈希表中,它的值将会被增加。 如果字段不存在,则会
创建一个新的字段,并将增量作为初始值。 示例用法如下:
hincrby 哈希名 字段名 增量数字
#假设哈希表 "myhash" 中已经有以下字段和对应的值:
field1: 10
field2: 20
# 使用 hincrby 命令增加字段 "field1" 的值:
hincrby myhash field1 5
#执行后,字段 "field1" 的值将变为 15。
#如果使用 HINCRBY 命令增加一个不存在的字段 "field3" 的值:
hincrby myhash field3 7
#执行后,哈希表 "myhash" 中将会添加一个新的字段 "field3",其值为 7。
# 以上数据视觉举例:
{myhash: {field1:10, field2:20} }
{myhash: {field1:15, field2:20} }
{myhash: { field1:15, field2:20, field3:7} }
# 补充:要对哈希表中的字段进行减量操作,可以使用hincrby命令,并将减量值设为负数。
`代码汇总:`
# 新增数据
hset myhash field1 "Hello"
# 查询数据
hget myhash field1
# 查询所有键
hkeys myhash
# 查询所有值
hvals myhash
# 查询所有键值对
hgetall myhash
# 获取哈希表中字段的数量
hlen myhash
# 批量新增
hmset myhash field1 value1 field2 value2 field3 value3
# 批量查询
hmget myhash field1 field2 field3
# 删除字段
hdel myhash field1 field2 field3
# 增量操作
hincrby myhash field1 5
hincrby myhash field3 -7
5、set---Sets
Set(集合):
Sets 具有以下特点:
- 无序性: Sets 中的元素是无序排列的,没有固定的顺序。
- 唯一性:每个元素在集合中是唯一的,不允许重复。
- 动态性:可以动态地添加、删除元素,集合的元素数量可以自由增减。
Sets 的常见用途包括: - 存储唯一标识符:可以用 Sets 存储用户标识符、商品标识符等唯一标识符,方便进行快速
查找和判断元素是否存在。 - 集合运算: Sets 支持集合运算,如交集、并集、差集等操作。可以对多个集合进行操作,获
取交集、并集、差集等结果。 - 标记、标签:可以用 Sets 存储对象的标记或标签,用于对对象进行分类或属性的标记。
- 去重:可以使用 Sets 去除列表中的重复元素,得到一个唯一元素的集合。
Redis 提供了一系列的命令来操作 Sets ,如 sadd 、 srem 、 smembers 、 sinter 等,用于添加
元素、移除元素、获取集合中的所有元素、进行集合运算等操作。
Sets 是一个非常实用的数据结构,在 Redis 中可以高效地进行元素的存储、去重、查找以及集合
运算,适用于各种数据处理和分析场景。
member 成员
# set类型
scard sname # 获取有多少个元素
# 一、 新增
sadd:向集合中添加一个或多个成员。它的用法如下:
# 语法:
sadd key member [member ...]
# 语法描述:
其中,key是集合的键名,member是要添加的成员。可以一次性添加多个成员。
# 举例:(myset的集合中添加三个成员:member1、member2和member3。)
sadd myset member1 member2 member3
sadd myset2 member1 member3 member5
# 二、 删除
# 1、指定删除
srem:用于从集合中移除一个或多个指定的成员。
# 语法:
srem key member [member ...]
# 语法描述:
其中,key是集合的键名,member是要移除的成员。可以一次性移除多个成员。
# 举例:(从名为myset的集合中移除member1和member2两个成员。)
srem myset member1 member2
# 2、随机删除
spop:用于从集合中随机移除并返回一个或多个成员。
# 情况一: 从集合中随机移除一个成员
# 语法:
spop key
# 语法描述:
其中,key是集合的键名
# 举例:(从名为myset的集合中随机移除一个成员)
spop myset
# 如果集合不为空,将返回一个随机成员,并将其从集合中移除。
# 补充:
如果要一次性移除并返回多个随机成员,可以指定可选参数count的值
# 情况二: 从集合中随机移除多个成员
# 补充语法:
spop key [count]
# 语法描述:
其中,key是集合的键名,count是可选参数,用于指定要随机移除的成员数量。
# 举例:(从集合中随机移除并返回3个成员。)
spop myset 3
# 三、 查询(set为无序集合,没有直接的下标访问方式)
# 1、查询集合(所有)
smembers:返回集合中的所有成员。
# 语法:
smembers key
# 语法描述:
其中,key是集合的键名。该命令将返回集合中的所有成员。
# 举例:(查询myset的集合中的所有成员)
smembers myset
# 2、随机查询(一个)
srandmember :从集合中随机返回一个或多个成员。
# 语法:
srandmember key [count]
# 注意:这些命令返回的成员顺序是随机的,并且在不同的调用之间可能会有所不同。
# 3、查询集合基数(成员数量)
scard:用于获取集合的成员数量,即集合的基数(cardinality)。
# 语法:
scard key
# 举例:(获取名为myset的集合中的成员数量)
scard myset
# scard 命令对于确定集合的大小或判断集合是否为空很有用。 如果集合
不存在,或者为空集,那么SCARD命令将返回0。
# 四、 集合成员转移
smove:将成员从一个集合移动到另一个集合。
# 语法:
smove 原集合 目标集合 成员
# 举例:将myset1集合 中的成员member1 移动到 myset2集合中
smove myset1 myset2 member1
`代码汇总:`
# 查询集合基数
scard sname
# 新增
sadd myset member1 member2 member3
sadd myset2 member1 member3 member5
6、zset -- Sorted sets
Sorted Set(有序集合):
Sorted Set 具有以下特点:
1. 有序性: Sorted Set 中的元素按照其关联的分数进行排序,使得元素在集合中按照一定顺
序排列。
2. 唯一性:每个元素在 Sorted Set 中是唯一的,不允许重复。
3. 分数关联:每个元素都与一个分数(score)相关联,用于对元素进行排序。分数可以是浮点
数或整数,并且允许成员具有相同的分数。
4. 动态性:可以对已存在的元素更新分数,或者添加新的元素。
Sorted Set 的常见用途包括:
1. 排行榜:可以用 Sorted Set 存储用户的积分、成绩等信息,根据分数对用户进行排名和排
序。
2. 计分系统:可以用 Sorted Set 存储用户的评分或打分数据,并根据分数进行排序和计算排
名。
3. 优先级队列:可以用 Sorted Set 存储带有优先级的任务或消息,根据分数来确定处理的顺
序。
4. 范围查询:可以根据分数范围进行区间查询,获取在指定分数范围内的元素。
Redis 提供了一系列的命令来操作 Sorted Set ,如 zadd 、 zrem 、 zrange 、 zscore 等,用于
添加元素、移除元素、按分数范围获取元素等操作。这使得 Sorted Set 成为 Redis 中一个强大
而灵活的数据结构,适用于许多不同的应用场景。
# 删除
srem myset member1 member2
spop myset
smembers myset
srandmember key [count]
scard myset
# 集合成员转移
smove 原集合 目标集合 member
smove myset1 myset2 member1
spop myset 3
查询
6、zset -- Sorted sets
Sorted Set(有序集合):
Sorted Set 具有以下特点:
- 有序性: Sorted Set 中的元素按照其关联的分数进行排序,使得元素在集合中按照一定顺
序排列。 - 唯一性:每个元素在 Sorted Set 中是唯一的,不允许重复。
- 分数关联:每个元素都与一个分数(score)相关联,用于对元素进行排序。分数可以是浮点
数或整数,并且允许成员具有相同的分数。 - 动态性:可以对已存在的元素更新分数,或者添加新的元素。
Sorted Set 的常见用途包括: - 排行榜:可以用 Sorted Set 存储用户的积分、成绩等信息,根据分数对用户进行排名和排
序。 - 计分系统:可以用 Sorted Set 存储用户的评分或打分数据,并根据分数进行排序和计算排
名。 - 优先级队列:可以用 Sorted Set 存储带有优先级的任务或消息,根据分数来确定处理的顺
序。 - 范围查询:可以根据分数范围进行区间查询,获取在指定分数范围内的元素。
Redis 提供了一系列的命令来操作 Sorted Set ,如 zadd 、 zrem 、 zrange 、 zscore 等,用于
添加元素、移除元素、按分数范围获取元素等操作。这使得 Sorted Set 成为 Redis 中一个强大
而灵活的数据结构,适用于许多不同的应用场景。
`zadd`、`zrem`、`zrange`、`zscore`、`zrangebyscore`、`zcard`、`zremrangebyrank`、
`zremrangebyscore`
# 一、 新增
zadd:向有序集合添加一个或多个成员,每个成员都关联一个分数。
# 语法:
zadd key score member [score member ...]
# 语法描述:
key 是有序集合的键名。
score 是成员的分数。
member 是成员的值。
# 举例:(向名为scores的有序集合中添加成员和分数)
zadd scores 85 "John" 92 "Alice" 78 "Bob" 90 "Sarah"
# 二、查询
# 1、索引查询
zrange:按照索引范围获取有序集合的成员。
# 语法:
zrange key 起始下标 结束下标
# 举例:(获取名为scores的有序集合中索引范围为 0 到 2 的成员)
zrange scores 0 2
# 2、查询指定成员分数
zscore:获取有序集合中指定成员的分数
# 语法:
zscore key member
# 举例:(获取名为scores的有序集合中成员"Alice"的分数)
zscore scores "Alice"
# 3、根据分数筛选查询
zrangebyscore:按照分数范围获取有序集合的成员。
# 语法:
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
# 举例:(获取名为scores的有序集合中分数范围为 80 到 90 的成员)
zrangebyscore scores 80 90
# 4、查询集合基数(集合的成员数量)
zcard:获取有序集合的成员数量,即集合的基数。
# 语法:
zcard key
# 举例:(获取名为scores的有序集合的成员数量)
zcard scores
# 三、删除
# 1、指定删除
zrem:从有序集合中移除一个或多个成员。
# 语法:
zrem key member [member ...]
# 举例:(从名为scores的有序集合中移除成员)
ZREM scores "Bob" "Sarah"
# 2、索引范围删除
zremrangebyrank:按照索引范围移除有序集合的成员。
# 语法:
zremrangebyrank key start stop
# 举例:(从名为scores的有序集合中移除索引范围为 0 到 1 的成员)
zremrangebyrank scores 0 1
# 3、分数范围删除
zremrangebyscore:按照分数范围移除有序集合的成员。
# 语法:
zremrangebyscore key min max
# 举例:(从名为scores的有序集合中移除分数范围为 80 到 90 的成员)
7、清理redis
zremrangebyscore scores 80 90
# 四、修改
zincrby:对有序集合中指定成员的分数进行增加或减少。
# 语法:
zincrby key increment member
# 语法描述:
key 是有序集合的键名,increment 是要增加或减少的分数值,member 是要操作分数的成员。
# 举例:(将成员 "Alice" 的分数增加 5)
zincrby myset 5 "Alice"
`代码汇总:`
# 新增
zadd scores 85 "John" 92 "Alice" 78 "Bob" 90 "Sarah"
# 查询
zrange scores 0 2
zscore scores "Alice"
zrangebyscore scores 80 90
zcard scores
# 删除
zrem scores "Bob" "Sarah"
zremrangebyrank scores 0 1
zremrangebyscore scores 80 90
# 修改
zincrby myset 5 "Alice"
7、清理redis
# 这些命令是具有破坏性操作的,会永久地删除数据,所以在使用之前请务必小心谨慎。在生产环境中,应谨
慎使用这些命令,以免误操作导致数据丢失。
flushdb 清空当前数据库的数据
flushall 清空所有数据库的数据