百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

如何解决Redis热点问题?以及如何发现热点?

mhr18 2024-11-01 12:16 23 浏览 0 评论

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


目录

  1. 前言
  2. 缓存化
  3. 分布式锁
  4. 永不过期
  5. 遗留问题
  6. 读写分离
  7. 本地缓存
  8. 热点发现
  9. 总结

前言

“这个商品不错,大家来看啊“,每个平台都有会有些大卖的商品,简称为爆品。这些商品会有个特点,就是访问量特别大。我们专业上面可以称之为热点数据,在处理这些热点商品时,系统需要做一些特殊的处理

缓存化

针对热点商品这些类型的数据,要考虑到访问量比较大,大家首先想到的是缓存,上redis缓存,这点肯定没有错。系统框架如下:

上图中,先从缓存中获取,没有再到DB获取,并保存到缓存中。但有个问题会产生,热点数据的访问会比较大,如果缓存一旦失效,所有请求同一时刻,会打到DB上面,DB肯定会崩溃。那怎么办呢?

分布式锁

缓存一旦失效,如何重新构建缓存?首先需要避免失效那一刻大量请求同时去重新构建缓存。因为重新构建缓存,需要到数据库DB中获取数据,那一个时刻的所有请求到DB上面。

方案有两种,第一个方案是把请求进入队列中(这个老顾以后会介绍,关于库存一致性的问题中,有涉及到这个知识点)。

还有一个方案就比较简单,利用分布式锁,只允许一个请求线程去访问DB,其他请求阻塞,这样就避免了很多请求打到DB上。

具体怎么实现可以看老顾之前的文章【如何利用锁,防止缓存击穿?重构思想的重要性

永不过期

这个方案就是利用redis本身的特性,导致的问题是因为缓存失效了,那我们可以让缓存永不过期就行了。这个方案中需要考虑两个情况:

1、热点商品上线前需要预热,也就是在商品正式发布到前端时,需要提前把商品信息进行缓存,避免跟缓存失效的情况一样。

2、更新商品信息机制,如何在商品信息更新后,及时更新缓存中的商品信息。这个也比较简单在更新商品事件中,增加个更新消息,由缓存服务进行消费,更新缓存信息。

遗留问题

上面两个方案是网上经常提到的方案,其实这两个方案会存在一个问题,也就是redis达到了负载极限怎么办?也就是热点商品的访问量,我们的单台redis扛不住了

小伙伴们会有疑问,redis可以上集群啊,不就解决了吗?

我们先了解一下,redis cluster集群部署方案:

上图是redis经典的三主三从集群方案,客户端进行set和get时,都是走的主redis,从redis只是个备份,主要作用是用来做高可用的,如:主redis挂了,从redis顶上

备注:老顾这里介绍的是redis集群部署方案,如果是之前的redis主从方案,另外讨论

从redis是不负责set和get请求的,即使请求打到从redis节点,从redis也会转发给主redis。而其他的主redis,是用来做数据扩容的。

即就是商品A的信息,只会存在一个主redis中,其他主redis是没有此商品A的信息的,这就是redis集群哈希槽的特点。

也就是小伙伴刚才想到的做redis集群这个方案是不行的,因为热点数据只会在一个主redis中。会存在单台redis负载不足(达到网卡、网络上限。达到这个瓶颈流量代表非常大了)。那怎么办呢?

读写分离

上面我们提到从redis只不负责读和写请求的,但redis官方提供了一个方法,在操作读请求时,可以先加上readonly命令,这样从redis就可以提供读请求服务了,不需要转发到主redis。

根据这个特性,我们可以对客户端工具进行改造,读请求方法时,加上readonly这个命令,从而实现读写分离,提高了从redis的利用率。

即达到了多台从redis去扛大量请求了,减少了主redis压力。这个方案需要对客户端进行改造,而且redis官方推荐没有必要使用读写分离。

本地缓存

这个方案就是多级缓存的方案,把缓存前置,架构图如下:

改造web应用服务,在获取到redis缓存后,在web服务本地把热点的数据进行缓存,因为热点的商品不会很多,所以保存在本地缓存中,是没有问题的。这样请求数据时,如果web本地有缓存数据,就直接返回了。

这样前端3个web应用就分担了redis缓存的压力,如访问过大就可以增加web应用服务,本来web应用服务就需要集群化

热点发现

本地缓存的方案中,有一个问题需要解决,那就是怎么知道哪些数据是热点数据?因为本地缓存资源有限,不可能把所有的商品数据进行缓存,它只会缓存热点的数据。那怎么知道数据是热点数据呢?

人为预测

就是人工标记,预测这个商品会成为热点,打个标记。web应用根据这个标记把此商品保存到本地缓存中

这个方案,是根据运营人员的经验进行预测,太不靠谱了。

系统推算

这个方案是根据实实在在的数据访问量进行推算形成,网上也介绍了用访问日志的什么算法,推算哪些是热点数据。

老顾这里分享一个比较简单的方式,就是利用redis4.x自身特性,LFU机制发现热点数据。实现很简单,只要把redis内存淘汰机制设置为allkeys-lfu或者volatile-lfu方式,再执行

./redis-cli --hotkeys

会返回访问频率高的key,并从高到底的排序

那就是我们的热点数据的key了。

备注:在设置key时,需要把商品id带上,这样就是知道是哪些商品了

总结

到此为止,老顾就把热点数据的问题、解决方案以及热点发现介绍完了,希望能够帮助小伙伴。当然整个解决方案的搭建,还需要小伙伴结合自身业务去实现。

如果小伙伴们部署到阿里云上面,阿里云上面也有类似方案

谢谢大家阅读!!!


-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

推荐阅读

1、如何设计API接口,实现统一格式返回?

2、你真的知道在生产环境下如何部署tomcat吗?

3、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

4、分享大厂分布式唯一ID设计方案,快来围观

5、你想了解一线大厂的分布式唯一ID生成方案吗?

6、你知道如何处理大数据量吗?(数据拆分篇)

7、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

8、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

9、你了解大型网站的页面静态化吗?

10、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

11、你知道怎么解决DB读写分离,导致数据不一致问题吗?

12、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

13、你真的知道怎么使用缓存吗?

14、如何利用锁,防止缓存击穿?重构思想的重要性

15、海量订单产生的业务高峰期,如何避免消息的重复消费?

16、你知道如何保障生产端100%消息投递成功吗?

相关推荐

Java培训机构,你选对了吗?(java培训机构官网)

如今IT行业发展迅速,不仅是大学生,甚至有些在职的员工都想学习java开发,需求量的扩大,薪资必定增长,这也是更多人选择java开发的主要原因。不过对于没有基础的学员来说,java技术不是一两天就能...

产品经理MacBook软件清单-20个实用软件

三年前开始使用MacBookPro,从此再也不想用Windows电脑了,作为生产工具,MacBook可以说是非常胜任。作为产品经理,值得拥有一台MacBook。MacBook是工作平台,要发挥更大作...

RAD Studio(Delphi) 本月隆重推出新的版本12.3

#在头条记录我的2025#自2024年9月,推出Delphi12.2版本后,本月隆重推出新的版本12.3,RADStudio12.3,包含了Delphi12.3和C++builder12.3最...

图解Java垃圾回收机制,写得非常好

什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用...

Centos7 初始化硬盘分区、挂载(针对2T以上)添加磁盘到卷

1、通过命令fdisk-l查看硬盘信息:#fdisk-l,发现硬盘为/dev/sdb大小4T。2、如果此硬盘以前有过分区,则先对磁盘格式化。命令:mkfs.文件系统格式-f/dev/sdb...

半虚拟化如何提高服务器性能(虚拟化 半虚拟化)

半虚拟化是一种重新编译客户机操作系统(OS)将其安装在虚拟机(VM)上的一种虚拟化类型,并在主机操作系统(OS)运行的管理程序上运行。与传统的完全虚拟化相比,半虚拟化可以减少开销,并提高系统性能。虚...

HashMap底层实现原理以及线程安全实现

HashMap底层实现原理数据结构:HashMap的底层实现原理主要依赖于数组+链表+红黑树的结构。1、数组:HashMap最底层是一个数组,称为table,它存放着键值对。2、链...

long和double类型操作的非原子性探究

前言“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。其实这里的某些jvm是指...

数据库DELETE 语句,还保存原有的磁盘空间

MySQL和Oracle的DELETE语句与数据存储MySQL的DELETE操作当你在MySQL中执行DELETE语句时:逻辑删除:数据从表中标记为删除,不再可见于查询结果物理...

线程池—ThreadPoolExecutor详解(线程池实战)

一、ThreadPoolExecutor简介在juc-executors框架概述的章节中,我们已经简要介绍过ThreadPoolExecutor了,通过Executors工厂,用户可以创建自己需要的执...

navicat如何使用orcale(详细步骤)

前言:看过我昨天文章的同鞋都知道最近接手另一个国企项目,数据库用的是orcale。实话实说,也有快三年没用过orcale数据库了。这期间问题不断,因为orcale日渐消沉,网上资料也是真真假假,难辨虚...

你的程序是不是慢吞吞?GraalVM来帮你飞起来性能提升秘籍大公开

各位IT圈内外的朋友们,大家好!我是你们的老朋友,头条上的IT技术博主。不知道你们有没有这样的经历:打开一个软件,半天没反应;点开一个网站,图片刷不出来;或者玩个游戏,卡顿得想砸电脑?是不是特别上火?...

大数据正当时,理解这几个术语很重要

目前,大数据的流行程度远超于我们的想象,无论是在云计算、物联网还是在人工智能领域都离不开大数据的支撑。那么大数据领域里有哪些基本概念或技术术语呢?今天我们就来聊聊那些避不开的大数据技术术语,梳理并...

秒懂列式数据库和行式数据库(列式数据库的特点)

行式数据库(Row-Based)数据按行存储,常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常见的列数据库有Hb...

AMD发布ROCm 6.4更新:带来了多项底层改进,但仍不支持RDNA 4

AMD宣布,对ROCm软件栈进行了更新,推出了新的迭代版本ROCm6.4。这一新版本里,AMD带来了多项底层改进,包括更新改进了ROCm的用户空间库和AMDKFD内核驱动程序之间的兼容性,使其更容易...

取消回复欢迎 发表评论: