关于Redis热点key的一些思考

太阳城游戏官方网址

昨天,当与一位已经辞职的同事聊天时,我问他在采访中遇到的一些问题。我也想积累这些知识。其中,他说面试官在采访一家公司时向他询问了热键的解决方案。因此,我将总结这次谈话后的想法和互联网上的一些信息。方便后续随访。

事实上,对于热键,很多在线查询,这里我引用互联网上的一段。

从基于用户的数据远远大于生成的数据的角度来看,大多数通常使用该软件的人,通常只是浏览,不会提问,发表文章,偶尔也会发布自己。文章或观点,这是一个典型的阅读和写作较少的案例,当然,这样的场景不容易导致热点。

日常工作生活中的一些突发事件,如:“双11”期间某些热门商品的降价推广,当这些商品中的一个是数万次点击,购买时,会形成更大的需求,在这种情况下,将生成单个密钥,这将导致热点;同样,当发布大量热点新闻,热点评论等时,热点也会产生热点;另外,在服务器端读取。访问数据时,数据通常会分段。在此过程中,在主机服务器上访问相应的密钥。当访问超出主机服务器的限制时,将生成热键密钥问题。

热点Key解决方案的解决方案只不过是两种解决方案

服务器端缓存:将热点数据缓存到服务器的内存中

备份热点密钥:热键密钥+随机数随机分配给其他Redis节点。这样,当访问热点密钥时,它不会全部命中机器。

事实上,这两个解决方案的前提是知道热键是什么,然后如何找到热键?

根据经验,进行估算:例如,如果您事先知道活动的开放,那么将此密钥用作热点密钥

客户端集合:运行Redis之前的数据统计

捕获数据包进行评估:Redis使用TCP协议与客户端通信,通信协议使用RESP,因此可以拦截数据包进行分析。

在代理层收集并报告每个redis请求

Redis附带命令查询:Redis 4.0.4版本提供了查找热点密钥的能力

如果要使用Redis自己的命令查询,则应首先将内存驱逐策略设置为allkeys-lfu或volatile-lfu,否则将返回错误。只需在Redis中使用它。

假设我们已经计算了一些热键并在服务器端缓存了这些数据,因此仍然存在问题。这是如何确保Redis和服务器热点密钥之间的数据一致性。我在这里想到的解决方案是使用Redis自己的消息通知机制来为热键Key客户端建立一个监听器。当热键密钥具有更新操作时,客户端也会更新。

主要代码如下,监听器类负责接收Redis事件,然后过滤掉热键以执行相应的操作

创建用于存储热点Key的数据结构,并设置相应的操作方法。这里设置假数据,并在静态代码块中直接设置两个热点密钥。

其实用的Redis事件通知机制并不好,因为只要打开事件通知,每个Key更改都会发送一条消息,这也会增加Redis服务器的负担而没有任何理由。当然,我只是一个简单的演示,除了这个通知方案还有很多方法。

这个程序实际上非常简单,只是不要让密钥转到一台机器上,但我们知道Redis集群包含一个哈希槽。群集使用公式计算密钥所属的槽。然后由相同Key计算的值应该相同。如何将密钥分配给其他机器?只需在末尾添加一个随机数,以便相同的密钥可以分布在不同的计算机上,并在访问期间通过密钥+随机数访问。

伪代码如下