Redis学习笔记3

举报
幼儿园老大* 发表于 2024/07/19 13:27:28 2024/07/19
【摘要】 持久化Redis 使用内存存储,一旦断电可能会导致数据丢失。因此需要将数据保存到永久性存储介质中,防止数据意外丢失。如果 Redis 负责为数据库高热度数据访问加速或者一些其他业务(数据库中有重复数据),那么没必要为 Redis 数据持久化。Redis 持久化有以下两种方式:数据快照 RDB定时将全部数据存入文件。存储速度慢但是恢复数据的速度很快,如果保存不及时仍会丢失少量数据。数据以二进制...

持久化

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
  1. 如果事务中包含语法错误(不能识别的命令),所有的命令都不会执行。
  2. 如果事务中包含无法执行的命令,仅有出错的命令将不会被执行,其他被执行的命令需要开发者自行回滚。

在事务准备的过程中,如果执行的其他操作导致触发事务的条件发生了变化,这个时候就不应该继续执行事务。

我们引入了锁的概念来监视特定 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 删除策略有以下三种方式,主要使用惰性删除和定期删除两种方式。

  1. 定时删除

key 过期后,存储 key-value 的内存地址立即被清空。

节省内存资源,但可能抢占处在繁忙状态的 CPU。

  1. 惰性删除

key 过期后不做任何处理。访问 key 时才检查是否过期,如果过期存储该 key-value 的内存地址才被清空。

节省 CPU 资源,但过期键值对可能大量占用内存。

  1. 定期删除

对于 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 逐出策略有以下三种方式,在配置文件中配置即可。

  1. 检查会过期数据

    • volatile-lru :(推荐)挑选最久未使用的数据淘汰。
    • volatile-lfu :挑选最近一段时间使用频率最低的数据淘汰。
    • volatile-ttl :挑选将要过期的数据淘汰。
    • volatile-random :随机挑选数据淘汰。
  2. 检查全部数据

    • allkeys-lru :挑选最久未使用的数据淘汰。
    • allkeys-lfu :挑选最近一段时间使用频率最低的数据淘汰。
    • allkeys-random :随机挑选数据淘汰。
  3. 不逐出数据

    • no-enviction :(默认)抛出错误 Out Of Memery。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。