Redis 全景图(3)--- Redis 应用于缓存

2024-03-31 13:28
文章标签 应用 redis 缓存 全景图

本文主要是介绍Redis 全景图(3)--- Redis 应用于缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流,我也是没办法,才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。

其实为什么要讲这个话题呢? Redis 应用在很多地方呀,为什么一定要挑着这个话题来讲呢?我刚开始接触 Redis 的时候,对 Redis 的很多知识都不熟悉,但是Redis又经常用于缓存,所以我就把Redis 和缓存搞混了。我以为 Redis 就是缓存,缓存就是 Redis。然后我背了好多知识,什么缓存与数据库不一致,什么缓存雪崩缓存穿透这些,都是关于 Redis 的,所以我当时就认为缓存是Redis。那个时候,我一直建立不起系统观,不能对 Redis 和缓存这两个知识点高山看海。后来我看了好多文章,然后通过文章来对自己脑里的知识做梳理总结后,才明白这两者的区别。所以我特意写一篇文章来讲讲 Redis 应用于缓存这个场景。

缓存的两个特征

要讲 Redis 应用于缓存,那我们就先来讲缓存,再讲 Redis。因为我们最终要解决的问题是为什么Redis 可以应用于缓存?kafka 为什么不可以应用于缓存?zookeepeer 为什么不可以?为什么就Redis 可以?

缓存是用来放一些热点数据,加快查询速度的,所以缓存有两大特征:缓存是一个快速的系统,而且缓存的容量小于后端的慢速系统。

缓存在 CPU 和内存中都存在,但是 Redis 应用于内存的缓存,不应用于CPU的缓存。

Redis用于缓存的两大天然优势

上面说了,缓存的一大特点就是快,那 Redis 刚好适合,Redis 很快。同时,Redis 还有专属的数据淘汰机制,使得 Redis 保存的数据会比较少,刚好符合缓存容量小于后端的慢速系统这个特点。

引入缓存的4个问题

这几乎是缓存中最难理解的地方了。这个地方的知识点多而且杂,还不好理解。不过假如你建立了系统观的话也还好,至少回忆起来会快一点。

缓存雪崩

Tomcat 一般是先访问缓存再访问数据库的。但是,假如缓存中数据在某一时刻同时过期,那大量的并发请求就会越过缓存直接走数据库,数据库压力剧增,这就是缓存雪崩。解决方法是给缓存中的数据的过期时间设一个随机值。

缓存穿透

Tomcat 故意大量请求缓存中没有的数据,导致请求走数据库,并发时压力剧增。解决方法是在Dao 层就拦截这种非法请求。

缓存与数据库不一致

说实话,这个是真的烧脑,就很难受,我一直搞不懂这里,因为这里确实很复杂。我尽量将我能理解的写出来......

其实对数据的操作无非就是“读”和“写”。“读”不会造成缓存与数据库不一致的问题,但是“写”就会。“写”其实就是更新的意思,那无论我们先更新数据库再同步给缓存,还是先更新缓存再同步给数据库,我们都想保证这些操作的原子性。假如第一步更新失败了,那就失败呗,没什么大不了的。但是假如第一步更新成功了,第二步更新失败了,那就会造成缓存与数据库不一致的问题(即缓存中的值是新值而数据库中的值是旧值;也有可能缓存中的值是旧值而数据库中的值是新值)。因此更新数据库和更新缓存这个操作不太好。

那我们换一种思路,数据库是必须要更新的,但是缓存不一定需要更新,所以我们能否考虑删除缓存,一了百了呢?我了解到的答案是可以的。先删除缓存再更新数据库,在高并发下不太OK,但是在原子性被破坏的情况下表现很OK。先更新数据库再删除缓存,在高并发下很OK,但在原子性被破坏时不太OK。

缓存数据淘汰策略

因为缓存比较少,没有磁盘那么大,所以不可避免的,过一段时间就要对缓存的数据进行淘汰。而Redis 有自己的数据淘汰策略,所以很适合用作缓存。下面我就来介绍一下 Redis 的数据淘汰策略。

假如你添加了一批键值对,设置了一小时的过期时间。一小时后,这批数据已经全部过期了,你想要删除这些键值对,怎么办?可以采用定期删除策略,即每过100ms就随机抽取一些设置了过期时间的键值对,过期就删除。但是由于是随机的,所以很可能漏掉了一些键值对,因此我们可以采用惰性删除。惰性删除就是你要使用的时候看看键值对是不是过期的,过期就顺便删掉。

但是问题是定期删除+惰性删除也不一定可以保证所有过期数据都被删除,有些数据你随机抽取,抽取不到,而你又一直不适用这些抽取不到的数据,导致这些数据积压在 Redis 中。所以引入了一种技术:通过内存淘汰机制来淘汰键值对。内存淘汰机制的算法有很多,我觉得用的最多的是LRU算法。

小结

在这篇文章中我讲了 Redis 应用于缓存。我先讲了缓存的两个特征,为接下来解答为什么 Redis 可以应用于缓存做铺垫。接着我又讲了引入缓存所遇到的4个问题:缓存雪崩、缓存穿透、缓存与数据库不一致、缓存怎么淘汰数据。

感想

这是我第一次以这种方式来写文章,通过一篇文章(其实是三篇)将我脑子里的 Redis 全景图描绘出来。在这几天的学习中,我的收获还是挺大的,倒不是我学习了很多 Redis 的新知识,当然学习到新知识只是一方面,更重要的是我深刻的理解了建立系统观的重要性。如果没有系统观,我学到的知识仅仅只是几个点,构建不成一个面。这样就会导致我有可能学了很多知识,但是却不知道如何讲起。而且,当我有了系统观,将 Redis 中的各个知识以一个思路串联在一起后,我感觉我对Redis 的很多知识的具体细节又有了新的理解。

那怎么才能建立系统观呢?我个人觉得是看一些优质的技术文章,通过一些优质的文章或者书籍来引导你去思考。最好不要看视频,因为看视频的话你是无法思考的,看视频算是一个接受的过程,没有思考的过程。说到书籍,我有时会去图书馆看很多技术书,但是我不是一整本书全部看完。比如说我看《Redis原理剖析》,我不会一整本看完,而是以一种高山看海的角度去看看这个作者到底是以一种什么样的角度去写 Redis 的,从而去推测出这个作者脑子的 Redis 思维导图,他脑子里的 Redis 总体框架是怎么样的,我能否借鉴一下作者脑子的框架,形成一个属于我自己的 Redis 全景图。这是我觉得形成系统观最重要的一点。接下来,我会继续尝试用这种方式写第二篇长文,第二篇长文的主题是 MySQL。

这篇关于Redis 全景图(3)--- Redis 应用于缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864447

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe