redis与CPU、内存

任何一个后端应用,包括代码都要考虑对于CPU和内存的影响.redis本质上相似于nodejs,单进程、单线程,事件驱动,但不一样的是redis是CPU密集型的。这里列出了redis与内存CPU的相关考虑点。node

单进程、单线程的redis如何实现高并发

同nodejs相似
* 优势:
1. 采用多路 I/O 复用技术可让单个线程高效的处理多个链接请求;
2. 避免线程切换而消耗CPU
* 缺点:
1. 没法发挥多核CPU性能,不过能够经过在单机开多个Redis实例来完善redis

若是redis内存满了怎么办

  1. 增长内存
  2. 使用内存淘汰策略
  3. 搭建redis集群

若是redis致使CPU太高怎么办

  1. 链接数过多,经过redis-cli info | grep connected_clients查看当前链接
    解决:
    • 关闭僵尸链接; redis-cli登陆后,client list查看全部客户端链接,client kill ${ip}:${port} 关闭链接;
    • 修改最大链接数maxclients: 10000,默认10000;
    • 修改redis timeout参数: 修改配置文件中的timeout 设置redis的keepalive时间。客户端断连的包发出去后,redis server没有接受到,则会出现redis server觉得链接正常的状况。所以须要在redis server 启动超时设置,若是在必定的时间内,客户端没有消息过来,则redis server主动断开链接。
    • 修改redis进程的文件数限制: echo -n "Max open files 3000:3000" > /proc/PID/limits
    • 修改系统参数的最大文件数限制: /etc/security/limits.conf; redis服务器默认设置的最大链接数maxclients是10000,可是受服务器最大文件数影响,服务器默认最大文件数是1024,因此redis最大链接也为1024-32=992; 解决办法
  2. 慢查询,由于redis是单线程,若是有慢查询的话,会阻塞住以后的操做,经过redis日志查
  3. value值过大:若是是纯文本,能够考虑换种存储方式,若是是对象,能够考虑用hash;
  4. aof重写/rdb fork发生?瞬间会堵一下Redis服务器

redis性能优化

  1. Master最好不要作任何持久化工做,包括内存快照和AOF日志文件,特别是不要启用内存快照作持久化。
  2. 若是数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
  3. 为了主从复制的速度和链接的稳定性,Slave和Master最好在同一个局域网内。
  4. 尽可能避免在压力较大的主库上增长从库。
  5. 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<--Slave2<--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,若是Master挂了,能够立马启用Slave1作Master,其余不变
  6. 使用Redis负载监控工具:redis-monitor,它是一个Web可视化的 redis 监控程序
  7. redis分库,这样方便于管理与维护。

redis占用资源监控工具——redis-monitor

部署
OK: init configuration file into /root/.redis-monitor/redis_monitor_config.py.
OK: database is initialed into /root/.redis-monitor/redis_monitor.db.后端

参考

  1. redis cpu占用太高排查
  2. 单进程单线程的Redis如何可以高并发
相关文章
相关标签/搜索