0%

Redis 4.x 配置详解

当前版本为 Redis 4.0.14,默认配置文件可查阅:https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf

环境配置

操作系统

建议使用主流的 Linux

overcommit_memory

对于独立的 Redis 服务器,建议设置 vm.overcommit_memory=1

1
2
3
4
5
6
7
8
9
# 临时设置
sysctl vm.overcommit_memory=1

# 永久设置
vi /etc/sysctl.conf
vm.overcommit_memory = 1

# 更新
sysctl -p

透明大页面

关闭透明大页面

常规配置

访问控制

1
bind 0.0.0.0

默认,如果没有配置,会监听所有地址

1
requirepass xxx

开启访问密钥,因为 Redis 请求非常快(15万/s,E5 V2 CPU实测 8万/s),所以如果是暴露外网的话,需要设置强有力的密码。

1
protected-mod yes

默认开启,如果没有配置 bind ,又没有配置访问密钥,会阻止 Redis 外部访问。这个配置的意义是让用户自己想清楚再干。

危险命令与安全

切勿在生产环境使用 keys * 指令,在大数据量情况下,它会导致 Redis CPU 飙升,直接崩溃。

应当部署时直接屏蔽这些危险的命令。

通过修改配置文件,将这些命令重置。

1
2
rename-command KEYS     ""
rename-command FLUSHALL ""

最大内存限制

尽量设置最大内存限制,来避免 OOM Killer,应该设置为最大空闲内存的 70-80%,因为 Redis 碎片化等还需要用一些内存。

1
maxmemory  xxx

不带单位默认是字节,注意 12G 与 12GB 换算单位不同

1
2
3
maxmemory 12000000000
maxmemory 12G
maxmemory 12GB

Redis 运行时动态设置:

1
2
config get maxmemory
config set maxmemory 20GB

可通过 info memory 查看当前 Redis 占用情况,其中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进程使用内存
used_memory_human:17.89G
# 操作系统显示进程使用内存
used_memory_rss_human:18.37G
# 内存占用峰值
used_memory_peak_human:17.96G
# 进程最大可用内存,即 maxmemory
maxmemory_human:111.76G
# 操作系统最大可用内存
total_system_memory_human:94.26G
# 碎片率,>1 说明有碎片
mem_fragmentation_ratio:1.03
# 内存溢出策略
maxmemory_policy:noeviction

最大内存溢出策略

1
maxmemory-policy noeviction
  • noeviction。默认,即永远不删除数据,当内存爆了以后会返回错误,并且阻塞写入,这个操作比较危险。除非你的Redis 仅用来存数据
  • volatile-lru。当内存快满的时候,对设置了过期时间的key,使用 LRU 算法进行淘汰,释放内存。当 Redis 既作为缓存又作为数据库时的 推荐配置。(如果没有可淘汰的key,会回退到 noeviction)
  • volatile-ttl。对设置了过期时间的key,优先淘汰生存时间较短的 key。(如果没有可淘汰的key,会回退到 noeviction)
  • volatile-random。对设置了过期时间的key,使用随机算法进行淘汰。(如果没有可淘汰的key,会回退到 noeviction)
  • allkeys-lru。对所有的 key,使用 LRU 算法进行淘汰
  • allkeys-random对所有的key,使用随机算法进行淘汰

对 key 设置缓存过期时间会占用额外的内存(测试需要至少额外20-25%内存),官方建议尽量将缓存和持久化数据拆分为 2个实例,这样,对于纯缓存的实例可以使用 allkeys-lru(应用不再需要额外设置缓存过期时间,有一定的内存优化效果)。

动态设置:

1
2
config get maxmemory-policy
config set maxmemory-policy volatile-lru

参考文档:https://redis.io/topics/lru-cache

Redis 中的 LRU 算法是个近似 LRU,有个配置项,默认是5,

1
maxmemory-samples 5

Redis 4 新增:

Redis 4 新增了 volatile-lfu、allkeys-lfu,算法目的是为了更好的提高缓存命中率。

LFU 意思是最不频繁使用淘汰算法。

日志与持久化机制

1
logfile /data/redis/redis.log

RDB 快照

Redis 通过 fock 一个子进程(子进程会共享父进程的内存空间)来进行快照操作,所以不会阻塞 Redis 主进程。

快照按照一定的持久化策略来进行,所以会丢失一定的数据,可以理解为备份,优势是重启时重建和恢复很快。

默认持久化策略:

1
2
3
save 900 1
save 300 10
save 60 10000

如果你的 Redis 主要作为缓存(允许丢失并且写入量很大),应当调大这个策略,单位是秒。

其他相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用校验
rdbchecksum yes

# 快照文件名
dbfilename dump.rdb

# 启用压缩
rdbcompression yes

# 默认,如果RDB失败(如磁盘满了),会阻塞写入操作,目的是为了提醒你尽早解决(会自动恢复)。
# 如果你有足够的运维能力,可以关闭它
stop-writes-on-bgsave-error yes

# 保存路径
dir /data/redis

AOF 持久化

默认未开启。

AOF 会记录每个写入操作,类似 MySQL 的 binlog,如果同时配置使用 AOF 和 RDB,重启时会使用 AOF 进行重放,因为它能保证最完整。

同样可以配置不同的 fsync 策略,默认是每秒进行 fsync,最多会损失一秒的数据,性能相对比较高(接近快照速度)。同样它也是在后台线程执行的。

同样还有其他策略:

always。 每次写操作都会进行同步,最慢但是也最安全。
no。 由操作系统来控制同步操作。(通常情况Linux每30秒刷新一次)

1
2
3
4
appendfsync everysec

# appendfsync no
# appendfsync alway

AOF 日志默认是追加的方式,当日志比较大的时候,Redis 会自动重建这个日志。