任何一个后端应用,包括代码都要考虑对于CPU和内存的影响.redis本质上类似于nodejs,单进程、单线程,事件驱动,但不同的是redis是CPU密集型的。这里列出了redis与内存CPU的相关考虑点。
单进程、单线程的redis如何实现高并发
同nodejs类似
* 优点:
1. 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求;
2. 避免线程切换而消耗CPU
* 缺点:
1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
如果redis内存满了怎么办
- 增加内存
- 使用内存淘汰策略
- 搭建redis集群
如果redis导致CPU过高怎么办
- 连接数过多,通过
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; 解决办法
- 关闭僵尸连接;
- 慢查询,因为redis是单线程,如果有慢查询的话,会阻塞住之后的操作,通过redis日志查
- value值过大:如果是纯文本,可以考虑换种存储方式,如果是对象,可以考虑用hash;
- aof重写/rdb fork发生?瞬间会堵一下Redis服务器
redis性能优化
- Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
- 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
- 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
- 尽量避免在压力较大的主库上增加从库。
- 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<--Slave2<--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变
- 使用Redis负载监控工具:redis-monitor,它是一个Web可视化的 redis 监控程序
- 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
.
参考
随机推荐
-
subline text3 删除行 快捷键设置
打开 首选项-->按键绑定 { "keys": ["ctrl+shift+k"], "command": "run_macr ...
-
paip.hql的调试故障排查流程总结
paip.hql的调试故障排查流程总结 环境.myeclipse7.0 1 Hql的调试工具myeclipxe默认工具.../Hibernate8IDE 1 故障的排除方法overview 1 Hql ...
- 疯狂java讲义——初始化块
-
c# 获取数组中最大数的值
求数组中最大的数的值:1.数组的max函数: class Program { static void Main(string[] args) { ,,,,,,,,,}; int max= GetMax ...
-
bzoj 1318: [Spoj744] Longest Permutation 智商题
1318: [Spoj744] Longest Permutation Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 361 Solved: 215 ...
-
C#读取网页
public bool getweb(string strURL,out string buf) { buf=""; try { //Uri url=new Uri(strURL, ...
-
LeetCode---Container With Most Water(11)
Description: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordin ...
-
Mac下安装Mysql以及修改Mysql密码
1.安装Mysql 安装有2种办法,一种是下载mysql安装文件,慢慢安装,另一种就是下载xmpp,里面自带mysql,就像是安装普通的mac软件一样,安装完毕,就有了mysql了. 方法一,官网下载 ...
-
wordpress如何去掉generator
用wordpress建站经常会出现一些显而易见的标签,比如说作者<meta name="generator" content="WordPress 4.9" ...
-
Oracle数据库类型
Oracle数据库类型 字符类型char[(length)] 定长字符 最长2000字节varchar2[(length)] 可变长度的字符数据类型,最长4000字节NCHAR[(length)] 固 ...