首页
归档
朋友
关于我
留言
Search
1
虚拟机无法ping不通百度,并无法访问浏览器
4,847 阅读
2
mysql使用or条件使索引失效
4,061 阅读
3
mysql如何在一对多查询时选取时间最近的一条记录
3,475 阅读
4
根据MySQL获取当天,昨天,本周,本月,上周,上月,本月的起始时间
2,927 阅读
5
熟悉mysql的共享锁、排它锁、悲观锁、乐观锁以及使用场景
1,766 阅读
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
登录
Search
标签搜索
php
mysql
代码片段
linux
Thinkphp
Redis
nginx
mysql优化
docker
面试指南
面向对象
git
Laravel框架
http协议
RabbitMQ
Redis性能优化
设计模式
linux命令
编译安装
PhpSpreadsheet
黎明强
累计撰写
70
篇文章
累计收到
59
条评论
首页
栏目
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
页面
归档
朋友
关于我
留言
搜索到
1
篇与
Redis性能优化
的结果
2022-06-18
Redis的性能优化一些方案
Redis性能优化客户端优化Pipeline批量操作连接池的应用设置合理的淘汰机制设置合理的内存大小设置合理的过期时间 (设置的太久,久而久之内存空间不够用了,设置的太短,key失效就会频繁的出现淘汰策略)选择合适的淘汰策略key与value的优化Key设计可读性和可管理性,以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如 业务名:表:id简洁性,保证语义的前提下,控制key的长度,当key较多时,内存占有也不容忽视不要包含特殊字符,比如:包含空格、换行、单双引号以及其他转义字符Value设计拒绝Bigkey(防止网卡流量、慢查询),string类型控制在10kb以内,hash、list、set、zset元素个数不要超过5000。选择合适的数据类型控制key的生命周期(设置有效时间),redis不是垃圾桶BigKey的优化什么样的Key才算是Big Key呢?一般情况下,当key的值大于10Kb时就可以算是Big Key了。如下场景都是可能遇到Big key,比如:粉丝列表统计数据,比如PV或者UV统计使用不当的数据缓存,比如通过String保存序列化后的用户数据等出现了Big Key你也不用非常紧张,因为某些场景下不得不使用,下面我们看下如何进行发现与优化发现Big Key常规做法:redis-cli-bigkeys优点:简单的扫描,不阻塞服务缺点:信息量太少了 (只能看到元素的个数)客户端访问cli#无密码 ./redis-cli --bigkeys #有密码 ./redis-cli -a 123456 --bigkeys会返回两部分的内容,分别是: 上半部分的“扫描部分” 下面的是“统计部分”。扫描区:会扫描当前redis最大的Key,(注意:但是并不代表它就是BigKey) ,只是告诉你当前环境最大的Key是比较大的。比如上面的user:sign:202206 占了1个字节 。Redis4.0之后的memory usage命令 memory usage 给出一个key和它值在RAM中占有的字节数,返回的结果是key的值以及为管理该key分配的内存总字节数。所以查询Big key的手段就可以使用脚本进行查询,大概思路就是时使用scan游标查询key,然后使用memeory usage key 获取这个key与value的字节数,这样就能很方便的得出结论进行优化,比如:import sys import redis def check_big_key(r,k); bigKey = False length = 0 try: type = r.type(k) if type == "string" length = r.strlen(k) elif type == "hash" length = r.hlen(k) elif type == "list" length = r.llen(k) elif type == "set" length = r.scard(k) elif type == "zset" length = r.zcard(k) except: retrun if length > 10240 : bigKey = True if bigKey : print db,k,type,length def find_big_key_normal(db_host,db_port,db_password,db_num) : r= redis.StrictRedis(host=db_host,port=db_port,password=db_password,db=db_num) for k in r.scan_iter(count=1000) : check_big_key(r,k) def find_log_key_sharding(db_host,db_port,db_password,db_num,nodecount) : r= redis.StrictRedis(host=db_host,port=db_port,password=db_password,db=db_num) cursor = 0 for node in range(0,nodecount) : while True : iscan = r.execute_command("iscan",str(node) , str(cursor) , "count" , "1000") for k in iscan[1] : check_big_key(r,k) cursos = iscan[0] print cursor,db,node, len(iscan[1]) if cursor == "0" : break; if __name__ "__main__" : if len(sys.argv) != 4 : print `Usage: python` , sys.argv[0] . "host port password" exit(1) db_host = sys.argv[1] db_port = sys.argv[2] db_password = sys.argv[3] r = redis.StrictRedi(host=db_host,port=int(db_port), password=db_password) nodecount = r.info()["nodecount"] keyspace_info = r.info("keyspace") for db in keyspace_info : print 'check', db , ' ' , keyspace_info[db] if nodecount > 1: find_log_key_sharding(db_host,db_port,db_password,db.replace("db",""), nodecount) else find_big_key_normal(db_host,db_port,db_password,db.replace("db","")) 可以通过python find_bigkey host 6379 password来执行,默认大key的阈值为10240(10kB) ,也就是对于string类型的value大于10240的认为是大Key,对于List的话如果list长度大于10240认为是大Key,对于hash的话,如果field的数目大于10240认为是大Key。另外默认该脚本每次搜索1000个key,对业务的影响比较低,不过最好在业务的低峰期进行操作,避免scan命令对业务的影响。删除Big KeyRedis4.0 新特性 - Lazy Free当删除键的时候,redis提供异步延迟释放key内存的功能,把key释放操作放在bio(Background I/O) 单独的子线程处理中,减少删除big key对redis主线程的阻塞。有效地避免删除big key带来的性能问题和可用性问题。因此删除big key时使用unlink 指令操作。使用del 指令去删除Big key会影响到主线程的操作,甚至带来阻塞线程(因为本来redis就是单线程的模型)。#慢 del user:1000 #快 (异步开启一个线程去执行) unlink user:1000Redis4.0之前对于string,还是用del指令删除 (一般来说,对于string类型使用del指令不会产生阻塞,影响不大 )对于hash、list、set、zset 等操作,使用hscan、ltrim、sscan、zscan 指令完成。禁止使用耗时操作指令禁止使用keys 命令,因为这个命令会遍历所以Key ,比较耗时。(使用scan 命令进行分批的,游标式的遍历) ;删除(del)一个大数据的时候,可以会需要很长时间,所以建议用异步的方式unlink ,它会启动一个新的线程来删除目标数据,而不是阻塞Redis的主线程。#慢 key * #快 scan 0 match * count 10000 scan 0 match user_* count 10000使用slowlog优化耗时指令 我们可以使用slowlog 功能找出最耗时的Redis命令进行相关优化,以提升Redis的运行速度,慢查询有两个重要的配置项:slowlog-log-slower-than 1000 : 用于设置慢查询的评定时间,也就是说超过此配置项的命令,就会被当做慢操作记录在慢查询日志中,它执行单位是微秒(1秒等于1000000微秒)。slowlog-max-len : 用来配置慢查询日志的最大记录数使用slowlog get n 来获取相关的慢查询日志,再找这些慢查询对应的业务进行相关的优化。系统存在的问题
2022年06月18日
369 阅读
0 评论
0 点赞