Redis存储方式介绍
在 Redis 中数据是以键值对的凡事存储的,键(Key)和值(Value)是基本的数据存储单元。以下是对 Redis 键值对的详细讲解:
键(Key):
类型:键是字符串类型,可以包含任何二进制数据。
长度限制:键的最大长度为 512 MB。
命名规范:虽然 Redis 对键的命名没有严格的要求,但为了提高可读性和管理性,通常使用有意义的命名规范。例如: session:abc123
值(Value):
值可以是多种数据类型之一,Redis 提供了丰富的数据结构来存储不同类型的数据:
比如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set,ZSet)、位图(Bitmap)、HyperLogLog、地理空间索引(Geospatial)、流(Stream)
这里以字符串类型举例,其他数据类型后面会介绍
基础全局命令介绍
设置和获取键值对(string)
这里操作就是这是一个key1 value1的键值对,key1为键,value1为值
设置好后,再用get命令获取到key1对应的值
获取到value1
检查键是否存在
exists key
因为有key1,所以使用key1可以查询到,返回了1
(这里也可以一次性查询多个key,返回就是有几个查到了,就返回几)
没有key2,查询不到,返回0
查找键
keys [pattern]
返回所有满足样式(pattern)的 key。支持如下统配样式。
h?llo 匹配 hello , hallo 和 hxllo
h*llo 匹配 hllo 和 heeeello
h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
h[a-b]llo 匹配 hallo 和 hbllo
keys * 返回数据库中所有key
使用 keys 命令在 Redis 中有很大的风险,特别是在生产环境中。这是因为 keys 命令会扫描整个数据库并返回匹配指定模式的所有键。这种操作可能会对 Redis 服务器的性能产生严重影响,特别是在键数量较多的情况下。
keys命令的风险
-
性能问题:
KEYS
命令是阻塞操作,会遍历整个数据库来查找匹配的键。- 在键数量较多时,执行
KEYS
命令可能会导致 Redis 服务卡顿,影响其他操作的响应时间。 - 这种操作的时间复杂度为 O(N),其中 N 是数据库中的键数量。
-
阻塞客户端:
- 如果一个客户端执行
KEYS
命令,其他客户端的请求可能会被阻塞,直到KEYS
命令执行完毕。 - 在高并发场景下,这种阻塞可能导致大量请求堆积,造成 Redis 服务不可用。
- 如果一个客户端执行
-
内存消耗:
KEYS
命令返回的结果集可能非常大,导致返回的数据量超出客户端的处理能力。- 结果集需要在内存中存储,可能导致 Redis 服务器的内存压力增大。
当然,也有其他命令可以代替keys,比如scan命令,后面会讲到。
在数据量很小的情况下,使用keys命令问题不大。
删除键
del key
这里因为存在key1,所以使用del删除返回1,表示删除成功1个
但是key2不存在,没有删除任何key,返回0
设置过期时间
expire key seconds (单位是秒)
pexpire key millisecond (单位是毫秒)
设置key1,然后设置key1的过期时间为10秒
10秒后用exists查询,返回0,说明key1已经过期被删除了
查询键的剩余生存时间
TTL:获取键的剩余生存时间(单位是秒)
PTTL:获取键的剩余生存时间(单位是毫秒)
设置键值对并设置过期时间
用ttl和pttl查询剩余过期时间
过期后,key1被删除,返回-2
如果返回-1,说明key是永久存在的,没有设置过期时间
redis过期策略
Redis 通过多种策略来管理键的过期和内存回收
可以在redis系统文件的配置,也就是redis.conf里修改过期策略
1. 惰性删除(Lazy Deletion)
惰性删除策略意味着当客户端访问某个键时,Redis 会检查该键是否已经过期。如果该键已经过期,Redis 将立即删除它,并返回一个不存在的结果。
- 实现方式:
- 每次读取或写入一个键时,Redis 都会检查该键的过期时间。
- 如果过期时间已到,Redis 会删除该键,然后返回不存在的结果或进行相应的写操作。
- 优点:
- 不会额外占用 CPU 资源,因为只在访问键时进行检查。
- 缺点:
- 过期键在没有被访问时仍会占用内存。
2. 定期删除(Periodic Deletion)
定期删除策略是指 Redis 以固定的时间间隔对带有过期时间的键进行扫描和删除。
- 实现方式:
- Redis 内部会运行一个后台任务,以每秒 10 次的频率随机抽取一部分带有过期时间的键进行检查。
- 如果发现这些键已经过期,Redis 会删除它们。
- 优点:
- 相对平衡了性能和内存回收的需求。
- 可以在一定程度上避免大量过期键长时间占用内存。
- 缺点:
- 由于是定期抽样检查,仍有可能存在一些过期键在被检查到之前长时间占用内存。
Redis 过期键处理策略(惰性删除和定期删除)是内置的,不需要特别配置。
但是可以通过以下配置调整定期删除的频率:(在redis.conf配置文件里)
hz 10
这表示 Redis 的事件循环频率,每秒执行 10 次事件循环。这个值会影响定期删除过期键的频率。
3. 主动删除(Active Deletion)
主动删除策略主要是通过内存淘汰策略(Eviction Policy)来实现,当 Redis 内存达到配置的最大使用量时,会主动删除一些键来释放内存。
-
配置方式:
- 可以通过
maxmemory
配置项设置 Redis 的最大内存使用量。 - 可以通过
maxmemory-policy
配置项设置内存淘汰策略,包括以下几种:volatile-lru
:从设置了过期时间的键中移除最近最少使用的键。allkeys-lru
:从所有键中移除最近最少使用的键。volatile-lfu
:从设置了过期时间的键中移除最不常使用的键。allkeys-lfu
:从所有键中移除最不常使用的键。volatile-ttl
:从设置了过期时间的键中移除将要过期的键。noeviction
:当内存达到限制时,不再进行删除操作,直接返回错误。volatile-random
:从设置了过期时间的键中随机移除键。allkeys-random
:从所有键中随机移除键。
- 可以通过
-
优点:
- 可以确保 Redis 在达到内存上限时继续运行。
- 根据不同的策略,可以优化特定场景下的性能和内存使用。
-
缺点:
- 可能导致一些热键(高频访问的键)被移除,从而影响性能。
4. 内存淘汰策略
当 Redis 内存使用达到限制时,会根据配置的内存淘汰策略删除一些键,以释放内存。以下是一些常用的内存淘汰策略:
- LRU(Least Recently Used):删除最近最少使用的键。
- LFU(Least Frequently Used):删除使用频率最少的键。
- TTL(Time to Live):删除最早过期的键。
- 随机删除:随机删除一些键。
可以通过 maxmemory-policy
配置项来设置具体的淘汰策略。
比如:
maxmemory-policy allkeys-lru
这表示当达到最大内存限制时,Redis 将采用 LRU策略在所有键中移除最近最少使用的键。