# 主服务
- 基础配置
port 6379 | |
requirepass 123456(密码,建议不设置) | |
vm-enabled no (虚拟内存,内存够的情况下可以不使用) | |
maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入) | |
bind 127.0.0.1 (注释掉,否则不能外部连接) | |
rdbchecksum no(持久化数据检查) | |
list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb) | |
list-compress-depth 20(quicklist的两端多少个node不压缩,0为全部不压缩) |
sysctl vm.overcommit_memory=1 (立即生效) | |
修改/etc/sysctl.conf添加vm.overcommit_memory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何。Redis的RDB持久化实现是folk一个子进程,然后让子进程将内存镜像dump到RDB文件中。理论上来说是需要跟父进程一样的内存空间,但是由于linux很早就支持的copy-on-write技术,所以实际上并不需要这么多的物理内存的。) |
- 禁用透明大页(影响性能)
需要sudo su 切换到root身份(sudo 没用) | |
echo never > /sys/kernel/mm/transparent_hugepage/enabled | |
修改/etc/init.d/redis-server,加入/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled |
- 修复 TCP 警告
sysctl net.core.somaxconn=1024(立即生效) | |
修改/etc/sysctl.conf添加net.core.somaxconn=1024 |
- 客户端缓冲区限制
客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。 | |
可以三种不同客户端的方式进行设置: | |
normal -> 正常客户端 | |
slave -> slave 和 MONITOR 客户端 | |
pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端 | |
语法 : | |
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds> | |
一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。 | |
例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据, | |
只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。 | |
把硬限制和软限制都设置为 0 来禁用该特性 | |
client-output-buffer-limit normal 0 0 0 | |
client-output-buffer-limit slave 5gb 512mb 60 | |
client-output-buffer-limit pubsub 32mb 8mb 60 |
- 持久化配置
---关闭RDB持久化--- | |
save "" | |
默认配置如下: | |
save 900 1 #900 秒内有 1 次更新就持久化 | |
save 300 10 #300 秒内有 10 次更新就持久化 | |
save 60 10000 #60 秒内有 10000 次更新就持久化 | |
---关闭RDB持久化--- | |
主从同步支持两种策略,即disk和socket方式。 | |
新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。 | |
一个RDB文件从master端传到slave端,分为两种情况: | |
1、支持disk:master端将RDB file写到disk,稍后再传送到slave端; | |
2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。 | |
repl-diskless-sync no 默认不使用diskless同步方式 | |
repl-diskless-sync-delay 30 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒 | |
repl-ping-slave-period 60 slave端向server端发送pings的时间区间设置,默认为10秒 | |
repl-timeout 3600 设置超时时间 | |
repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。 | |
repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。 | |
backlog设置的越大,slave可以失连的时间就越长。 | |
repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。 | |
slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。 | |
min-slaves-to-write 3 | |
min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。 |
# 从服务
基本配置同主服务一致 | |
slaveof 127.0.0.1 6379(主redis的ip和端口) | |
masterauth 123456 (主redis的密码) | |
可以通过slaveof no one命令将Slaver升级为Maste | |
bgsave (持久化命令,在redis-cli中执行,默认创建dump.rdb文件,路径为 /var/lib/redis/dump.rdb。可通过find / -name dump.rd查找) |
# 相关命令
看状态 | |
sudo /etc/init.d/redis-server status | |
看端口 | |
netstat -nlt|grep 6379 | |
外部连接 | |
sudo vim /etc/redis/redis.conf把protected-mode改为no,把bind ip注释掉 | |
重启 | |
sudo server redis-server restart | |
查看内存 | |
free -m | |
批量删除指定key | |
redis-cli -n 6 scan 0 match *2020-06-12 count 10000| xargs redis-cli -n 6 del | |
大量删除key后快速释放被占用的内存 | |
memory purge |
# 问题解决
写入问题 | |
redis-cli config set stop-writes-on-bgsave-error no | |
sudo vim /etc/redis/redis.conf把stop-writes-on-bgsave-error改为no | |
修改系统 sudo vim /etc/sysctl.conf加入vm.overcommit_memory=1 | |
sudo sysctl vm.overcommit_memory=1 |