Redis系列(一):各大厂都在用的Resid到底是什么?

article/2025/8/15 4:17:55

一、redis是什么?

1.Redis的定义

先上一段官方定义:Redis 是开源免费(遵守BSD协议)、高性能的key-value数据库。

是不是觉得上面的一句话既熟悉又陌生,作者怎么想的为啥开源免费?BSD协议又是什么?key-value数据库是什么,与传统的mysql、oracle有什么区别?

别急,欲知详情,请看下面分解:

Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程字典服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。众多语言都支持Redis。

那么BSD协议是什么呢?简单来说就是一个开源协议,具体请看https://www.runoob.com/note/13176。

key-value数据库?就是像python中的dict类型一样的数据存储模式,传统的mysql、oracle是关系型数据库,key-value模式的数据库是非关系型的数据库(NoSQL)。

2.Redis的用途

作为公共缓存:Redis交换数据速度快,在架构中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,并且可以极大提升速度

以大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。

3.Redis的特点

1)支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

2)支持丰富的数据类型:不仅支持简单的key-value类型,同时还支持string、list,set,zset(sorted set),hash等数据结构的存储。

3)支持数据的备份:即master-slave模式的数据备份。

二、为什么要部署一台Redis服务器,而不是简单的给服务器添加内存条?

这个理解起来有点深,跟服务器集群、数据的队列访问、程序代码对内存的控制有关。就像一般存储数据都是用mysql、oracle等数据库,而不是使用excel一样。Redis是标准的数据存储和管理方式,只不过与关系型数据库不同的是,Redis的数据存在内存中,效率比关系型数据库高很多。但如果我们自己给服务器添加内存条,我们就要自己写数据的管理方式等,非常繁琐,有现成的为什么不直接用呢?

三、Redis的经典应用场景

场景描述
缓存热数据热数据(进入市场时经常被查询,但未被修改或删除的数据),首选使用redis缓存,redis的性能非常优越。
计数器由于具有单个线程,因此可以计算诸如单击,访问,喜欢,评论,视图等的计数,以避免并发问题,确保数据的准确性和100%毫秒的性能,同时启用Redis持久性为了促进数据的持久性。
单线程机制验证上一段中的重复请求,并可以自由扩展类似情况。可以通过redis进行过滤。例如,每个请求都使用请求IP,参数和接口的哈希值作为存储Redis的键,并设置有效期限。然后,下一次请求结束时,现在将检索redis中是否存在此密钥,然后验证它是否为“在一定时间内不是重复提交”。例如,要限制用户登录的数量,最好不要超过一天中错误登录的数量。基于redis的Spike系统是单线程功能,可防止数据库超卖,全局增量ID生成等。
排行榜得分最高的人排名第一,例如高点击率,活跃度,最高销售数量,投票数最高的前10名,等等。
分布式锁Redis可用于实现分布式锁。为了确保分布式锁可用,至少锁的实现必须同时满足以下条件:互斥在任何时候,只有一个客户端可以持有该锁。不会发生死锁。即使一个客户在锁定保持期间崩溃而没有主动解锁,也可以确保其他客户以后可以锁定。本的容错能力只能在大多数Redis节点上正常运行。然后,客户可以锁定和解锁。锁定和解锁必须是同一客户端,并且该客户端无法解锁他人添加的锁。
会话存储使用Redis进行会话缓存是很常见的情况。使用Redis在其他存储上缓存会话的优点是Redis提供了持久性。目前,很多解决方案都采用Redis作为会话存储解决方案。

四、Redis的五种数据类型

Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value。RedisObject 最主要的信息如上图所示:type 表示一个 value 对象具体是何种数据类型,encoding 是不同数据类型在 Redis 内部的存储方式。

比如:type=string 表示 value 存储的是一个普通字符串,那么 encoding 可以是 raw 或者 int。

类型简介特性场景
String(字符串)

1.Redis 最基本的类型

2.二进制安全

1. 最基本的类型:可以理解成与 Memcached一模一样的类型,一个 Key 对应一个 Value

2.二进制安全:可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M

/
Hash(字典)键值对集合,即编程语言中的Map类型适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性
List(列表)链表(双向链表)增删改,提供了操作某一段元素的API

1.最新消息排行等功能(比如朋友圈的时间线)

2.消息队列

Set(集合)哈希表实现,元素不重复

1.添加、删除,查找的复杂度都是O(1)

2.为集合提供了求交集、并集、差集等操作

1.共同好友

2.利用唯一性,统计访问网站的所有独立ip 3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐

Sorted Set(有序集合)将Set中的元素增加一个权重参数score,元素按score有序排列数据插入集合时,已经进行天然排序

1.排行榜

2.带权重的消息队列

五、Redis缓存热数据技术实现?

暂时不写

六、Redis如何保持缓存与数据库数据的一致性?

缓存数据与数据库不一致的情况大概有以下三种:

1. 数据库有数据,缓存没有数据:采用先读缓存在读数据库,且读数据库时把数据加载到缓存的策略会消除此种不一致。

2. 数据库有数据,缓存也有数据,数据不相等:无法解决,只能等下次更新数据

3. 数据库没有数据,缓存有数据:删除数据库成功但删除缓存失败了会导致这种情况的发生。

缓存读取策略:

先读缓存数据,如果读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。

缓存更新策略:

首先先来看下缓存的使用策略,一种常规的用法叫Cache Aside Pattern:

1)读数据:先读缓存数据,如果读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。

2)写数据:需要更新数据时,先更新数据库,然后把缓存里对应的数据失效掉(删掉)。

对于读数据,应该是毫无疑问肯定要先读缓存数据的,不然增加redis干嘛呢?那么思考一下,写数据的时候,如果不是先更新数据再删除缓存,而是先删除缓存再更新数据库会怎样呢?看下A、B两个线程同时要更新数据时会发生哪些情况:

1)A、B都完成了删除缓存且A、B更新数据库的中间有其他线程读取数据:假设A线程先更新数据库。此时C线程介入,C线程要读取数据,由于缓存没有则查数据库,并把A更新的数据写入了缓存,最后B线程更新数据库,以后D、E、F等线程读取数据的时候都是从缓存读取且B线程写入数据库的数据永远不会加载到缓存,由此形成了缓存与数据库数据的永久不一致,直至下次缓存数据被删除。。。

2)A、B都完成了删除缓存且A、B更新数据库的中间没有其他线程读取数据:这种情况要看A和B谁先更新了数据库,假设A线程先更新了数据,那么下次其他线程读取数据的时候便会把A线程的数据加载到缓存。这种情况无论A、B谁先更新了数据库,都不会导致缓存与数据库不一致。

另外有人会问,如果采用你提到的方法,为什么最后是把缓存的数据删掉,而不是把更新的数据写到缓存里

这么做引发的问题是,如果A,B两个线程同时做数据更新,A先更新了数据库,B后更新数据库,则此时数据库里存的是B的数据。而更新缓存的时候,是B先更新了缓存,而A后更新了缓存,则缓存里是A的数据。这样缓存和数据库的数据也不一致。

并发不高的情况:

读: 读redis->没有,读mysql->把mysql数据写回redis,有的话直接从redis中取;

写: 写mysql->成功,再写redis;

并发高的情况:

读: 读redis->没有,读mysql->把mysql数据写回redis,有的话直接从redis中取;

写:异步话,先写入redis的缓存,就直接返回;定期或特定动作将数据保存到mysql,可以做到多次更新,一次保存;

缓存删除策略:

1. 删除失败则重试:删除缓存失败的话需要进行重试,数据的一致性要求越高,重试得越快。

2. 定期全量更新:简单地说,就是定期把缓存全部清掉,然后再全量加载。

3. 给所有的缓存一个失效期:一个大杀器,任何不一致,都可以靠失效期解决,失效期越短,数据一致性越高。但是失效期越短,查数据库就会越频繁。因此失效期应该根据业务来定。

分布式环境下非常容易出现缓存和数据库间数据一致性问题,针对这一点,如果项目对缓存的要求是强一致性的,那么就不要使用缓存。只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括上述的缓存更新策略:更新数据库后及时更新缓存、缓存失败时增加重试机制

 

参考文章:

搞懂这些Redis知识点,吊打面试官!

Redis 数据类型

Redis怎么保持缓存与数据库一致性?


http://chatgpt.dhexx.cn/article/61Fo59ZQ.shtml

相关文章

opencv 实现图像高斯金字塔

函数: dst cv.pyrDown( src[, dst[, dstsize[, borderType]]] ) # 高斯金字塔下采样 参数: src 源图像. dst 输出图像;它有着指定的大小,和源图像有着相同的类型. dstsize 输出图像的大小. borderType 像素外延方法. 默认情况下&…

图像增强中的高斯金字塔/拉普拉斯金字塔 融合

1.高斯金字塔 注意区分:高斯金字塔层级越高,分辨率越低。但下层(第i层)得到上层(第i1层)的过程叫做下采样,有些地方用reduce描述这个过程。 图像的金字塔化过程实际上是先平滑、再下采样的过程…

python --opencv图像处理金字塔(高斯金字塔、拉普拉斯金字塔)

引言 前面的文章中,我们有用过图像方法或者缩小的函数 resize() ,这个函数既可以放大图像,也可以缩小图像,其中: 缩小图像:一版使用 CV_INETR_AREA (区域插值)来插值。放大图像&am…

高斯金字塔及拉普拉斯金字塔的Matlab实现

1、高斯金字塔计算步骤 (1)对第 i i i 层图像进行高斯内核卷积; (2)将所有偶数行和列去除(下采样),得到第 i 1 i1 i1 层图像; (3)对原始图像不…

【C++】高斯金字塔和拉普拉斯金字塔原理和实现

【C】高斯金字塔和拉普拉斯金字塔原理和实现 图像中各个像素与其相邻像素之间的有很强的相关性,包含的信息也十分丰富,目标的尺寸有大有小,对比度有强有弱,此时就需要一个“显微镜”或者“望远镜”-----多尺度图像技术。它可以在…

python 高斯金字塔_12、高斯金字塔、拉普拉斯金字塔与图片尺寸缩放(示例代码)...

一、引言 我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: (1)resize函数。这是最直接的方式, (2)pyrUp( )、pyrDown( )函数。即图…

高斯金字塔的构建步骤

转自:https://www.cnblogs.com/starfire86/p/5735061.html SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别、图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍。 高斯金字…

图像处理(九)高斯金字塔及拉普拉斯金字塔

高斯滤波的核就是一个求平均值的卷积核 高斯金字塔也是一个高斯核,只是步长为2,卷积后图片缩小二倍。高斯金字塔的目的是在图像不同大小时可以获得不同的信息,比如说图像较小时可以获得轮廓,图像较大时可以获得细节 使用函数cv2.p…

OpenCV SIFT源码讲解——构建高斯金字塔

目录 一、构建方法 二、函数重要点注释 一、构建方法 高斯金字塔每层图像的尺度为:。理论上金字塔每层图像可以从原图做的高斯滤波得到。但是实际操作中,每组的第一张影像(除第一组)是上一组倒数第三张影像降采样得到&#xff0c…

OpenCV中的图像金字塔(高斯金字塔、拉普拉斯金字塔)

最近在看关于数字图像的知识点,目前在图像金字塔部分,实在是懒得用手作笔记了,就以其中比较出名的“高斯金字塔”和“拉普拉斯金字塔”为例,基于OpenCV的源代码作解析存个档;毕竟属于基础部分,以后有需要就…

python 高斯金字塔_Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。 基础知识铺垫 学习图像金字塔,发现网上的资料比较多,检索起来比较轻松。 图像金字塔是一张图像多尺度的表达,或者可以理解成一张图像不同分辨率展示。 金字塔越底层的…

图像金字塔和高斯金字塔

一:图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔实际上是一张图片在不同尺度下的集合,即原图的上采样和下采样集合。金字塔的底部是高分辨…

opencv学习-高斯金字塔和拉普拉斯金字塔

图像金字塔 一个图像金字塔是由一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就像一个古代的金字塔。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的…

高斯金字塔与拉普拉斯金字塔的原理与python构建

转载自:https://zhuanlan.zhihu.com/p/94014493 高斯金字塔和拉普拉斯金字塔【1】在图像相关领域应用广泛,尤其是图像融合和图像分割方面。本文从理论和opencv实现两个方面对两种金字塔进行了介绍,并给出了二者的视觉效果。 1、高斯金字塔 在计算机视觉…

图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。 图像金字塔有什么作用? 图像金字塔常用于图像缩放…

高斯金字塔

1、为什么要构建高斯金字塔 高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊&am…

系统集成项目管理工程师知识点

信息化知识 在这个学时里,将学习有关信息化的许多知识点,这些知识点的试题大多出现在上午试 题中。这引起知识点主要是: (1)信息与信息化的定义。 (2)国家信息化发展战略(2006-2020&…

快速了解Scala技术栈

http://www.infoq.com/cn/articles/scala-technology/ 我无可救药地成为了Scala的超级粉丝。在我使用Scala开发项目以及编写框架后,它就仿佛凝聚成为一个巨大的黑洞,吸引力使我不得不飞向它,以至于开始背离Java。固然Java 8为Java阵营增添了一…

一篇博客带你掌握pytorch基础,学以致用(包括张量创建,索引,切片,计算,Variable对象的创建,和梯度求解,再到激活函数的使用,神经网络的搭建、训练、优化、测试)

一篇博客带你掌握pytorch基础,学以致用 1.将numpy的 ndarray对象转换为pytorch的张量 在 Pytroch 中,Tensor 是一种包含单一数据类型元素的多维矩阵,译作张量。熟悉 numpy 的同学对这个定义应该感到很熟悉,就像ndarray一样&…

AI题目整理

文章目录 1、网络配置时batchsize的大小怎样设置?过小和过大分别有什么特点?2、设置学习率衰减的原因?3、有哪些分类算法?4、分类和回归的区别?5、请描述一下K-means聚类的过程?6、训练集、测试集、验证集的作用?7、请讲解一下k折交叉验证?8、分类和聚类的区别?9、讲述…