[TOC] 基础概念 为什么要区分内核空间和用户空间? 早期是不区分内核和用户的,带来的问题是程序可以访问任意内存空间,如果程序不稳定,容易把系统搞崩溃。 后来按cpu指令的重要程度对指令进行了分级,一共4个级别:Ring0~Ring3,linux只使用了Ring0和Ring3两个级别; 用户态使用Ring3级别运行,只访问用户空间,Ring0运行在内核态,可以访问任何程序空间 内核空间 linux系统内核运行的空间 主要提供进程调度、内存分配、连接硬件资源等 用户空间 提供给应用程序的空间 不具备访问内核空间资源…

2022/08/04 0条评论 826点热度 0人点赞 阅读全文

前段时间给小伙伴分享redis,顺带又把redis撸了一遍了,对其源码,又有了比较深入的了解。(ps: 分享的文章再丰富下再放出来)。 数据结构 我们先看下redis 5.0的代码。本次讲解主要是zset中的跳表。压缩列表不做讲解 /** * 跳跃表节点 */ typedef struct zskiplistNode { //member对象 sds ele; //权重分值 double score; //后退指针 struct zskiplistNode *backward; //层级描述 struct zski…

2022/07/31 0条评论 865点热度 0人点赞 阅读全文

哨兵 redis sentinel用于管理多个redis实例,是redis高可用的解决方案之一,其本身也是分布式架构。 哨兵本身是监听者身份,没有存储功能,哨兵的服务角色及交互 哨兵与主服务 哨兵与从服务 哨兵与哨兵 哨兵的功能 集群监控 检查对应的主从集群是否正常运行(心跳机制) 消息通知 同步sentinel和其他redis的相关信息(特别是某个服务出现问题时) 故障转移 当主从结构中主节点故障了,如果判断为客观下线,哨兵会发起故障转移,保证服务的高可用 配置中心 给客户端提供最新的master地址 名称解析 …

2022/01/28 0条评论 1111点热度 0人点赞 阅读全文

在之前的redis源码阅读三-终于把主线任务执行搞明白了和redis源码阅读五-为什么大量过期key会阻塞redis?梳理了redis的整体处理流程和redis的定期清理。都没有说到redis的过期策略。这次我来探究一下。 我们都知道redis的缓存淘汰策略有以下几种: noeviction 无过期策略,内存满了就直接异常 volatile-lru 对有过期时间的key进行lru淘汰(越长时间没有被访问,越容易被淘汰) allkeys-lru 对全局的key按LRU进行淘汰(越长时间没有被访问,越容易被淘汰) vo…

2021/12/24 0条评论 889点热度 0人点赞 阅读全文

在之前的 redis的key过期了还能取出来?,在这里对key的过期策略进行了简单的分析,惰性过期和定期过期,对定期清理这块讲的并不透彻,这次来根据源码分析下。 先上下逻辑,此逻辑图根据redis官方5.0分支梳理。 定期过期-慢循环 在redis源码阅读二-终于把redis的启动流程搞明白了这一文中。 我们知道redis启动会注册一个Time Event 事件,里面的执行逻辑是:serverCron 在server.c中,其中databaseCron()函数中会调用慢循环进行过期key清理。 int server…

2021/12/20 0条评论 889点热度 0人点赞 阅读全文

之前分析了通过redis源码阅读二-终于把redis的启动流程搞明白了分析了redis的启动流程,通过redis源码阅读三-终于把主线任务执行搞明白了分析了redis的主线任务,这次从redis6.2分支上分析redis6的io多线程。 我注释的代码主要在redis5.0分支上。6.2上注释的比较少。 https://github.com/yxkong/redis/tree/6.2 https://github.com/yxkong/redis/tree/5.0 acceptTcpHandler处理的差异 虽然最终…

2021/12/16 0条评论 934点热度 0人点赞 阅读全文

在redis源码阅读二-终于把redis的启动流程搞明白了 介绍redis的启动流程,也画了一张图。今天我来详细讲解下redis的主线任务是怎么执行的。 我们先看一下流程图 在redis的主线任务里,主要有三大块: eventLoop->beforesleep 创建回调的写事件并绑定处理器sendReplyToClient,在handleClientsWithPendingWrites aeProcessEvents 执行整主流程,主要功能 从epoll读取fd,将读取的数据写入server.clients …

2021/12/14 0条评论 804点热度 0人点赞 阅读全文

阅读redis的源码永远也绕不过它的启动。我们来看下redis的启动流程。不想看代码可以直接看最后的流程图。 以下源码分析是redis的5.0分支 源码注释:https://github.com/yxkong/redis/commits/5.0 这是启动流程的核心代码。 int main(int argc, char **argv) { //申请空间oom后的处理器 zmalloc_set_oom_handler(redisOutOfMemoryHandler); //哨兵模式 server.sentinel_mo…

2021/12/10 0条评论 911点热度 0人点赞 阅读全文

准备工作 安装visual studio code 下载地址 https://visualstudio.microsoft.com/zh-hans/vs/ fork源码redis源码 https://github.com/redis/redis 下载源码(方便注释) 比如我的 git clone https://github.com/yxkong/redis 使用vs code 打开源码 安装插件 C/C++ C/C++ Extension Pack Better C++ Syntax GitLens — Git …

2021/12/08 0条评论 1128点热度 0人点赞 阅读全文

我记得在2016年,2017年的时候,我们使用2.8的集群。当时业务有个需求,要求某个接口一天调用不能超过1000次,当时开发使用一个key: biz:total 来限制。 当时出现的问题是,第二天,接口实际调用量为0,但是从redis里获取到的值还是1000。 当时直接问的阿里云技术支持,反馈这种情况有两种,一种是定期删除,没有达到删除条件,一种是cpu压力过大,不会执行删除策略。 当时也没有深究这个问题,就想了个解决方案,直接把key改为 每天一个的 key: biz20170125:total 来控量,算是解…

2021/12/01 0条评论 1170点热度 0人点赞 阅读全文
12