网站费用多少钱一年,php 免费网站空间申请,巩义旅游网站设计公司,金山开发Redis大key问题
什么是big key#xff1f; bigKey的危害#xff1a; 大key不仅仅是占用内存而已#xff0c;如果是仅仅内存的问题 那么扩大内存就好了。禁止大key是主要是因为你操作redis#xff0c;比如说读/写等操作redis的时候 会有io操作#xff0c;大key会导致io操作…Redis大key问题
什么是big key bigKey的危害 大key不仅仅是占用内存而已如果是仅仅内存的问题 那么扩大内存就好了。禁止大key是主要是因为你操作redis比如说读/写等操作redis的时候 会有io操作大key会导致io操作很慢还有说还会占用网络带宽等原因。 所以不是仅仅说因为占用内存的原因
发现big key?
redis-cli --bigkeys 可以命令统计bigkey的分布 怎么解决bigkey 详情看以下这个链接
https://www.cnblogs.com/xgqfrms/p/13601959.html
redis的大key拆分
1.拆分多个key 1.1.可以尝试将对象分拆成几个 key-value使用 multiGet 获取值这样分拆的意义在于分拆单次操作的压力将操作压力平摊到多个实例中降低对单个实例的IO影响。1.2.按filed拆分多个key对于每次需要取部分 value 的 大 key, 同样可以拆成几个 key-value也可以将这些存储在一个 hash 中每个 field 代表具体属性使用 hgethmget 来获取部分 value使用 hsethmset 来更新部分属性;1.3.对于 value 中存储过多元素的 key, 同样可以将这部分元素拆分;2.存到hash中 用hget 但删除会有性能问题
redis hash和桶的结构
用偏移量存桶里
hash算法 可以定位桶的位置 需要区分用户来源的场景 推送违约订单需要区分来源
例子
1.比如电柜电量大key 解决方法拆分成多个key。———以电柜编号最后一位分散到不同key。比如电柜编号为10位那么尾号为1的放入一个key中2放入另一个key中…….0放入另外的key中因此就分散到不同的key中以此来解决大key的问题。
删除大key
删除操作的本质是要释放键值对占用的内存空间不要小瞧内存的释放过程。释放内存只是第一步为了更加高效地管理内存空间在应用程序释放内存时操作系统需要把释放掉的内存块插入一个空闲内存块的链表以便后续进行管理和再分配。这个过程本身需要一定时间而且阻塞当前释放内存的应用程序。
所以如果一下子释放了大量内存空闲内存块链表操作时间就会增加相应地就会造成Redis主线程的阻塞如果主线程发生了阻塞其他所有请求可能都会超时超时越来越多会造成Redis连接耗尽产生各种异常。
因此删除大key这一动作要非常小心。
删除key的正确方式 分批次删除 1hash key:通过hscan命令每次获取500个字段再用hdel命令 2set key:使用sscan命令每次扫描集合中500个元素再用srem命令每次删除一个元素 3list key:删除大的List键未使用scan命令 通过ltrim命令每次删除少量元素。 4sorted set key:删除大的有序集合键和List类似使用sortedset自带的zremrangebyrank命令,每次删除top 100个元素。 异步删除: Redis 4.0版本以后可以使用 UNLINK 命令后台线程执行释放空间 不建议采用的方式: 1执行rename重命名—不推荐: newkey如果本就存在 redis会用key的值覆盖掉newkey的值而newkey原本的值会被redis隐式地删除del。我们知道大key的删除伴随着高延迟redis是单进程服务服务器会在删除大key期间block住接下来其他命令的执行这就导致时间复杂度本为 O(1) 的rename也有可能卡住redis。 另外需要注意的是 在集群模式下key 和newkey 需要在同一个 hash slot。key 和newkey有相同的 hash tag 才能重命名。 2过期key删除策略—不推荐 可能大家会有这样的想法既然在线删除大key会造成阻塞那么就对这个key设置一个TTL交给redis自己去删。 但是不管是定期删除、惰性删除、淘汰策略这三种方式哪个触发的删除它都是**同步的。所以就算加个TTLredis也是同步删除的大key还是会造成阻塞**。