Redis学习笔记3
持久化
Redis 使用内存存储,一旦断电可能会导致数据丢失。因此需要将数据保存到永久性存储介质中,防止数据意外丢失。
如果 Redis 负责为数据库高热度数据访问加速或者一些其他业务(数据库中有重复数据),那么没必要为 Redis 数据持久化。
Redis 持久化有以下两种方式:
数据快照 RDB
定时将全部数据存入文件。存储速度慢但是恢复数据的速度很快,如果保存不及时仍会丢失少量数据。
数据以二进制形式默认存储在 安装目录/data/dump.rgb
文件。如果 Redis 数据库被关闭,下次重启时会从该文件读取数据。
手动存储
save # 数据存入文件(会阻塞 Redis 数据库,导致其他指令无法执行)
bgsave # 数据存入文件(Redis 数据库调创建单独进程完成指令)
debug reload # 重启 Redis,且关闭时将数据存入文件
shutrown save # 关闭 Redis,且关闭时将数据存入文件Copy to clipboardErrorCopied
修改配置
在 安装目录/conf/redis-6379.conf
配置文件内可以修改默认配置:
- 如果操作系统内安装了多个 Redis 数据库(使用不同的端口),必须通过修改存储文件名加以区分。
dir data2 # 修改存储路径(默认 data)
dbfilename dump-6379.rgb # 修改存储文件名(默认 dump.rgb)
rdbcompression no # 关闭数据压缩(默认开启),读取文件加快但文件会变大
rdbchecksum no # 关闭格式校验(默认开启),读取文件加快但存在文件损坏风险
stop-writes-on-bgsave-error no # 后台存储出现错误不停止(默认停止)Copy to clipboardErrorCopied
- 通过修改配置文件,可以让 Redis 数据库可以自动调用 bgsave 指令更新 RDB 文件。
save 100 10 # 自动存储(100s 内发生 10 个 key 数据变化时触发)Copy to clipboardErrorCopied
日志记录 AOF
将对数据的操作过程存入文件。这种方式刷新更频繁因此丢失数据概率更低,但恢复数据的速度比 RDB 方式更慢,占用存储空间也更大。
数据以二进制形式默认存储在 安装目录/data/appendonly.aof
文件。如果 Redis 数据库被关闭,下次重启时会根据该文件恢复数据。
文件重写
随着命令不断写入 AOF ,AOF 文件会越来越大,占用内存增多、恢复数据也会变慢。因此 Redis 需要对 AOF 文件进行重写,合并指令记录。
rewriteaof # 重写 AOF 文件(会阻塞 Redis 数据库,导致其他指令无法执行)
bgrewriteaof # 重写 AOF 文件(Redis 数据库调创建单独进程完成指令) Copy to clipboardErrorCopied
修改配置
AOF 不是默认持久化方式,需要在 安装目录/conf/redis-6379.conf
配置文件内修改默认配置:
- 必须通过配置文件开启并配置 AOF 存储。
appendonly yes # 选用 AOF 方式持久化
appendsync always # 每次操作刷新文件:非常频繁,损耗性能
appendsync everysec # 每秒刷新文件(默认)
appendsync no # 手动刷新文件Copy to clipboardErrorCopied
- 修改路径和文件名的操作和 RDB 方法类似。
dir data2 # 修改存储路径(默认 data)
dbfilename appendonly-6379.aof # 修改存储文件名(默认 appendonly.aof)Copy to clipboardErrorCopied
- 通过修改配置文件,可以让 Redis 数据库自动调用 bgrewriteaof 指令重写 AOF 文件。
略,之后补充Copy to clipboardErrorCopied
事务
假如我们通过多个操作执行一次购物,如果在这个过程中还执行了其他操作,可能导致我们的购物过程出现意想不到的错误。
因此我们引入事务的概念,将多个操作看作一个不可分割的整体,统一执行而不会被其他操作打断。
multi # 开启事务,之后的命令不再立刻执行、而是进入任务队列
# 输入事务内的命令
exec # 执行事务,执行任务队列里的命令
discard # 取消事务,清空任务队列Copy to clipboardErrorCopied
- 如果事务中包含语法错误(不能识别的命令),所有的命令都不会执行。
- 如果事务中包含无法执行的命令,仅有出错的命令将不会被执行,其他被执行的命令需要开发者自行回滚。
锁
在事务准备的过程中,如果执行的其他操作导致触发事务的条件发生了变化,这个时候就不应该继续执行事务。
我们引入了锁的概念来监视特定 key,在执行事务前如果其 value 发生了变化则终止事务执行。
watch key1 key2 # 监视 key,书写在 multi 命令前
unwatch # 取消监视 key,书写在 multi 命令前
# 在之后执行事务Copy to clipboardErrorCopied
分布式锁
如果 key 值变化极为频繁,那么使用普通锁会导致事务一直被终止。我们引入了分布式锁的概念,在加锁期间不允许其他进程对该值修改。
setnx lock-num 1 # 对 key(num) 加公共锁,其他线程不能对其进行操作。成功则返回 1,若已有锁导致失败返回 0
# 输入命令或者事务
del lock-num # 对 key(num) 解公共锁Copy to clipboardErrorCopied
分布式锁如果长期不被释放,就会出现死锁,导致其他操作无法继续执行。我们可以对分布式锁计时。计时分布式锁常用于多部署平台统一竞争锁。
expire lock-num 10 # 对 key(num) 加公共锁,10s 后自动释放
pexpire lock-num 10 # 对 key(num) 加公共锁,10ms 后自动释放Copy to clipboardErrorCopied
删除策略
Redis 中每个存储区域除了存储 key-value 值,还会开辟额外的存储空间 expires 记录每个 key-value 的存储地址以及过期时间。如果 key 过期或被删除指令删除,那么 Redis 要执行删除策略清理内存空间。
Redis 删除策略有以下三种方式,主要使用惰性删除和定期删除两种方式。
- 定时删除
key 过期后,存储 key-value 的内存地址立即被清空。
节省内存资源,但可能抢占处在繁忙状态的 CPU。
- 惰性删除
key 过期后不做任何处理。访问 key 时才检查是否过期,如果过期存储该 key-value 的内存地址才被清空。
节省 CPU 资源,但过期键值对可能大量占用内存。
- 定期删除
对于 16 个存储区域的 expires 进行轮询,对选中的 expires 随机选择 W 个 key 进行检查,如果 key 过期就进行删除。
- 如果过期 key 超过 25%,那么重复检查该 expires 存储区域。
- 如果过期 key 少于 25%,那么按顺序检查下一个 expires 存储区域。
逐出策略
如果 Redis 使用内存空间前会检查内存容量。如果已被占满,那么 Redis 要执行逐出策略删除部分数据,以清理内存空间执行指令。
在选取删除数据时 Redis 并不会扫描全库数据,而是随机选取部分数据检测并从中删除:以节省 CPU 性能。
响应配置如下:
maxmemory 50 # Redis 最大占用内存比例,默认为 0(全部可用)
maxmemory-samples # Redis 随机选取数据数量
maxmemery-policy volatile-lru # Redis 逐出策略Copy to clipboardErrorCopied
Redis 逐出策略有以下三种方式,在配置文件中配置即可。
-
检查会过期数据
volatile-lru
:(推荐)挑选最久未使用的数据淘汰。volatile-lfu
:挑选最近一段时间使用频率最低的数据淘汰。volatile-ttl
:挑选将要过期的数据淘汰。volatile-random
:随机挑选数据淘汰。
-
检查全部数据
allkeys-lru
:挑选最久未使用的数据淘汰。allkeys-lfu
:挑选最近一段时间使用频率最低的数据淘汰。allkeys-random
:随机挑选数据淘汰。
-
不逐出数据
no-enviction
:(默认)抛出错误 Out Of Memery。
- 点赞
- 收藏
- 关注作者
评论(0)