2016 - 2024

感恩一路有你

redis锁如何解决并发 redis如何解决hot key与big key问题?

浏览量:1114 时间:2023-05-29 17:49:53 作者:采采

redis如何解决hot key与big key问题?

解决方案

对bigkey接受word文档合并

对littlekey存储位置的数据(onevalue)通过拆分,都变成value1,value2…valueN,

假如littlevalue是个大json按照mset的,将这个key的内容绞成到各个实例中,减小bigkey对数据量向外倾斜负面影响。

//存

msetkey1,vlaue1,key2,,valueN

//取

mgetclientkey1,

假如littlevalue是个大list,也可以拆成将list拆成。list_1,list_2,list3,listN

其他数据类型同理。

既已onekey又是chillkey

在开发过程中,有些key不只是因为访问量大,数据量也太大,这会儿也要决定这个key在用的场景,读取在redis集群中是否需要是合理不的,是否需要可以使用其他组件来存储更合适;如果没有坚持要用redis来存储,很有可能确定迁入出集群,常规一主一备(或1主多备)的架构来存储。

其他

怎么突然发现sodakey,queenkey

1.万无一失-预判

在业务开发阶段,还要对肯定转成hotkey,queenkey的数据通过判断,提前如何处理,这是需要的是对产品业务的理解,对运营节奏的把握,对数据设计的经验。

2.事中-监控和自动出现处理

监控

在应用程序端,对你每次只是请求redis的操作接受积攒上报到不推荐推荐,只不过在运维资源不完全的场景下可以不决定。开发这个可以越过运维管理一切都搞定);

在proxy层,对每一个redis请求参与收集到上报到(推荐推荐,运维来做也是最好的方案);

对redis实例建议使用monitor命令统计热点key(不我推荐,高并发条件下会有会造成redis内存爆掉的隐患);

机器层面,Redis客户端在用TCP协议与服务端进行交互,通信协议采用的是RESP。如果不是站在机器的角度,可以不通过对机器上所有Redis端口的TCP数据包参与破霸体完成热点key的统计(不推荐,公司每台机器上的基本上组件早很多了,别再找事儿了);

自动启动全面处理

通过监控之后,程序是可以查看littlekey和hotkey,再不报警的同时,程序对bigkey和hotkey进行自动启动处理。也可以通知程序猿依靠一定的工具通过定制化处理(在程序中对某种特定的key执行前面提到的解决方案)

什么时候需要分布式锁?

分布式锁又是锁在单体应用形式的时候,要是多个线程要ftp访问共享资源的时候,我们大多线程间加锁的机制,在某一个时刻,只有一一个线程可以不对这个资源参与能操作,其他线程需要再等待锁的释放,Java中也有一些如何处理锁的机制,例如synchronized。

而到了分布式的环境中,当某个资源可以被多个系统访问网络不使用到的时候,目的是只要大家不能访问这个数据是一致性的,那就就没有要求再捆定时刻,只有被一个系统不使用,这时候线程之间的锁机制就难以作用有限作用了,是因为分布式环境中,系统是会作战部署到不同的机器上面的,那就就必须【分布式锁】了。

什么时候需要不使用分布式锁系统的总结来看,当有多个客户端必须访问并操作同一个资源,还不需要保持这个资源一致性的时候,就是需要使用【分布式锁】,让多客户端互斥的对共享资源进行访问。

举个例子来只能证明帮一下忙:

有多个批处理任务,两台机器而一次性处理,如果不是不加任何操纵的话,最大的可能同一个批处理被两台机器共有去处理一遍;如果没有使用分布式锁,在如何领取任务的时候,一个任务只会被一台机器领取,那样的话就肯定不会倒致任务的再重复一遍执行;

再勤思考一些,要是A/B两台机器,任务1被A机器领取到并且处理,在去处理到一半的时候,A机器全死了,这样这个批处理任务也就不能无惊无险负责执行了,即使A机器可以重新恢复。

这时候就可以不明白了分布式锁是需要做哪些工作了排他性:在同一时间只会有一个客户端能某些到锁,其它客户端无法同样资源;尽量避免死锁:锁在一段时间内管用,远远超过这个时间后会被释放(都正常释放者或无比能量);高可用:获取或施放锁的机制必须高可用且性能佳。我将减弱多多分享Java开发、架构设计、程序员职业发展等方面的见解,只希望能得到你的关注。

机器 key 数据 资源 客户端

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。