redis作为缓存详解

目录

前言:

为什么说关系型数据库性能不高

如何提高MySQL并发量

缓存更新策略

定期更新

实时更新

内存淘汰策略

Redis内置的淘汰策略

缓存常见问题

缓存预热

缓存穿透

缓存雪崩

缓存击穿


前言:

    对于缓存的理解,缓存目的就是为了提供更快速的访问效率。一般会使用访问迅速的为访问较为缓慢的作为缓存。例如使用内存作为硬盘的缓存,硬盘作为网络的缓存。使用缓存可以减轻被缓存服务请求数量,一定程度上提供了系统高可用性能。

为什么说关系型数据库性能不高

1)数据库把数据存储在硬盘上,硬盘IO速度并不快,尤其是随机访问。

2)如果查询不能命中索引,就需要进行表遍历,这会大量增加硬盘IO次数。

3)关系型数据库会对SQL进行一系列的解析,优化,校验等工作。

4)一些复杂查询,联表查询,会进行笛卡尔积操作,效率会降低很多。

注意:

    因为mysql等数据库效率比较低,所承担的并发量就有限,一旦请求数量多了,数据库压力就会很大,就很容易宕机。

如何提高MySQL并发量

开源:

    引入更多机器,构成MySQL集群。

节流:

    引入缓存,把一些频繁读取的热点数据,保存在缓存上。后续查询数据的时候,如果缓存中存在,就不去MySQL中进行查询了。

注意:

    数据是存在二八原则的,20%的数据可以满足80%的请求,虽然redis是内存数据库,只能存储少量数据,但基于这个原则,可以大大减少MySQL数据库压力。

缓存更新策略

    如何知道redis中应该存储哪些数据,如何知道哪些数据是热点数据呢?

定期更新

    会把访问的数据以日志形式记录下来,然后就可以分析这些日志数据,得到一些频繁出现的词,那么这些词所对应的数据就算热点数据了,就可以存储在redis中。

    这里redis中的数据可以按照一天一更新,或者一周一更新,定期的进行热点数据统计,更新redis中的数据。

优点:

    上述过程实现起来比较简单,过程更加可控(缓存中有什么数据比较固定),方便排查问题。

缺点:

    实时性不够,如果出发一些特殊事件,有一些本来不是热词的数据成了热词,新热词查询就可能给后面数据库带来比较大的压力。

实时更新

1)先从redis中查询,如果查到数据直接返回。

2)如果redis中不存在,则去数据库查,然后把数据插入redis中。

3)这样不停的往redis中插入数据,就会使redis的内存占用越来越多,逐渐达到上限。此时如果继续往redis中插入数据,就会触发问题。为了解决此问题,redis引入了内存淘汰策略。

内存淘汰策略

1)FIFO(First In First Out)先进先出

    把缓存中存在时间最久的(也就是先来的数据)淘汰掉。

2)LRU (Least Recently Used)淘汰最久未使用的

    记录每个key的最近访问时间.把最近访问时间最老的key淘汰掉。

3)LFU(Least Frequently Used)淘汰访问次数最少的

    记录每个key最近⼀段时间的访问次数。把访问次数最少的淘汰掉.。

4)Random随机淘汰

    从所有的key中抽取幸运儿被随机淘汰掉。

注意:

1)经过一段时间的动态平衡,redis中的数据逐渐就成为了热点数据。

2)具体采用哪种内存淘汰策略,需要根据业务具体问题具体分析。

Redis内置的淘汰策略

    volatile-lru 当内存不足以容纳新写⼊数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰。

    allkeys-lru 当内存不足以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使用)算法进 进行淘汰。

    volatile-lfu 4.0版本新增,当内存不足以容纳新写⼊数据时,在过期的key中,使用LFU算法 进行删除key。

    allkeys-lfu 4.0版本新增,当内存不足以容纳新写⼊数据时,从所有key中使用LFU算法进行淘汰。

    volatile-random 当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据。

    allkeys-random 当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。

    volatile-ttl 在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰.。(相当于FIFO,只不过是局限于过期的key)

    noeviction 默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

注意:

    整体来说redis提供的策略和上述介绍的通用策略是基本⼀致的。只不过redis这里会针对 "过期key" 和 "全部key" 做分别处理。

缓存常见问题

缓存预热

1)定期更新缓存数据,不存在缓存预热情况,首次启动缓存,也会存在一些热点数据,不会给mysql服务造成太大压力。

2)实时更新缓存数据,缓存服务首次启动缓存中是没有数据的,这个时候mysql服务承载的压力就比较大。

解决方案:

    通过离线的方式,向缓存服务导入一些热点数据,首次启动mysql服务就不会有太大压力。随着时间推移,缓存中数据逐渐就都成为热点数据了。

缓存穿透

    查询某个key,redis中不存在,MySQL中也不存在,那么就不会在redis中进行存储。如果存在大量的这些查询,同样会给MySQL造成太大压力。

问题出现场景:

1)业务设计不合理,不如缺少必要的参数校验,导致非法key也被查询了。

2)开发/运维误操作,不小心把部分数据从MySQL中删除了。

3)黑客恶意攻击。

解决方案:

1)如果发现这个key,在redis和MySQL中都不存在,仍然写入redis中,value可设置一个非法值(比如“”),那么后续这些key的查询,在缓存中就可以查询到,就可以执行非法校验逻辑。

2)引入布隆过滤器,每次查询redis/MySQL时,都先判断一下key是否在布隆过滤器中存在。(把所有key都插入到布隆过滤器中),如果布隆过滤器不存在就不需要查询redis或MySQL,MySQL就不会有太大压力。

3)布隆过滤器:本质是结合了 hash + bitmap 不会存储真实数据,但可以判断是否存在。以比较小的空间开销,比较快的时间速度,实现争对key是否存在的判定。

缓存雪崩

    由于在短时间内,redis上大规模的key失效,导致缓存命中率陡然下降,导致MySQL服务压力迅速上升,甚至直接宕机。

问题出现场景:

1)redis直接挂了,redis宕机 / redis集群模式下大量节点宕机。

2)redis没问题,但可能之前短时间内设置很多key到redis中,并且设置的过期时间都是相同的。

解决方案:

1)加强监控报警,保证redis集群的可用性。

2)不给key设置过期时间。

3)key设置过期时间的时候,添加随机因子,避免同一时刻同时失效。

缓存击穿

    相当于缓存雪崩的特殊情况,针对热点key,突然过期了,导致大量请求直接访问数据库,甚至引起数据库直接宕机(热点key的访问频率高,请求数就多,影响更大)

解决方案:

1)基于统计的方式发现热点key,并且设置永不过期。

2)进行必要的服务降级,例如访问数据库的时候使用分布式锁,限制同时请求数据库的并发数。客户端响应时间会比较长,但不至于数据库服务直接挂了。

小结:

    redis作为缓存场景是非常常见的,需要因地制宜选择适合自己业务的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Https攻击怎么防御

随着互联网技术的发展,网站所遭受的网络攻击频率也在不断上升。某种程度上,我们可以说互联网上的每个网站都容易遭受安全攻击。因为网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风险就在那里…

PC分页操作

page-size 每页显示条目个数 current-page 当前页数 total 数据总数 current-change【currentPage 改变时会触发】 <el-paginationbackgroundlayout"prev, pager, next"align"right"style"padding: 10px":page-size"pageParams.pagesize…

连接k8s和凌鲨

通过连接k8s和凌鲨&#xff0c;可以让研发过程中的重用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 架构 所有操作通过k8s proxy连接&#xff0c;通过设置namespace label赋予访问权限。只有赋予特定label的namespace才能被访问。 使用步骤 部署k8s proxy 你…

【Java】基于SaaS模式的Java基层医院卫生健康云HIS系统源码

一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历及报表可直接在业务…

No mapping for GET /swagger-ui.html的解决方法

我的Swagger配置类 Configuration EnableSwagger2 public class SwaggerConfig {Autowiredprivate SwaggerInfo swaggerInfo;Beanpublic Docket createRestApi(){return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.b…

【qsort学习及改造冒泡排序能排序任何数】

qsort学习及改造冒泡排序能排序任何数 qsort的使用 qsort的使用 这个函数也不是很复杂&#xff01;&#xff01;&#xff01; qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))  void * base,为数组的基地…

【深度学习】python调用超分Real-ESRGAN

Real-ESRGAN是超分自然场景图和动漫图&#xff0c;视频也可以&#xff0c;项目地址&#xff1a;https://github.com/xinntao/Real-ESRGAN/tree/master 安装python包&#xff1a; basicsr>1.4.2 facexlib>0.2.5 gfpgan>1.3.5 numpy opencv-python Pillow torch>1.…

GD32替换STM32使用HAL库开发问题

GD32HAL库开发问题 1can初始化进入error handle2发送邮箱不能按照填写顺序发送3 GD32修改代码被stm32cudemx覆盖问题 1can初始化进入error handle HAL库的HAL_CAN_Init中&#xff0c;hcan->Instance->MSR寄存器无法清零&#xff0c;STM32先清零&#xff0c;再退出睡眠模…

编译 CUDA加速的 OpenCV-4.8.0 版本

文章目录 前言一、编译环境二、前期准备三、CMake编译四、VS编译OpenCV.sln五、问题 前言 由于项目需要用上CUDA加速的OpenCV&#xff0c;编译时也踩了不少坑&#xff0c;所以这里记录一下。 一、编译环境 我的编译环境是&#xff1a; Win10 RTX4050 CUDA-12.0 CUDNN 8.9.…

代码混淆不再愁:一篇掌握核心技巧

​ 1. 概述 代码混淆是将计算机程序的代码转换成一种功能上等价&#xff0c;但是难以阅读和理解的形式。 对于软件开发者来说&#xff0c;代码混淆可以在一定程度上保护程序免被逆向。 对于逆向工程师来说&#xff0c;学习代码混淆可以帮助我们研究反混淆技术。 2. 常见混淆…

半导体工艺控制设备1

半导体工艺控制设备对芯片良率至关重要&#xff0c;随着制程微缩需求倍增。工艺节点每缩减一代&#xff0c;工艺中产生的致命缺陷数量会增加 50%&#xff0c;因此每一道工序的良品率都要保持在非常高的水平才能保证最终的良品率。当工序超过 500 道时&#xff0c;只有保证每一道…

污水处理智能化:污水处理拓扑图的未来发展趋势

随着城市化进程的不断加速&#xff0c;城市污水处理已经成为了一个重要的问题。污水处理不仅关系到城市环境的质量&#xff0c;还直接影响着人们的生活质量和健康。污水处理拓扑图作为一种新型的污水处理技术&#xff0c;已经被广泛应用于各种污水处理设施中。本文将介绍污水处…

如何判断客户对你是不是真的满意

我们平时生活中打个滴滴、叫个外卖&#xff0c;都会让做星级评价&#xff0c;就算去银行办业务&#xff0c;也会让按个按钮&#xff0c;对窗口的服务做个评价…… 再问一个问题&#xff1a;客户满意了&#xff0c;您的生意就一定好吗&#xff1f; 一、满意度&#xff1a;质量监…

2023 IDEA大会开幕 共探AI新篇章下的技术创新与创业

11月22日&#xff0c;AI与数字经济领域一年一度的科创盛会&#xff0c;2023 IDEA大会在深圳举行。IDEA研究院创院理事长、美国国家工程院外籍院士沈向洋在会上发表主旨演讲&#xff0c;发布IDEA研究院的重磅研产结晶与市场化成果&#xff1b;在大咖云集的论坛环节&#xff0c;多…

AIOps探索 | 应急处置中排障的降本增效方法探索(上)

文章来源&#xff1a;公众号ID-布博士&#xff08;擎创科技资深产品专家&#xff09; 哈喽~友友们大家好&#xff0c;最近运维界也是蛮热闹的&#xff0c;前有语雀多次崩溃&#xff0c;后有阿里全系产品集体故障&#xff0c;不管是哪种&#xff0c;都足够逼疯一个运维工程师。…

【Python】scrapy 命令提示找不到文件

问题记录&#xff1a; 执行以下命令的时候返回了找不到文件 scrapy startproject myproject具体信息如下 bash: /usr/local/bin/scrapy: No such file or directory查看 /usr/local/bin/ 目录确实没有 scrapy。 注&#xff1a;/usr/local/bin/ 目录一般存放应用执行文件的软…

Web自动化测试流程:从入门到精通,帮你成为测试专家!

Web应用程序在今天的软件开发中占据着越来越重要的地位。保证Web应用程序的质量和稳定性是非常必要的&#xff0c;而自动化测试是一种有效的方法。本文将介绍Web自动化测试流程&#xff0c;并提供代码示例。 步骤一&#xff1a;选取测试工具 选择适合自己团队的自动化测试工具…

数环通对企业销售业务流程(O2C)的成熟度模型分享

保持紧密的客户关系&#xff0c;给客户留下良好的第一印象至关重要&#xff0c;而从下单到顺利履约是实现这一目标的最重要一环。 客户在做出购买决策后往往在最开始是充满了正向情绪&#xff08;例如兴奋、期待&#xff09;&#xff0c;但随着时间的推移&#xff0c;焦虑感会持…

【擎标】CCID信息系统服务商交付能力等级认证标准

为顺应信息技术服务业发展趋势及市场需求&#xff0c;维护市场秩序&#xff0c;加强行业自律&#xff0c;促进信息系统服务商交付能力的不断提高&#xff0c;增强信息系统服务商创新能力和国际竞争力&#xff0c;支撑信息系统服务商转型提升&#xff0c;中国软件行业协会、企业…