redis缓存如何应对高并发请求和攻击_hzjmllp686的博客-程序员信息网_redis缓存请求

技术标签: codis分布式缓存  缓存  redis  

缓存使用背景

       一说缓存使用,相信大多数缓存使用者脑海中第一印象是redis,redis缓存高性能,提供丰富的数据类型,String,list,set,zset,hash。除了上述优势之外还提供多种集群方式,这是Memcached所不具备。redis提供基于Sentinel 机制主从节点集群方案,还提供客户端集群方式RedisSharding服务端实现集群Cluster、codis。
       Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作,  可以简单的认为后边连接的是一个内存无限大的 Redis 服务。本公司基于原子性数据迁移,在不停机情况实现热扩容和非常友好的后台集群管理的界面(提供热扩容、槽分配,数据迁移等操作),选择了codis 。

  

       言归正传目光焦点还是转移到高并发场景下,缓存如何使用。首先分析一下高并发场景,高并发意味找有大量请求进来,进行数据读写。如果大量请求瞬间直接打到DB层,那估计DB凶多吉少了。数据库一宕机,应用服务直接就跪了。有人说数据库得分库分表吧,没有错,有读写压力就得考虑数据库集群。基于成本考虑,数据库节点不能无限制增加。况且高并发场景下,追求是更快响应速度和更高吞吐量。从数据库读取还是不够快。这时你考虑使用缓存了。

  大多数使用场景是这样,把一些经常查询,但不怎么变的数据写入缓存,大概应用使用如下图:

  

   业务系统有请求进来,先查缓存,查不到查DB层,查到后回写缓存,再返回数据。这里称之为“赖加载”模式。这样使用缓存策略一般也不会遇到问题,但当你业务平台越来越大,用户数量越来越大的时候。平台要开始考虑高并发场景下是否系统是否支撑的下去。尤其是考虑瞬间大量请求时,系统如何设计。本文就从缓存这一个层面来分析和设计缓存如何在高并发使用问题。

高并发场景一:

            在可预见情况下,新上来应用系统,比如某个产品搞个秒杀活动,瞬间有大量请求来。如果还是采用传统缓存方式- 赖加载。大想可以想象一下,瞬间大量请求到DB层,缓存第一时间没有发生任何作用,应用系统直接就宕机了。甚至影响其他关联服务,进行可以应用系统雪崩。

方案: 数据预热

 可以先把商品基本信息和库存量等数据通过后台定时批量写入缓存当中,这样就避免大量的这样基础数据信息查询,替数据库挡一挡流量,减轻数据库读写压力,间接保护了数据库。ps:批量导入数据写入缓存,建议可以使用redis的Pipeline。Pipeline提供给类似数据库批处理能力。Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,是由客户端提供的,跟服务器没有什么直接的关系。

高并发场景二 : 

           比如说商品类的缓存数据过期时间设置过于集中,大量缓存集中失效,这样场景称为缓存雪崩。在缓存大量失效且高并发场景下,大量请求击穿缓存,直击DB。如下图所示:

方案:将过期时间散列表开。具体怎么做尼,设置一个过期时间基数+rand.nextInt(n) .这样就避免缓存过期时间集中大量的失效。避免出现缓存雪崩问题。

高并发场景三:

           接下来仔细分析一下,应用平台可避免大量缓存失效,但某个key到了过期时间最终还是要失效。在高并发场景下,大量请求还是直击DB。如下图所示:

方案:分布式锁

            此方案只允许在某个时间只有一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可,整个过程如图 : 

   

  当发现某一个热点数据失效后,基于应用系统集群部署,上分布式锁,使用redis 分布式锁命令-setnex.大量请求涌进应用系统时, 只允许某一个请求加锁成功。上锁成功后,允许该请求向数据库发起操作,其余所有的查询请求均被阻塞,从而保护了数据库。

高并发场景四:

            接上面继续分析,如果某个key数据实在太热,查询请求海量,就比如微博热搜。单个redis节点都可以撑不住怎么破。

方案:数据散列开

        将一份热点数据的key,做成N份,打个比方,将原本key分成key1,key2,key3,分别写入Redis-1,Redis-2,Redis-3,这样数据均匀打散到这三个redis节点上,分担了读压力,缓存就不至于压垮。

高并发场景五: 

           业务应用系统受到黑客大量攻击,查询那些既不在缓存也不在数据库里数据,缓存失去保护DB作用,这种场景业界称之为缓存穿透。发生缓存穿透,高并发场景下,如果是黑客恶意攻击也是致命的。那么在缓存这层怎么作保护方案尼

缓存穿透示意图

方案

1)缓存空数据

将数据库查询结果为空的key也存储在缓存中。当后续又出现该key的查询请求时,缓存直接返回null,而无需查询数据库.

缓存空对象会有两个问题: 
第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。 
第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5 分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
 

2) BloomFilter

    众所周知使用布隆过滤器,一个比特位就可以标识一个数据,可以节省大量空间,具体算法原理就不在这里累述了。BloomFilter推荐使用Redis 中的布隆过滤器,不过Redis 官方提供的布隆过滤器到了 Redis 4.0 提供了插件功能之后才正式登场,布隆过滤器作为一个插件加载到 Redis Server 中。

 查询请求进入应用系统,首先去BloomFilter中查询该key是否存在。若不存在,则说明数据库中也不存在该数据,因此缓存都不要查了,直接返回null。若存在,则继续执行后续的流程,先前往缓存中查询,缓存中没有的话再前往数据库中的查询。

缓存空数据 VS BloomFilter

        对于一些恶意攻击,查询的key往往各不相同,而且数据贼多。此时,第一种方案就显得提襟见肘了。因为它需要存储所有空数据的key,而这些恶意攻击的key往往各不相同,而且同一个key往往只请求一次。因此即使缓存了这些空数据的key,由于不再使用第二次,因此也起不了保护数据库的作用。
因此,对于空数据的key各不相同、key重复请求概率低的场景而言,应该选择第二种方案。而对于空数据的key数量有限、key重复请求概率较高的场景而言,应该选择第一种方案。
 

参考引用

http://redisdoc.com

https://blog.csdn.net/haoxin963/article/details/83245113

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hzjmllp686/article/details/85956433

智能推荐

使用Floyd-Warshall算法求出两点之间的最短路径_wb175208的博客-程序员信息网

求出下面任意两个点之间的最短路径:如何才能求出两点之间的最短路径呢?大家都知道学几何的时候,有一条定理就是:两点之间线段最短。但是在实际情况中,我往往两点之间没有之间的通路而是一些曲折的线路。上面已经给出了两点之间的线路路径,不能再通过两点时间的路径来计算他们最短路径了,根据以往的经验要想让两点之间的路程变短,只能引入第三个点,通过第三个点的中转才能缩短两点之间的路径。通过上图可知由4-&...

sqlyog初次如何新建连接_MisslittleT的博客-程序员信息网_sqlyog建立新连接

相信很多初次接触MySQL的同学看到下图都是一脸懵逼,不知道该如何填写。这里答主在经历了多次被坑经历后浅谈一下正确的填写方式。初次打开sqlyog:“我的SQL主机地址”默认为localhost ,”用户名“默认为root //这里就不要动了,保持默认状态就好如果当初是用msl直接下载的MySQL”密码“就应该填写当初安装MySQL(如下图)时自己设置的密码(答主在这里被坑了好久)最上端的”保/存...

[转载]字符编码(理论篇)_weixin_30635053的博客-程序员信息网

0. 从ASCII码说起 学过电脑的人都听说过ASCII码,这是一种根据英文字符表设计的字符编码。严格意义上来讲,标准ASCII码只有7位(最高位为0),共128个字符,用十进制表示是:0-127。其中0-31和127为控制字符,而32-126为显示字符。国际标准化组织还发布了一些8位ASCII码扩展字符集,其中最流行的就是ISO 8859-1 (ISO Latin1)。它除了兼容标准的7位AS...

字符串:Boyer-Moore字符串查找算法_Donald-Hu的博客-程序员信息网

1. 简单介绍在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore设计于1977年。 一般情况下,比KMP算法快3-5倍。该算法常用于文本编辑器中的搜索匹配功能,比如大家所熟知的GNU grep命令使用的就是该算法,这也是GNU grep比BSD grep快的一个重要原因,具体推荐看

Ghost版本win10 操作中心无法打开(灰色状态)的解决方法!_AAA_CHAO的博客-程序员信息网

Ghost版本win10 操作中心无法打开(灰色状态)的解决方法!首先说明家里的电脑比较老旧是好几年前的机器,所以预装的不是正版的windows,本人很不喜欢win7的徽标,所以给电脑安装了系统之家的win10(ghost版本的),但是装好之后发现我的操作中心打不开,这不是难为死我这个强迫症?下面有了第三种解决方法【我前面说的都是废话 不要理! 就像写作文一样首先要有一个起因才能有经过才能有结果...

出现D:\Program Files\Anaconda3\Scripts\pip-script.py‘is not present 错误解决办法_呆呆槑_的博客-程序员信息网

今天在安装对pip的版本进行升级时报错,结果出现下述所示的错误信息:D:\Program Files\Anaconda3\Scripts\pip-script.py’is not present.原因是我在安装pycocotools的时候,系统显示Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.然后网上说要更新pip的版本或者是setuptoo

随便推点

Java - java虚拟机概述、jre, jdk, jvm的区别_guaw007的博客-程序员信息网

Java虚拟机概述 Java推出时,提出了 "Write Once,Run Anywhere" 的口号,能达到跨平台运行代码这件事,就必须归功于java虚拟机 (Java Virtual Machine)的功劳了 传统C/C++是直接把程序员写的.c/.cpp代码,编译成那个平台(ex: Windows)能看懂的machine code,所以当编译一次之后,生成出来的这...

对JsonArray根据JsonObject中的某一字段排序_程序员阿文的博客-程序员信息网_jsonarray根据字段排序

方式一:Collections.sort(list, new Comparator() {})List<JSONObject> list = JSONArray.parseArray(resultArrays.toJSONString(), JSONObject.class);Collections.sort(list, new Comparator<JSONObject>() { //排序字段 private final String FIELD_NAME =

DirectX10安装路径自动生成DXSDK_DIR_weixin_30709929的博客-程序员信息网

DXSDK_DIRC:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\转载于:https://www.cnblogs.com/wainiwann/p/9482970.html

ubuntu18.04无软件源导致安装失败_晓文……的博客-程序员信息网

仓库 “http://ppa.launchpad.net/xxx/xx/ubuntubionic Release” 没有 Release 文件 修改/etc/apt/sources.list.d/xxx-bionic.list文件,将bionic(18.04版本代号)改成xenial(16.04版本代号) sudo apt-get update && apt-ge...

matlab 沙丁,基于三维空间关于海豚围捕沙丁鱼群的运动规律_187107的博客-程序员信息网

1. 引言1.1. 问题的产生沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置,难以分辨每个个体。鱼群的行动是有协调性的,在没有外部威胁或障碍物时,鱼群常常会聚成接近球形的形态。而当海豚接触甚至冲进鱼群,鱼群则会进行协同的躲避,所以不易在大鱼群中追踪一个目标。沙丁鱼的这种群体行为降低了其被海豚捕食的概率。问题一:建立合理的数学...

位域外部申明_(外部)域特定语言的完整指南_danpu0978的博客-程序员信息网

位域外部申明 本指南将向您显示: 什么 :定义后,我们将研究19个DSL实例 原因 :使用DSL可以带来哪些具体好处? 方法 :我们将讨论构建DSL的不同方法以及成功的因素是什么 之后,您将获得一系列资源以学习更多内容:书籍,网站,论文,屏幕录像。 这是有关领域特定语言的最完整资源。 我希望你会喜欢它! 只是一件事:在这里,我们尝试变得实用且易于理解。 如果您正在寻找...

推荐文章

热门文章

相关标签