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

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

同nodejs类似
* 优点:
1. 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求;
2. 避免线程切换而消耗CPU
* 缺点:
1. 无法发挥多核CPU性能,不过可以通过在单机开多个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如何能够高并发

redis与CPU、内存的更多相关文章

  1. 设置Redis最大占用内存

    https://blog.csdn.net/happyrabbit456/article/details/54945667 Redis需要设置最大占用内存吗?如果Redis内存使用超出了设置的最大值会 ...

  2. Redis INFO CPU 信息详解

    一.INFO CPU 通过INFO CPU命令可以查看Redis进程对于CPU的使用情况,如下: 这几个字段的含义如下所示: used_cpu_sys: System CPU consumed by ...

  3. Redis所需内存 超过可用内存怎么办

    爬虫和转载请注明原文地址:博客园蜗牛 http://www.cnblogs.com/tdws/p/5727633.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  4. 统计和分析系统性能【IO CPU 内存】的工具集合

    统计和分析系统性能[IO CPU 内存]的工具集合 blktrace http://www.oschina.net/p/blktrace 获取磁盘写入的信息 root@demo:~/install/p ...

  5. 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  6. 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  7. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  8. Redis 数据结构与内存管理策略(下)

    Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  9. linux Java项目CPU内存占用高故障排查

    linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对 ...

随机推荐

  1. mysql cluster部署

    一.mysql cluster的基本概念 1.mysql cluster的组成            管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据.启 ...

  2. Error:unsupported class file version 52.0问题的解决

    这个问题主要的原因是依赖包的编译版本比主程序的编译版本高,导致主程序无法正常编译或运行,解决这个问题无非两招: 1.提升主程序的编译器版本,用最新的编译器编译主程序,这样就可以兼容那个依赖包 2.降低 ...

  3. Mac下面解决PYTHONPATH配置的方法

    问题起因:MacPort安装的Python包在/opt目录里面,和系统安装的python包不在一起,由于Mac下面编译安装无止境的找不到问题,虽然MacPort解决了这个问题,但是它安装的东西,得自己 ...

  4. Ocelot中文文档-跟踪

    Ocelot使用一个杰出的项目Butterfly 提供了跟踪功能. 为了使用跟踪,请阅读Butterfly的文档. 在Ocelot中如果你想跟踪一个ReRoute,你需要做如下事情: 在Configu ...

  5. Nowcoder84D

    Nowcoder84D 传送门 很有趣的进制转换题! 如果x满足题意,那么x+k-1一定能符合要求! 因为k-1用k进制表示就是1,-1,1+(-1)=0所以数位之和不变! 用map维护一下前缀和.就 ...

  6. Rafy 领域实体框架简介

    按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...

  7. 4sumii

    problem description: there is four number list named A,B,C,D; now you should out put the num of  tup ...

  8. 【leetcode】 算法题 两数之和

      问题       给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

  9. 使用伪类before和after

    .content { padding: 20px } .content::before { content: "我是before添加的内容"; font-weight: bold ...

  10. 学习CTF的经历-文件分析

    文件分析-ZIP伪加密 最近在准备铁人三项赛的比赛,所以在实验吧上尝试着学习CTF,目前菜鸡一枚 我主要负责的是Web和安全杂项这一块,安全杂项的知识点较为薄弱,在实验吧练习的过程中遇到一个很有趣的题 ...