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

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Linux(Centos7)安装Mysql/Redis/MinIO方式

《Linux(Centos7)安装Mysql/Redis/MinIO方式》文章总结:介绍了如何安装MySQL和Redis,以及如何配置它们为开机自启,还详细讲解了如何安装MinIO,包括配置Syste... 目录安装mysql安装Redis安装MinIO总结安装Mysql安装Redis搜索Red

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或