前几天元宵节,小黑准时下班回到家,吃着汤圆,看着电视,好生惬意!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网络空间、营销软件、网站建设、崆峒网站维护、网站推广。
忽然,手机叮咣叮咣响个不停报警,看了下是某个服务调用Redis异常了。
放下饭碗,小黑打开电脑一顿排查,最终定位到是Redis有大key问题。
寻思一时半会儿也解决不了,明天到公司再搞,先继续看电视吧 哈哈哈。
很多朋友肯定在想redis的key能有多大呀?
这里就有个误区了,所谓的大key问题是某个key的value比较大,所以本质上是大value问题。
这样就对上了,key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。
设想一种场景:
在线音乐app中,某个歌单有很多用户收藏,假如有这样的数据结构:
这下明白啥是大key问题了吧!
redis中有常见的几种数据结构,每种结构对大key的定义不同,比如:
上述的定义并不绝对,主要是根据value的成员数量和字节数来确定,业务可以根据自己的场景也确定标准。
我们都知道,redis的一个典型特征就是:核心工作线程是单线程。
单线程中请求任务的处理是串行的,前面完不成,后面处理不了,同时也导致分布式架构中内存数据和CPU的不平衡。
这样看来大key的影响还是很明显的,最典型的就是阻塞线程,并发量下降,导致客户端超时,服务端业务成功率下降。
大key的产生往往是业务方设计不合理,没有预见vaule的动态增长问题:
由于大key的value很大,执行读取时可能阻塞线程,这样Redis整体的qps会下降,并且客户端超时会增加,网络带宽会上涨,配置这些报警可以让我们发现大key的存在。
使用bigkeys命令以遍历的方式分析Redis实例中的所有Key,并返回整体统计信息与每个数据类型中Top1的大Key
使用redis-rdb-tools离线分析工具来扫描RDB持久化文件,虽然实时性略差,但是完全离线对性能无影响。
redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生成json文件或者生成报表用来分析Redis的使用详情。
基于某些公有云或者公司内部架构的redis一般都会有可视化的页面和分析工具,来帮助我们定位大key,当然页面底层也可能是基于bigkeys或者rdb文件离线分析的结果。
根据大key的实际用途可以分为两种情况:可删除和不可删除。
如果发现某些大key并非热key就可以在DB中查询使用,则可以在Redis中删掉:
Redis UNLINK 命令类似与 DEL 命令,表示删除指定的 key,如果指定 key 不存在,命令则忽略。
UNLINK 命令不同与 DEL 命令在于它是异步执行的,因此它不会阻塞。
UNLINK 命令是非阻塞删除,非阻塞删除简言之,就是将删除操作放到另外一个线程去处理。
Redis Scan 命令用于迭代数据库中的数据库键。
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。
当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。
当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。
Redis的大key问题,无论在面试还是工作中都很常见,好好理解一波,非常值得。
祝各位老铁 深夜无报警,线上无bug!
当前名称:解决了Redis大key问题,同事们都夸他牛皮
分享链接:http://www.shufengxianlan.com/qtweb/news8/195808.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联