开发者社区> 武师叔> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Redis 高级

简介: Redis 使用内存存储,一旦断电可能会导致数据丢失。因此需要将数据保存到永久性存储介质中,防止数据意外丢失。 如果 Redis 负责为数据库高热度数据访问加速或者一些其他业务(数据库中有重复数据),那么没必要为 Redis 数据持久化。
+关注继续查看

Redis 高级

持久化

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 :随机挑选数据淘汰。
  1. 检查全部数据
    • allkeys-lru :挑选最久未使用的数据淘汰。
    • allkeys-lfu :挑选最近一段时间使用频率最低的数据淘汰。
    • allkeys-random :随机挑选数据淘汰。
  1. 不逐出数据
    • no-enviction :(默认)抛出错误 Out Of Memery。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
redis哨兵
redis,哨兵,sentinel
1461 0
2.安装redis
安装redis Tags: redis 下载redis redis源码下载 编译 cd redis make 安装到指定目录 make PREFIX=/usr/local/redis install 目录结构 安装完成后redis下只有一个bin目录,并且只有5个可执行程序 redis-ser...
3728 0
Redis安装与应用
1.Redis定义    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。    Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,h
1072 0
redis安装
下载 Redis # wget http://download.redis.io/releases/redis-4.0.1.tar.gz  # tar xzf redis-4.
731 0
+关注
武师叔
做一个有趣而不甘平庸的人!
60
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载