前言

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

缓存化

针对热点商品这些类型的数据,要考虑到访问量比较大,大家首先想到的是缓存,上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带上,这样就是知道是哪些商品了

总结

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

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

谢谢大家阅读!!!

扩展:如何处理redis集群中的hot Key

你所不知道的Redis热点问题以及如何发现热点相关推荐

  1. 那些你所不知道的arXiv使用技巧

    作者:Tom Hardy Date:2020-12-23 来源:那些你所不知道的arXiv使用技巧

  2. 系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT

    https://my.oschina.net/fdhay/blog/638631 高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT 2016-02-18 大房 大房说 本文是我将最 ...

  3. ai的弹窗点了都不响应_【评价集合】拼多多评价,你所不知道的点都在这里!...

    对于在拼多多开店的商家们来说,评价是消费者对于商品的好坏程度的一个评分,评价的高低不仅仅会影响到商品的销量,更会影响转化率以及权重!所以为了店铺商品的长远发展打算!各位商家在求取出评.好评的道路上不断 ...

  4. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路

    原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...

  5. 你所不知道的日志异步落库

    https://www.cnblogs.com/scy251147/p/9193075.html 在互联网设计架构过程中,日志异步落库,俨然已经是高并发环节中不可缺少的一环.为什么说是高并发环节中不可 ...

  6. 被低估的css滤镜,你所不知道的 CSS 滤镜技巧与细节

    本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏. OK,下面直接进入正文.本文所描述的滤镜,指 ...

  7. 国际计算机思维比赛,少儿编程领域中,你所不知道的国际计算思维大赛

    原标题:少儿编程领域中,你所不知道的国际计算思维大赛 孩子学习编程,除了培养编程思维和计算思维,也能为未来应对人工智能时代打下基础.今天给大家讲的的是Bebras国际计算思维大赛,请大家持续关注坚果学 ...

  8. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  9. 计算机键盘标注,你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...

    原标题:你所不知道的 Windows 10 小诀窍:万能计算器.虚拟键盘.屏幕截图标注 Windows 10 里面有许多好用的小功能,只是藏得很深,平常你不一定会发现它,又或者可能是并没有特别标注出来 ...

  10. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转http://www.cnblogs.com/zhijianliutang/p/4100103.html 前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的 ...

最新文章

  1. range python命令_Python学习笔记(一)
  2. 下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s=a+b+c+d;
  3. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...
  4. 联调测试是什么意思_功能模块提测前注意这几件事,再也不怕被测试diss了
  5. JAVA面向对象——继承
  6. Python如何解决中文乱码
  7. Android 应用是如何启动 binder 机制的?
  8. 百度地图标记点加点击事件和鼠标移入事件并添加数据
  9. KK集团冲刺上市背后:亏损规模连年飙升,KK馆贡献占比正在衰减
  10. nRF52832 GATT 自定义Service/Characteristic
  11. 浅谈Flink对象重用(object reuse)
  12. 炎热夏季 本本散热板必不可少【lpxt】
  13. 聪明人的游戏提高篇:贝贝的数学课 (change)
  14. push()、pop()、shift()、unshift()方法简单整理
  15. 【行为分析】(二)前端埋点实现及原理分析
  16. 一文看完2018苹果秋季新品发布会,你想知道的问题这里都有答案!
  17. 深入浅出理解reedsolomon库数据冗余算法原理和具体实现源码分析
  18. 统计碱基序列中ATCG出现的个数
  19. 绝情且残酷!1780元暴力解聘患癌10年老员工,完美世界心真“硬”
  20. weChat applet 微信小程序(2) WXSS 小程序组件

热门文章

  1. 重庆邮电大学c语言实验报告,重庆邮电大学c语言上机实验期末实验报告.doc
  2. dat关闭某进程_电脑程序卡住怎么办?结束进程只需要这三个键
  3. pymysql executemany()函数
  4. python3.8下载request_python3 requests 安装包下载安装[windows]
  5. 2021_0207_生活记录
  6. python机器学习应用mooc_(3)决策树
  7. 【Gym-102606 H】Heat Pipes【奇环染色、bfs 生成树】
  8. 【Codeforces Round #555 (Div. 3) G】Inverse of Rows and Columns【bitset优化暴力...】
  9. 从弧长的计算到逆时针与顺时针旋转的定义 (二维空间)
  10. 一台电脑安装多个Chrome