一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。
redis 的运行机器 cpu 不求核数多,但求主频高,cache大,因为 redis 主处理模式是单进程的。
留意 redis 日志文件的配置,对应 logfile 参数。redis.log 为 redis 主日志,sentinel.log 为 sentinel 监控日志。
关闭 thp,这个默认的 linux 内存页面大小分配策略会导致 rdb 时出现巨大的 latency 和巨大的内存占用。关闭方法为:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
一定要设置最大内存 maxmemory 参数,否则物理内存用爆了就会大量使用 swap,写 rdb 文件时的速度很慢。设置的参数参考:机器内存 * 45% / 1.2。(1.2 为内存碎片)
maxmemory-policy 策略,则当 redis 内存数据达到 maxmemory 时,会根据 maxmemory-policy 配置来淘汰内存数据,以避免oom。
持久化配置。在配置上有三种选择:不持久化,rdb,rdb + aof(默认)。另外,如果为主从复制关系,建议主服务器关闭持久化。
# rdb 持久化配置 save 900 1 #在900秒(15分钟)之后,如果至少有 1 个key发生变化,则 dump 内存快照。 save 300 10 #在300秒(5分钟)之后,如果至少有 10 个key发生变化,则 dump 内存快照。 save 60 10000 #在60秒(1分钟)之后,如果至少有 10000 个key发生变化,则 dump 内存快照。 # aof 持久化配置 appendfsync always #每次有数据修改发生时都会写入aof文件。 appendfsync everysec #每秒钟同步一次,该策略为aof的缺省策略。 appendfsync no #从不同步。高效但是数据不会被持久化。
redis 使用的是单进程(除持久化时),所以在配置时,一个实例只会用到一个cpu。那么如何指定 redis 使用的 cpu 呢?
#显示进程运行的cpu (15361 为 redis-server 的进程号)。显示结果的 f 实际上是二进制4个低位均为 1 的 bitmask,每一个 1 对应于 1 个cpu,表示该进程在 4 个cpu上运行 [root@localhost redis] taskset -p 15361 pid 15361's current affinity mask: f #指定进程运行在某个特定的cpu上。该命令的 3 表示 cpu 将只会运行在第 4 个cpu上(从0开始计数) [root@localhost redis] taskset -pc 3 15361 pid 15361's current affinity list: 0-3 pid 15361's new affinity list: 3
修改配置:
# 临时配置 127.0.0.1:6379> config set requirepass 123456 ok # 永久配置,将目前服务器的参数配置写入 redis.conf 127.0.0.1:6379> config rewrite ok # 永久配置也可通过直接修改 redis.conf 的方式
rdb 持久化命令:
发送原始的 redis protocl 格式数据到服务器端执行: echo -en '*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | redis-cli -a 123456 --pipe
探测服务延迟,千兆网卡一般延迟在 0.16ms 左右:
[root@localhost redis]# redis-cli --latency min: 0, max: 5, avg: 0.24 (1874 samples)
查看统计信息:info
统计 redis 数据存储中比较大的key(用 scan 的方式对 redis 中的 key 进行采样,寻找较大的 keys):redis-cli --bigkeys
获取慢查询:
# 得到慢查询列表,默认保留 128 条(slowlog-max-len 参数) 127.0.0.1:6379> slowlog get 10 1) 1) (integer) 1 # 查询id 2) (integer) 1572146706 # 发生时间 3) (integer) 12239 # 运行时长,该时间不包含网络延迟(微秒) 4) 1) "save" # 原命令 2) 1) (integer) 0 2) (integer) 1569327858 3) (integer) 391725 4) 1) "get" 2) "yungu_redis_admin_access_token_5e6a833c21a87983459a985753ae5425" # 清空慢查询 127.0.0.1:6379> slowlog reset ok
快速产生测试数据:debug populate
127.0.0.1:6379> dbsize (integer) 1410 127.0.0.1:6379> debug populate 100 ok 127.0.0.1:6379> dbsize (integer) 1510
模拟 aof 加载情形(清空当前数据库,重新从aof文件里加载数据库):debug loadaof
如对本文有疑问, 点击进行留言回复!!
修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解
MongoDB中数据的替换方法实现类Replace()函数功能详解
网友评论