关于redis:强上线3天获10w浏览量京东T8纯手码Redis缓存手册我粉了

7次阅读

共计 2802 个字符,预计需要花费 8 分钟才能阅读完成。

Hello,明天给各位童鞋们分享 Redis 缓存,连忙拿出小本子记下来吧!

简介

什么是 Redis?

Redis 是一种存储系统,像 MongoDB 一样,都是键值对存储,也就是 key-value 构造。也就是说,Redis 其实是一种数据库,它能够跨平台应用,本系列整合 SpringBoot+Redis。

Redis 自身是由 C 语言编写,是合乎 ANSI C 规范的开源零碎。Redis 是 Remote Dictionary Server 的缩写,当初罕用于分布式数据库以及高可用缓存零碎。实际上,学会 Redis 整合了 SpringBoot 后,再整合 SpringCloud 就是瓜熟蒂落了。

为什么要用 Redis?

有敌人可能要问,既然 Redis 和 MongoDB 这么像,那我用后者不就行么,干嘛学前者?实际上 MongoDB 和 Redis 是有很大区别的,他们只是在存储形式上有类似点。上面列出二者的不同之处:

  • 数据存储地位

MongoDB 存储的数据寄存在磁盘,少部分数据寄存在内存中。为啥数据库数据还要寄存在内存呢?是因为数据库的缓存零碎会判断热点数据,频繁存取的数据要放在内存达到高效解决。

Redis 的数据全副寄存在内存,并定期写入磁盘,也因而造就了 Redis 的高性能。当内存不够用,Redis 会利用 LRU(Least Recently Used) 算法取代数据,没错,就是操作系统西面置换算法。

  • 数据存储形式

MongoDB 利用了 mmap 函数,将文件数据映射的内存进行增删查改,批改完之后操作系统会将内存数据 flush 到磁盘。问题是二者并非一个事务,因而两个事务间宕机的话,数据天然失落。

Redis 有两种存储模式,RDB 与 AOF 模式,这个咱们前面会说到。

  • 数据处理速度

MongoDB 比 Redis 慢,这也是 Redis 属于内存存储系统的最大劣势。当然,咱们临时不思考内存不够用的状况。

除此之外,目前分布式是大厂支流技术栈,Redis 是大厂会采纳的分布式缓存形式。并且在应答高并发的场景上,比方阿里双十一,腾讯游戏新皮肤的出场或者过年红包等,利用 Redis 和音讯队列是支流的办法。

入门是什么水平?精通是什么水平?

入门就是对 Redis 齐全不理解,然而你要有根底的常识,比方根底的数据结构,根底的类型,根底的内存常识,根底的分布式常识,

根底的 Java/Spring 常识和 linux 的基本操作。这个大可释怀,我程度也一般般,所以我说的根底肯定是根底。

精通并不是说最初能本人写一个 Redis,或者说本人能成为 Redis 的稳固开发维护者,我本人也做不到,所以这里的精通是可能理解 Redis 的各种机制、算法,理解 Redis 提供的罕用办法,理解 Redis 应用场景,本人能排坑,并且可能本人整合 SpringBoot 框架。实际上,这个整合 SpringBoot 框架最简略,官网写的很具体。最好能在 Redis 根底上进行二次开发,实际上了解了原理,会写 C 语言,二次开发还是不难的。

既然是系列文章,我就不能全写在一篇里,内容太多对于我的排版和学习者的体验也不好,所以我会尽量把每一篇文章压缩在一个能够承受的长度范畴,当然,我尽量在每一篇文章都给出系列所有文章的链接,供大家,也供我日后不便查阅。如果文章能帮到你,心愿给个赞激励下,尽管不是靠这个生存,然而失去认可还是很快乐的。

缓存以及应用场景

什么是缓存?

缓存实际上就是某个程序利用内存来优化频繁读取的数据的一种形式。缓存就是内存的一部分。之前咱们写到,数据库操作往往是存储在磁盘中的,然而磁盘的 IO 又慢的不得了,怎么办?程序猿们想了一种办法,就是利用好内存。不是磁盘 IO 慢么,那就利用内存好了,内存 IO 很快的,然而货色太多,放不进内存怎么办?那就把罕用的数据放在内存吧。

当初是 2021 年,相熟 NBA 的敌人都晓得,往年威少的数据又爆炸,所以球迷可能会时常看威少的数据,加上威少的粉丝也不少,可能就存在高并发的问题。然而每次从磁盘拿数据也太慢了,那就把独自把威少的数据放在内存中,他人的数据持续躺在磁盘里,这样大大放慢了零碎响应的速度,这就是缓存。

然而,NBA 可不止有一个球星,库里,詹姆斯,约基奇等都是很杰出的球员,领有球迷的数量不比威少少,那就把他们的数据都放在缓存中吧,这样就快了。然而咱们发现,NBA 球星太多了,内存放不下,怎么办?这就引出了咱们的常见的缓存淘汰算法,对操作系统有理解的敌人可能晓得,什么 LRU,LFU,FIFO,FILO 等等,我把这个放在前面的 Redis 算法机制里说。

本地缓存与分布式缓存

先看看例子,还是 NBA 球员,当初我的内存太小了啊,每个计算机只能寄存一名 NBA 球员的数据,然而我当初有 3 名球员数据须要寄存在计算机外面怎么办?

本地缓存

本地缓存就是将数据寄存在本地内存中,因为不须要通过网络连接到其余主机,天然速度也最快,当然毛病也是有的。比方 Mybatis 一二级缓存,Caffeine,Guava 都是本地缓存的典型范例。回到之前的例子,3 名球员放在 3 台不同的主机,如果用本地缓存的架构就是这样的:

长处:

速度快,不必通过网络传输

毛病:

每台主机可用缓存容量无限

多节点无奈共享数据

分布式缓存

分布式缓存就是利用网络,将缓存放在某一台主机上,这样缓存的容量限度就是缓存机的内存大小,其 IO 瓶颈就是网速。Redis 就是典型的分布式缓存,当然,咱们也能够让 Redis 变成彻头彻尾的本地缓存,不经网络调用即可。

当然,上图并不精确,既然缓存的分布式了,当然不能只部署在一台缓存机上,往往都是集群的形式部署缓存机的。

热点 Key 问题

什么是热点 key 呢?很简略,咱们看到微博时常会宕机,除了用户量大,信息量多以外,往往是某个明星又发表“咱们有个孩子”这类的事件,有数用户拜访该资源,该资源对应的 key 就被称为热点 key,忽然间的高并发,使得某一个热点被高频拜访,从而导致服务器缓存资源耗竭,怎么解决?

解决办法有很多,然而咱们明天说到缓存问题了,就只说缓存解决方案。拿明星有了孩子举例子,从起因剖析到解决方案,其实起因有了,解决方案就是信手拈来的事件了。

起因剖析:某明星 A 与某明星 B 有了孩子,A 和 B 在分布式缓存服务器上,然而当这种爆炸性新闻产生的时候,大量用户拜访分布式缓存服务器,即便缓存资源没有耗尽,网络 IO 也无奈承载。因为咱们的假如是 key 在一台机器,那么临时不思考拆分 key 的状况,就是缓存临时能顶得住,然而网络 IO 崩了,分布式缓存服务器接受不了那么大的数据量,怎么办?

解决办法:既然解决不了网络的问题,那就不解决了,罗唆不必,毕竟扩充网络带宽这种在行都懂的办法入不了咱们的法眼。怎么不必?那就是本地缓存 + 分布式缓存。网络受不了,就把高频资源放在本地服务器上,外界拜访相干资源,间接从本地服务器取,和分布式缓存服务器无关。只有当新来的高频资源拜访,且老高频资源热度上来时,取代即可。

好啦,明天的文章就到这里,心愿能帮忙到屏幕前迷茫的你们

正文完
 0