当前版本为 Redis 4.0.14,默认配置文件可查阅:https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf
环境配置
操作系统
建议使用主流的 Linux
overcommit_memory
对于独立的 Redis 服务器,建议设置 vm.overcommit_memory=1
1 | # 临时设置 |
透明大页面
关闭透明大页面
常规配置
访问控制
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 | rename-command KEYS "" |
最大内存限制
尽量设置最大内存限制,来避免 OOM Killer,应该设置为最大空闲内存的 70-80%,因为 Redis 碎片化等还需要用一些内存。
1 | maxmemory xxx |
不带单位默认是字节,注意 12G 与 12GB 换算单位不同
1 | maxmemory 12000000000 |
Redis 运行时动态设置:
1 | config get maxmemory |
可通过 info memory 查看当前 Redis 占用情况,其中:
1 | # 进程使用内存 |
最大内存溢出策略
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 | config get maxmemory-policy |
参考文档: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 | save 900 1 |
如果你的 Redis 主要作为缓存(允许丢失并且写入量很大),应当调大这个策略,单位是秒。
其他相关配置:
1 | # 启用校验 |
AOF 持久化
默认未开启。
AOF 会记录每个写入操作,类似 MySQL 的 binlog,如果同时配置使用 AOF 和 RDB,重启时会使用 AOF 进行重放,因为它能保证最完整。
同样可以配置不同的 fsync 策略,默认是每秒进行 fsync,最多会损失一秒的数据,性能相对比较高(接近快照速度)。同样它也是在后台线程执行的。
同样还有其他策略:
always
。 每次写操作都会进行同步,最慢但是也最安全。no
。 由操作系统来控制同步操作。(通常情况Linux每30秒刷新一次)
1 | appendfsync everysec |
AOF 日志默认是追加的方式,当日志比较大的时候,Redis 会自动重建这个日志。