深度redis

Redis技术深度解析 Redis是一款开源的高性能键值存储系统,以其内存存储、丰富的数据结构、持久化与容灾、分布式锁等核心特性,广泛应用于现代互联网架构中。文章详细解析了Redis的内存存储与高性能、多种数据类型、持久化机制、分布式锁等特性,并通过与Memcached、PostgreSQL、Elasticsearch的对比,展示了Redis在不同场景下的优势。此外,文章还探讨了Redis的实际应用场景,如缓存加速、会话存储、消息队列、限流与计数,以及其进阶特性如集群模式、Lua脚本、模块化扩展。 阅读详情

1.关系型数据库

建表:必须给出schema
类型:字节宽度
存:倾向于行级存储

2.数据库表很大,性能下降怎么办

如果表有索引:

增删改查变慢;

查询速度

1.1个或者少量的查询依然很快
2.并发大的时候会受到硬盘带宽影响速度

3.memcached和redis 的不同

相同:都是key---value的形式
不同:memcached没有类型的概念,redis有类型的区分

4.为什么 Redis 中要使用 I/O 多路复用这种技术

首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的

5. redis的io模型

1.epoll(默认主要)

2.select/poll

3.kqueue

6. epoll有诸多优点

  1. epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048,
    一般来说这个数目和系统内存关系很大
    ,具体数目可以 cat /proc/sys/fs/file-max 察看。

  2. 效率提升, Epoll 最大的优点就在于它
    只管你“活跃”的连接
    ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。

  3. 内存拷贝, Epoll 在这点上使用了“
    共享内存
    ”,这个内存拷贝也省略了。

7.多路复用I/O(Multiplexing I/O)

  1. select:能打开的文件描述符个数有限(最多1024个),如果有1k请求,用户进程每次要把1k个文件描述符发送给内核,内核在内部轮询后将可读描述符返回,用户进程再依次读取。因为文件描述符(fd)相关数据需要在用户态和内核态之间拷来拷去,所以性能还是比较低;
  2. poll:可打开的文件描述符数量提高,因为用链表存储,但性能仍然不够,和select一样数据需要在用户态和内核态拷来拷去;
    3. epoll(Linux下多为技术):用户态和内核态之间不用文件描述符(fd)的拷贝,而是通过mmap技术实现开辟共享空间,所有fd用红黑树存储,有返回结果的fd放在链接中,用户进程通过链表读取返回结果,伪异步I/O,性能较高。epoll分为水平触发和边缘触发这两种模式,ET是边缘触发,LT是水平触发,一个表示只有在变化的边际触发,一个表示在某个阶段都会触发;

8.epoll给我们提供了3个api

1: int epoll_create(int size);

生成一个 epoll 专用的文件描述符,其实是申请一个内核空间,用来存放你想关注的 socket fd 上是否发生以及发生了什么事件。 size 就是你在这个 epoll fd 上能关注的最大 socket fd 数,大小自定,只要内存足够。

2: int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event );

控制某个 epoll 文件描述符上的事件:注册、修改、删除。参数说明:

epfd 是 epoll_create() 创建 epoll 专用的文件描述符。相对于 select 模型中的 FD_SET 和 FD_CLR 宏;

op就是你要把当前这个套接口fd如何设置到epfd上边去,一般由epoll提供的三个宏指定:EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD。

fd: 当事件发生时操作的目标套接口。

event指针就是你要给这个套接口fd绑定什么事件。

3: int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout);

等待 I/O 事件的发生;参数说明:

epfd: 由 epoll_create() 生成的 Epoll 专用的文件描述符;

epoll_event: 用于回传代处理事件的数组;

maxevents: 返回的最大事件数;

timeout: 等待 I/O 事件发生的超时值(毫秒);

epoll_wait返回触发的事件数。

9.epoll的LT和ET模式的区别

LT模式:epoll就是一个快速版poll,可读可写就绪条件和传统poll一致
ET模式:为了避免Starvation,建议
1)文件描述符设置为非阻塞
2)只在read或write返回EAGAIN后,才能调用下一次epoll_wait
3)应用层维护一个就绪链表,进行轮询,可以防止大量IO时在一个描述符上长期read或write(因为只有等到read
或 write返回EAGAIN后才表示该描述符处理完毕)而令其它描述符starve

  理解ET的含义后,上面那些操作其实都是显然的。以wirte为例说明,LT时只要有一定范围的空闲写缓存区,每次epoll_wait都是可写条件就 绪,但是ET时从第一次可写就绪后,epoll_wait不再得到该描述符可写就绪通知直到程序使描述符变为非可写就绪(比如write收到 EAGAIN)后,epoll_wait才可能继续收到可写就绪通知(比如有空闲可写缓存)
  其实ET相对于LT来说,把文件描述符状态跟踪的部分责任由内核空间推到用户空间,内核只关心状态切换即从未就绪到就绪切换时才通知用户,至于保持就绪 状态的,内核不再通知用户,这样在实现非阻塞模型时更方便,不需要每次操作都先查看文件描述符状态。上述多数内容取自man epoll

10.redis 持久化 RDB

RDB使用的是:fork(系统调用)和copy on write(内核机制)

RDB会要是用fork()创建一个子进程,子进程记录的是创建时间节点的数据。

copy on write: 写时复制

在fork子进程的时候,只拷贝指针,并不发生内存的复制。
只有当其中的某一个进程试图对该区域进行写操作时,内核就会在物理存储器中为子进程开辟一个新的物理页面,将需要写的区域将父进程的内容复制一份给子进程,然后对新的物理页面进行写操作。
这时就是实现了对不同进程的操作而不会产生影响其他的进程,同时也节省了很多的物理存储器。
并且根据经验来看,不可能父子进程将所有数据都改一遍。下图redis也用了这个机制,而且redis的子进程不会去修改数据:

11.快照(RDB)保存过程:

  1. redis调用fork,现在有了子进程和父进程。
  2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
  3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(fork一个进程入内在也被复制了,即内存会是原来的两倍)。

12.redis RDB持久化中save和bgsave区别


SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。 比较适合关机维护

BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。
Save是阻塞方式的;bgsave是非阻塞方式的。

13.AOF持久化

4.0以前
1.如果开启了AOF只会用AOF恢复
2.重写操作删除抵消的命令合并重复的命令,最终也是一个纯指令的日志文件
4.以后
1.AOF中包含RDB全量,增加记录新的写操作
2.重写操作将老的数据RDB添加到aof文件中,将增量的指令的方式Append到AOF,AOF是一个混合体利用了RDB的快利用了日志的全量。也就是说包括了RDB也包括了AOF。
14.Redis过期键的删除策略
1. 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;
2. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;
3. 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则由算法决定。
15.redis的底层数据结构
1.String的底层实现:
// 用于记录buf数组中使用的字节的数目
  // 和SDS存储的字符串的长度相等  
	int len;    
  // 用于记录buf数组中没有使用的字节的数目   
	int free;    
  // 字节数组,用于储存字符串
	char buf[];   //buf的大小等于len+free+1,其中多余的1个字节是用来存储’\0’的。  

底层字符串特性?
     1).二进制安全(体现在len这个字段上)
     2).避免频繁的内存分配,进行内存得预分配(体现在上面扩容过程)
     3).兼容c语言函数库(其实底层都会加\0占一个字节作为字符串结尾)

2.哈希底层的实现:数组 + 链表(采用头插法解决冲突,不会像java语言的map一样转化为红黑树),redis会把kay、value封装成一个dictEntry的结构体(dictEntry的key为string类型,value是一个指针,指向一个redisObject对象(不像java语言一样把hashmap的key、value的具体值封装在一起))

      redis为什么要把value封装成一个redisObject对象?

      因为redis支持value的值有多种不同的数据类型

3.list底层实现:底层是链表,有两个list,一个是ziplist,字面意是压缩列表,另一个是quicklist,字面意是快速列表,在redis中直接使用的是quicklist

4.set底层实现: Set是一个特殊的value为空的Hash。

5.zset底层实现:Zset底层是一种跳表SkipList数据结构(跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找,实质就是一种可以进行二分查找的有序链表)

用blender为模型贴图并在gazebo中显示 用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型 阅读详情

相关推荐

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

Redis深度解析:从基础到高级特性,剖析关键技术

Redis深度解析:从基础到高级特性,剖析关键技术

qq_62775328的博客 1295

ETL第八章无人售货机零售项目实践

ETL实战项目——无人售货机

m0_52058217的博客 4418

Redis 深度解析:从核心原理到生产实践

本文从 Redis 的核心数据结构、分布式机制、生产实践及源码原理等维度进行了深度解析,揭示了其在高并发场景下的性能优势与设计哲学。在实际应用中,需结合业务特点选择合适的数据结构、持久化策略与集群架构,并通过监控(如 Prometheus 采集redis_info指标)持续优化系统性能。云原生支持:更好地适配 Kubernetes 集群,实现自动化扩缩容多模数据支持:融合时序数据、地理空间数据等更多数据类型边缘计算:轻量化部署版本,满足边缘节点低延迟数据处理需求。

無言的博客 1132

Unity Hub报错The Hub as encountered a critical error and must close

如果注册表HKEY_LOCAL_MACHINE\SOFTWARE\Unity Technologies\这个目录下有Hub文件,直接删掉然后重装就可以。C:\Users\Administrator\AppData\Roaming\Unity 作者:SevenVee。HKEY_CURRENT_USER\Software\Unity 下所有项,尝试过,卸载重装,清除临时文件无果后,最终决定删除所有与Hub有关的文件。重装unity后可以打开了。结果:卸载重装后还是会出现此问题。结果:重装后还是无法解决。

qq_42345116的博客 3638

本地生成无限量的AI图像和视频——无需网络,无限制,本地人工智能图像和视频生成的实用指南

我们将使用ComfyUI,这是一个功能强大的基于节点的 AI 图像和视频生成可视化界面。如果您是 ComfyUI 的新手,请不要担心。ComfyUI是什么?ComfyUI 是一款可视化工具,可让您在自己的计算机上生成 AI 图像和视频。您无需一次性理解所有内容。在本指南中,我们将从现成的工作流程入手,逐步帮助您建立信心。乍一看,内容似乎很庞杂——但本指南将着重于:-简单的工作流程-预构建示例-最少的配置我想向你展示使用这个工具最简单的工作流程。

iCloudEnd的博客 1809

火遍全网的全干货“redis深度笔记”,竟出自腾讯云大神之手

前言 作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis,像亚马逊、谷歌、阿里、腾讯都要使用,可见精通Redis使用真的很有必要。 所以,今天则分享出腾讯云大神亲自码出的“redis深度笔记”,笔记内容没有讲一句废话,全篇看下来都是精华! 需要Redis深度笔记PDF版的,帮忙转发一下,关注后添加助理vx:yunduoa2019或扫描下图二维码,跟随助理指引自行获取

文章中资料均可获取,有需要请添加yunduoa2019即可 387

【GlobalMapper精品教程】073:像素到点(Pixels-to-Points)从无人机图像轻松生成点云

Global Mapper v19引入的新的像素到点工具使用摄影测量原理,从重叠图像生成高密度点云、正射影像及三维模型。它使LiDAR模块成为已经功能很强大的的必备Global Mapper扩展功能。打开GlobalmapperV25.1中文版,点击【Lidar分析】→【像素到点云】,如下所示:V25之前的版本点击工具条上的【像素到点】工具:打开工具,可以【使用向导选】,或者选择【使用主窗口】,都很简单。

智慧空间实验室 1977

Redis深入底层数据结构(万字详细)

发现主服务器下线的哨兵具有被选举权,要求其他哨兵为自己投票。每个哨兵都只有一票。当某个哨兵拥有半票以上,这哨兵将成为领头哨兵并进行故障迁移。

JJTX00的博客 1946

智能车图像处理19-进阶篇11--斜入十字补线

这篇文章主要讲述智能车竞赛中如何对于斜入十字进行补线操作。

taiyuezyh的博客 7488

复制幻灯片到另一个PPT编程

请确保将源PPT文件和目标PPT文件的文件名修改为你实际使用的文件名。运行上述代码后,目标PPT将包含源PPT中的所有幻灯片和形状。这里假设源PPT文件名为"source.pptx",目标PPT文件名为"target.pptx"。方法将每个幻灯片的布局添加到目标PPT中。是一个强大的库,可以用于创建、修改和操作PPT文件。要将一个PPT中的幻灯片复制到另一个PPT,可以使用Python的。这段代码遍历源PPT的每个幻灯片,并使用。步骤 3: 打开源PPT和目标PPT。这将保存修改后的目标PPT文件。

ByteSparkX的博客 1322

redis深度

redis的实现方式其实就是占坑,一般使用setnx(set if not exists)指令,只允许一个客户端占坑。如果del前有异常,导致del无法调用,就会使得锁得不到释放,就会死锁。所以考虑给锁加时间,例如加5s,哪怕有异常,5s后也释放set和expire不是原子操作,可能执行expire前出问题了,还是会死锁。而且这里不能使用事务来解决,例如线程A先用锁,线程B进来要锁,如果是事务,线程B没抢到锁,是不应该执行expire操作的。为解决这个问题,redis2.8之后加入了set指令扩展。

qq_43580675的博客 1002

YOLO26优化:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 368

使用Redis加速深度学习模型(Spring/Python/Redis)

在深度学习项目中使用redis 使用Redis的List数据类型做为缓存队列,并利用Redis的高速度,对大量的识别请求进行缓存,然后获取缓存的信息并投放到深度学习模型。利用内存数据库缓存机制将巨大的流量挡在了模型之前,有效减少了高峰期对模型服务器的负荷。

银湖冰河 3974

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Redis面试题深度解析

Redis作为高性能键值数据库,其核心优势体现在内存存储、单线程模型、I/O多路复用和高效数据结构设计。文章从四个维度深入解析Redis:1)基础特性,包括快速原因、数据类型实现和线程模型演进;2)持久化与内存管理机制,涵盖RDB/AOF持久化、内存淘汰策略和优化技术;3)集群与分布式方案,详细讲解主从复制、哨兵模式和Cluster模式;4)高级特性,如事务、Lua脚本和消息队列实现。特别对Redis 6.0的多线程I/O、混合持久化等新特性进行了技术剖析,为深度理解Redis架构设计和高性能实现提供了全面

weixin_39956506的博客 617

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis 深度历险(Redis安装)

前言 对于Redis的使用一直停留着仅会用和使用过的阶段,经历过Redis线上故障导致系统奔溃后,笔者认识到,对于任何在生产工程中使用的基础组件,必须做到知其然,知其所以然。但笔者水平有限,索性借助其他大牛的一些书籍,分享来夯实自己的基础,在Redis学习过程中,笔者看了钱老师的《Redis深度历险·核心原理与应用实战》这本书籍,里面提到了诸多之前未层接触,但非常有用的内容,在学习的过程中,笔者...

麦芒小蚱蜢的博客 349

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

讲解 Redis 的一篇深度好文!

讲解 Redis 的一篇深度好文!

qq_41490913的博客 192

Redis数据结构:机器学习和深度学习

1.背景介绍 Redis Data Structures: Machine Learning and Deep Learning 作者:禅与计算机程序设计艺术 背景介绍 1.1 Redis 简介 Redis(Remote Dictionary Server)是一个高性能Key-Value存储系统。它支持多种数据类型,包括String(字符串)、List(链表)、Set(集合)、Hash(...

AI天才研究院 796

【Redis】Redis集群深度解析

有了主从为什么还要集群?Gossip协议的逻辑很像“谣言扩散”——每个节点都像“传话的人”,周期性地把自己知道的信息传给其他节点,其他节点再继续传播,最终所有节点的信息会达成一致。它的优势是“去中心化”,没有单一的“监控节点”,避免了哨兵的“单点故障”风险。Redis集群不需要哨兵,而是靠Gossip协议和“节点投票”实现故障自动转移,具体处理逻辑分“从节点挂了”和“主节点挂了”两种情况。集群中有多个节点,节点之间需要实时同步“节点状态”(比如哪个节点存活、哪个槽由哪个节点负责),Redis用的是。

m0_73784704的博客 938

Redis深度介绍以及在不同语言下的使用

Redis是一个高性能内存数据库,支持多种数据结构,适用于缓存、排行榜等场景。文章介绍了Redis的核心特性,包括内存存储、持久化和分布式能力,并对比了其在Java(Jedis/Lettuce)和Python(redis-py)中的应用差异。Java适合高并发Web服务,Python更适合快速开发轻量级应用。最后总结了使用Redis的注意事项和安全建议。

weixin_67868534的博客 790

重点思维导图------redis深度历险

重点思维导图------redis深度历险 posted @ 2019-05-06 23:41 ff_d 阅读(...) 评论(...) 编辑 收藏

li_haoren的博客 1261

redis:Redis String类型底层实现深度解析

分配embstr连续内存。

weixin_43290370的博客 736

Redis Cluster 深度解析

数据分区是在集群创建的时候完成的。 数据分区(Data Partitioning)是分布式系统的核心设计之一,其本质是将数据集划分为多个子集分配到不同节点上。Redis 作为分布式缓存/数据库,主要通过三种分区策略实现数据分布。节点取余(Modular Hashing)是最简单的分区策略: 工作流程:优势:致命缺陷:一致性哈希(Consistent Hashing)将哈希空间组织为环形(通常0~2³²-1): 2. 数据定位机制 计算数据键的哈希值 在环上顺时针查找第一个节点 该节点即为数据归属节点 3

woshihlf的博客 1368

Redis深度历险——核心原理与应用实践

转自: https://www.toutiao.com/a6587193839872639496/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1533761453&app=news_article&ut...

南小瓜的专栏 272

面试还不懂 Redis?看这份腾讯云大神亲自码出的 Redis 深度笔记就够了

1.Redis 可以用来做什么?由 Redis 面试想到的Redis 可以做什么?2.Redis基础数据结构Redis 安装Redis 基础的数据结构容器型数据结构的通用规则关于 Redis 使用的一些思考1.分布式锁分布式锁超时问题可重入性2.延时队列异步消息队列?队列空了怎么办?队列延迟空闲连接自动断开锁冲突处理延时队列的实现进一步优化3.位图基本使用统计和查找魔术指令 bitfield使用方法pfadd 这个 pf 是什么意思?pfmerge 适合什么场合用?

m0_69632475的博客 1011

精准!搞定阿里Redis面试,看这份Redis深度笔记就够了

说实话,不懂Redis是很难跳槽的。我一朋友最近有个阿里的面试,Redis作为大厂面试的高频考点,所以我把这份Redis深度笔记推荐给了他。 果不其然,他今天跟我说这份Redis笔记帮他搞定了阿里Redis的面试题。我心想竟然这么有用不如在网上分享给大家。 由于篇幅限制就只能以截图主要内容的方式展示出来了,可以一键三联(点赞+收藏+关注)后直接添加微信:mxh5261 即可免费获取! 目录简介 基础 Redis 基础数据结构 应用 分布式锁 ...

javassb的博客 250
上一篇: spring Boot启动流程
下一篇: redis理论
我爱吃果冻
博客等级 码龄9年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值