任何一个后端应用,包括代码都要考虑对于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. Golang之Context的使用

    转载自:http://www.nljb.net/default/Golang%E4%B9%8BContext%E7%9A%84%E4%BD%BF%E7%94%A8/ 简介 在golang中的创建一个新 ...

  2. zinnia项目功能分析

    Zinnia是基于Django开发的一个开源博客系统,近期为了写一个类博客系统特对它做功能分析,+号的多少表明这个功能对于博客的重要性: ++评论:Comments 站点图:Sitemaps ]压缩视 ...

  3. STOMP协议规范

    原文: STOMP Protocol Specification, Version 1.2 摘要 STOMP是一个简单的可互操作的协议, 被用于通过中间服务器在客户端之间进行异步消息传递.它定义了一种 ...

  4. Ocelot中文文档-跟踪

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

  5. mina框架tcpt通讯接收数据断包粘包处理

    用mina做基于tcp,udp有通讯有段时间了,一直对编码解码不是很熟悉,这次做项目的时候碰到了断包情况,贴一下解决过程, 我接受数据格式如下图所示: unit32为c++中数据类型,代表4个字节,由 ...

  6. ArcCore重构-生成%_offset.h文件

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题   ArcCore中,需要生成asm_offset.h和arch_offset.h这两个头文件,定义着代 ...

  7. 设计一个卖不同种类车的4s店

    # 定义奔驰车类 class BenchiCar(object): # 定义车的方法 def move(self): print('---奔驰车在移动---') def stop(self): pri ...

  8. java(一、概念和开发工具)

    Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...

  9. 海量信息库,查找是否存在(bloom filter布隆过滤器)

    Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...

  10. onCreate和onStart谁的开销大?

    大家都知道,onCreate方法在创建的时候开始调用一些方法来获取资源方面的东西,这个是在程序运行之初才执行的,一个完整的生命周期中,它只执行了一次,不被onDestroy掉,就一直不调用,而onSt ...