在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
众所周知,Redis是一款开源的数据库,它使用ANSI C语言编写、遵守BSD协议、支持网络,并且可基于内存也可持久化的日志型、Key-Value高性能。本文就来聊聊Redis,带大家从入门到精通。以下是Redis史上最全详解,一起来看看吧!
常用的 SQL 数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力。
由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用。但这并不能减少业务逻辑对数据库的增删改操作的 IO 压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力。
1、主流应用架构:
客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询。如果在数据库中查询到该数据,则将该数据回写到缓存层,以便下次客户端再次查询能够直接从缓存层获取数据。
2、为什么 Redis 能这么快
Redis 的效率很高,官方给出的数据是 100000+QPS,这是因为:Redis 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高。Redis 使用单进程单线程模型的(K,V)数据库,将数据存储在内存中,存取均不会受到硬盘 IO 的限制,因此其执行速度极快。另外单线程也能处理高并发请求,还可以避免频繁上下文切换和锁的竞争,如果想要多核运行也可以启动多个实例。
数据结构简单,对数据操作也简单,Redis 不使用表,不会强制用户对各个关系进行关联,不会有复杂的关系限制,其存储结构就是键值对,类似于 HashMap,HashMap 最大的优点就是存取的时间复杂度为 O(1)。
Redis 使用多路 I/O 复用模型,为非阻塞 IO。注:Redis 采用的 I/O 多路复用函数:epoll/kqueue/evport/select。
选用策略:
因地制宜,优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现。由于 Select 要遍历每一个 IO,所以其时间复杂度为 O(n),通常被作为保底方案。基于 React 设计模式监听 I/O 事件。
3、Redis 的数据类型
String:最基本的数据类型,其值最大可存储 512M,二进制安全(Redis 的 String 可以包含任何二进制数据,包含 jpg 对象等)。注:如果重复写入 key 相同的键值对,后写入的会将之前写入的覆盖。
Hash:String 元素组成的字典,适用于存储对象。
List:列表,按照 String 元素插入顺序排序。其顺序为后进先出。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能。
Set:String 元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为 O(1)),不允许重复。另外,当我们使用 Smembers 遍历 Set 中的元素时,其顺序也是不确定的,是通过 Hash 运算过后的结果。Redis 还对集合提供了求交集、并集、差集等操作,可以实现如同共同关注,共同好友等功能。
Sorted Set:通过分数来为集合中的成员进行从小到大的排序。
更高级的Redis类型:用于计数的HyperLogLog、用于支持存储地理位置信息的 Geo。
4、如何通过 Redis 实现分布式锁
分布式锁:分布式锁是控制分布式系统之间共同访问共享资源的一种锁的实现。如果一个系统,或者不同系统的不同主机之间共享某个资源时,往往需要互斥,来排除干扰,满足数据一致性。
分布式锁需要解决的问题如下:
互斥性:任意时刻只有一个客户端获取到锁,不能有两个客户端同时获取到锁。
安全性:锁只能被持有该锁的客户端删除,不能由其他客户端删除。
死锁:获取锁的客户端因为某些原因而宕机继而无法释放锁,其他客户端再也无法获取锁而导致死锁,此时需要有特殊机制来避免死锁。
容错:当各个节点,如某个 Redis 节点宕机的时候,客户端仍然能够获取锁或释放锁。
5、如何实现异步队列
(1)使用 Redis 中的 List 作为队列
使用上文所说的 Redis 的数据结构中的 List 作为队列 Rpush 生产消息,LPOP 消费消息。此时我们可以看到,该队列是使用 Rpush 生产队列,使用 LPOP 消费队列。在这个生产者-消费者队列里,当 LPOP 没有消息时,证明该队列中没有元素,并且生产者还没有来得及生产新的数据。
缺点:LPOP 不会等待队列中有值之后再消费,而是直接进行消费。
弥补:可以通过在应用层引入 Sleep 机制去调用 LPOP 重试。
(2)使用 BLPOP key [key…] timeout
BLPOP key [key …] timeout:阻塞直到队列有消息或者超时。
缺点:按照此种方法,我们生产后的数据只能提供给各个单一消费者消费。能否实现生产一次就能让多个消费者消费呢?
(3)Pub/Sub:主题订阅者模式
发送者(Pub)发送消息,订阅者(Sub)接收消息。订阅者可以订阅任意数量的频道。Pub/Sub模式的缺点:消息的发布是无状态的,无法保证可达。对于发布者来说,消息是“即发即失”的。此时如果某个消费者在生产者发布消息时下线,重新上线之后,是无法接收该消息的,要解决该问题需要使用专业的消息队列,如 Kafka…此处不再赘述。
6、Redis 持久化
(1)什么是持久化?
持久化,即将数据持久存储,而不因断电或其他各种复杂外部环境影响数据的完整性。由于 Redis 将数据存储在内存而不是磁盘中,所以内存一旦断电,Redis 中存储的数据也随即消失,这往往是用户不期望的,所以 Redis 有持久化机制来保证数据的安全性。
(2)Redis 如何做持久化
Redis 目前有两种持久化方式,即 RDB 和 AOF,RDB 是通过保存某个时间点的全量数据快照实现数据的持久化,当恢复数据时,直接通过 RDB 文件中的快照,将数据恢复。如何从海量数据里快速找到所需?
①分片:按照某种规则去划分数据,分散存储在多个节点上。通过将数据分到多个 Redis 服务器上,来减轻单个 Redis 服务器的压力。
②一致性 Hash 算法:既然要将数据进行分片,那么通常的做法就是获取节点的 Hash 值,然后根据节点数求模。但这样的方法有明显的弊端,当 Redis 节点数需要动态增加或减少的时候,会造成大量的 Key 无法被命中。所以 Redis 中引入了一致性 Hash 算法。该算法对 2^32 取模,将 Hash 值空间组成虚拟的圆环,整个圆环按顺时针方向组织,每个节点依次为 0、1、2…2^32-1。
之后将每个服务器进行 Hash 运算,确定服务器在这个 Hash 环上的地址,确定了服务器地址后,对数据使用同样的 Hash 算法,将数据定位到特定的 Redis 服务器上。如果定位到的地方没有 Redis 服务器实例,则继续顺时针寻找,找到的第一台服务器即该数据最终的服务器位置。
③Hash 环的数据倾斜问题
Hash 环在服务器节点很少的时候,容易遇到服务器节点不均匀的问题,这会造成数据倾斜,数据倾斜指的是被缓存的对象大部分集中在 Redis 集群的其中一台或几台服务器上。一致性 Hash 算法运算后的数据大部分被存放在 A 节点上,而 B 节点只存放了少量的数据,久而久之 A 节点将被撑爆。针对这一问题,可以引入虚拟节点解决。简单地说,就是为每一个服务器节点计算多个 Hash,每个计算结果位置都放置一个此服务器节点,称为虚拟节点,可以在服务器 IP 或者主机名后放置一个编号实现。
以上就是Redis从入门到精通的全部详解,大家都理解了吗?如果想要深入学习Redis的相关内容,可以登录博学谷官网在线学习更多视频资源。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
4个月学前端找不到工作吗?学前端到底要多久?
4个月学前端找不到工作吗?现在市面上到处可见,IT培训机构打着几个月速成前端的幌子,以此来招揽生源。其实学习这个东西没有什么捷径,但凡是可以保证在短短3、4个月内速成的,学习质量一定难以保障。既然在这样不靠谱的机构学习,学完能够找到工作的概率自然很低。那么学前端到底要多久呢?这个问题的答案因人而异,不过我们可以了解前端就业有哪些必备的技能和知识,下面我们就一起来看看吧!
8897
2019-10-07 15:50:24
常见三大缓存问题分析及解决方案
一般来讲,常见三大缓存问题不外乎就是缓存穿透、缓存击穿、缓存雪崩。三者的共同点都是高并发,缓存更新、缓存失效居多。而且三者也会相互恶化,导致问题更加严重,因此一旦有一个问题就需要马上解决,以免最引起“雪崩”。本文将分别分析缓存并发、缓存雪崩、缓存击穿三大问题,并提出对应的解决方案。
7325
2019-11-01 18:23:18
十个实用的CSS代码技巧整理
为了让大家高效率的进行工作,本文归纳总结了十个实用的CSS代码技巧,希望对大家能有所帮助。简单来说,这十大技巧分别是注意外边距折叠,使用flex进行布局,所有元素设置为Border-box,重置元素的CSS样式,使用transform属性来创建动画,短横线命名,不要使用!important,使用AutoPrefixer达到更好的兼容性,Caniuse和验证。
4578
2019-11-10 14:57:03
CSS3教程免费在线学习
随着CSS技术的不断升级,CSS3便诞生了,可以说CSS3的语法是建立在CSS原先版本基础上的。因此掌握CSS3的重要性不言而喻,一方面可以提升网页制作效果,另一方面还能极大提升开发效率。那么如何学习并掌握CSS3相关技术呢?这里推荐大家一些在博学谷就可以免费在线学习CSS3教程,有需求的小伙伴可以看看相关的课程介绍。
4454
2020-02-06 15:17:49
前端开发中绝对路径和相对路径的区别是什么?
前端开发中绝对路径和相对路径的区别是什么?绝对路径和相对路径主要的区别是域名是否是完全网站,起作用是相同的。绝对路径指的是包含域名的完整网址,相对路径指的是不包含域名的被链接页面相对于当前页面的相对网址。
8454
2020-07-16 11:51:15