怎么看一个网站做没做竞价,平台推广费用,wordpress网址的域名怎么改,忆唐网不做网站做品牌前言
这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流#xff0c;我也是没办法#xff0c;才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。
其实为什么要讲这个话题呢#xff1f; Redis 应用在很多地方呀#xff0c;为什么一定要挑着这个话题来讲呢…前言
这是关于 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。