可以在redis启动的时候绑定固定的cpu,防止cpu切换引起的上线文切换:
taskset -c 1 ./redis/bin/redis-server ./reids/conf/redis.conf
redis.conf配置如下:
# 8核cpu可以并行6个
io-threads 6
所谓内存碎片,是指申请连续的一段内存空间,系统会找到一块符合申请大小的内存空间,但是如果开始申请了12KB的大小,然后回收,后续如果申请都大于12KB,那么这12KB空间无法被分配,相当于浪费了,redis中有自己的内存碎片整理机制,配置如下:
#内存碎片清理开关
activedefrag yes
#内存碎片达到多大的时候开始清理
active-defrag-ignore-bytes 100mb
#内存碎片占总内存达到多少百分比的时候开始清理
active-defrag-threshold-lower 10
#当内存碎片率达到多少时开启最大清理
active-defrag-threshold-upper 100
#清理内存碎片占用CPU时间的比例不低于此值开始清理
active-defrag-cycle-min 5
#清理内存碎片占用cpu时间比例不高于此值,如果超过,停止清理
active-defrag-cycle-max 75
linux中swap类似虚拟内存,当物理内存不够的时候,会把内存中不活跃跌数据置换到硬盘上,释放一部分物理内存,swappiness表示swap的占比,如果是0表示积极的使用物理内存
# cat /proc/sys/vm/swappiness
60
可以设置为 1
:
echo 1 > /proc/sys/vm/swappiness
echo vm.swappiness=1 >> /etc/sysctl.conf
#表示每个端口上半连接监听最大队列长度
$ cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024
#表示每个端口上已经建立连接监听的最大监听队列长度
$ cat /proc/sys/net/core/somaxconn
128
redis中默认的tcp-backlog=511 ,表示最大TCP全连接队列为511。一般在Linux下,对于一个TCP的连接的最大数量有两个方面:
cat /proc/sys/vm/overcommit_memory
0
vm.overcommit_memory
设置overcommit的内存分配策略,它有三个可选值
0:内核将检查是否有足够的内存分配给程序。如果没有则申请失败,并把错误返回给应用进程。而在Redis中这个错误就会表现为“Cannot allocate memory”,然后触发OOM
1:表示内核允许超量使用内存直到用完为止
2:表示内核决不超量使用内存,即系统整个内存空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数支持修改
redis中建议将该值设置为1
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
一般情况下,分配内存页大小为4KB,开启大页之后能够达到2MB,能够降低fork子进程的速度,但是会大幅增加父进程重写期间的内存消耗
热键,一般指摸个瞬间或者突然有大量请求同一个key。
redis提供了如下命令查找热key:
./redis-cli --hotkeys
hotkey可以有如下几种处理思路:
何谓bigkey:
redis提供了如下命令查找大键
./redis-cli --bigkeys
bigkey优化:
redis.conf中配置如下:
maxmemory 20gb
maxmemory-policy allkeys-lru
过期策略有如下几种:
我们知道redis中持久化有两种方式rdb和aof,但是两种模式存在不足:
# 前提是开启了aof
aof‐use‐rdb‐preamble yes
开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件,才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
高并发情况下,缓存中没有数据,查询都去查询数据库,导致数据库压力陡增,解决方案:
大量的key缓存或者redis重启导致大量的访问在redis中查找不到数据,访问数据库,导致数据库压力陡增,甚至崩溃,解决方案:
类似hotkey,hotkey在某个时刻失效,大量请求过来查询数据库,解决方法
如果可以接收最终一致性,那么可以通过先删除缓存,然后更新数据库,或者一定间隔后更新数据库,或者通过binlog定时更新数据库
如果必须强一致性,那么可以如下解决:
在接入端,比如nginx 通过hash将通一个id路由到同一个服务中处理,在同一个处理中,在路由将一个id放在同一个队列中,通过队列串行处理