![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis
文章平均质量分 70
redis源码解析
雪*夹雨夹*雪
这个作者很懒,什么都没留下…
展开
-
redis-plus-plus使用说明
概述Redis-plus-plus是一个基于hiRedis的Redis客户端,是用C++ 11 / C++ 17编写。特性 支持大部分的Redis命令 连接池 Redis脚本 线程安全除非另有说明 发布订阅 管道 事务 集群 哨兵 类似STL的接口 通用命令行接口 安装安装hiRedis因为redis-plus-plu是基于hiRedis的,所以必须先安装hiRedis。支持的hiR原创 2021-08-25 20:09:55 · 7447 阅读 · 4 评论 -
简单字符串正则表达式匹配实现代码
代码来源于Redis源码,能匹配简单的正则表达式,支持“*”,“?”,"[],"\\"#include <ctype.h>#include <string.h>/* Glob - style pattern matching. */int stringmatchlen(const char* pattern, int patternLen, const char* string, int stringLen, int nocase){ wh原创 2021-07-17 18:23:07 · 153 阅读 · 0 评论 -
Redis skiplists跳表
跳表是建立在普通有序链表之上的一种一种概率数据结构。可以理解为加了索引的有序链表。这里打个比方,假如把普通有序链表比作是普通公交车,因为每个公交站都停一下所以如果站比较多得时候肯定会很慢;那么跳表就相当于是特快大巴,它不会每个站都停,而是会跳过一些站点每隔几个站才停一下,显然特快大巴速度更快。我们在一个有序链表中搜索一个元素的时候,即使链表已经排好序但是也不能使用二分查找法,必须挨个节点去遍历,算法复杂度是O(n),性能太低。而跳表就是为了解决这个问题,它的搜索复杂度能达到O(log n),能够..原创 2021-02-18 15:05:10 · 110 阅读 · 0 评论 -
Redis分区
分区的定义和意义分区是将数据拆分到多个Redis实例的过程,因此每个实例将只包含所有键的一个子集。对Redis进行分区有两个主要目标:它允许使用多台计算机的内存总和来创建更大的数据库。 如果不进行分区,则只能使用一台计算机可以支持的内存量,而一台计算机的内存是有限的。 它允许将计算能力扩展到多核和多台计算机,并将网络带宽扩展到多台计算机和网络适配器。范围分区架设我们有四个Redis实例R0,R1,R2,R3和许多表示用户的键,例如user:1,user:2,...等,我们可以使用不同的.原创 2021-02-17 21:02:26 · 54 阅读 · 0 评论 -
redis RESP协议
Redis协议规范 Redis客户端是通过一个称为RESP(Redis Serialization Protocol序列化协议)的协议与Redis服务器进行通信。 虽然这个协议是专门为Redis设计的,但它可以用于其他客户端-服务器软件项目。RESP的设计主要遵循这几个原则:易于实施 快速解析 人类可读RESP能够序列化不同类型的数据,比如整形数,字符串,数组,以及错误类型 。客户端将请求以字符串数组的形式发送到Redis服务器,这些字符串表示要执行的命令的参数。Redis服务...原创 2021-02-17 01:49:12 · 326 阅读 · 0 评论 -
使用pipeline加速Redis查询
redis pipelineredis是一个client- server模式的TCP服务器,一个请求的完成过程通常包括这几步:client客户端发送一个请求到服务器,然后在socket的read调用中等待读取服务器的响应数据;server服务器收到请求后执行命令然后将响应数据返回给客户端。客户端和服务器是通过网络链路来建立连接,网络链路可能很快,比如本地环回链路;也可能很慢,比如两个主机之间的网络链路要经过很多跳(经过很多路由)。不管网络时延有多大,数据包从客户端发送到服务器,然后数据包携带响应又从原创 2021-02-14 23:04:58 · 167 阅读 · 0 评论 -
redis事务的ACID特性
redis事务的ACID特性事务的ACID特性分别指的是:原子性(Atomicity),一致性(Consistency)和隔离性(Isolation),持久性(Durability)。原子性事务的原子性是指一个事务必须是像原子一样不可分割的最小工作单元,整个事务的所有操作要么全部执行成功,要么全都不执行,不可能只执行其中一部分。一致性数据库总是从一个一致性的状态迁移到另一个一致性状态。...原创 2021-02-09 01:22:26 · 419 阅读 · 0 评论 -
redis Hotkey和缓存雪崩,缓存击穿
缓存击穿是指,如果对某个热点数据的大量请求无法在缓存中进行处理,那么这些请求一下子都要到后端数据库去请求数据,导致了底层数据库压力激增,进而影响数据库处理其他请求。这种情况,经常发生在热点数据过期失效的时候,如下图所示:问题的主要原因是某个热点的key失效了,导致大并发集中打在数据库上。所以要从两个方面解决,延长热点key的过期时间或者设置永不过期,避免热点数据失效; 利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的这个数据,同时一旦查到数据就马上缓存至Redis内,避免其他大量请求.原创 2021-02-04 23:01:20 · 291 阅读 · 0 评论 -
epoll API解析及在redis中的应用
本文主要参考https://man7.org/index.html这个Linux/unix线上操作手册。epollepoll API的功能和select,poll等多路io复用接口类似,是用来监听多个文件描述是否有io事件发生。epoll API的核心概念是epoll实体,从用户空间的的角度来看,epoll实体是操作系统内核的一个数据结构,可以先简单的认为它包含有两个链表:interest list,或者叫epoll set,即epoll监听事件集合,是用来保存epoll实体所有监听的文件..原创 2021-01-30 16:51:27 · 259 阅读 · 0 评论 -
redis分布式锁redlock算法问题的一些思考
单节点锁,主从拷贝模式下的锁失效问题:1.客户端A从master上获取了锁。2.master在将锁所用的key同步到slave之前发生崩溃。(即redis以异步方式进行备份)3.slave转变成为master。4.此时客户端B发送请求获取锁,并且成功获取。但是此时客户单A同样拥有此锁,违背了排他性原则,也即不正确了。锁过期问题RedLock中,为了防止死锁,锁是具有过期时间的。这个过期时间被 Martin 抓住了小辫子。如果 Client 1 在持有锁的时候,发生..原创 2021-01-24 23:08:12 · 688 阅读 · 2 评论 -
redis HyperLogLog原理
伯努利试验(Bernoulli experiment)是指在同样的条件下重复地、相互独立地进行的一种随机试验,其特点是该随机试验只有两种可能结果:发生或者不发生。比如抛硬币,只有正面反面两种结果。在介绍 HyperLogLog 之前,我们可以考虑这样一个游戏:不断抛硬币,直到第一次出现正面朝上,记录总共抛了多少次。这个游戏中,假如在某次场景下,前3次都是反面,第4次正面,问这个概率是多少?这个很简单,那么相当于平均需要玩=16次这个游戏才会出现这种场景。反过来说,如果某次游戏要抛到第4次才第一次出现.原创 2021-01-24 01:15:31 · 569 阅读 · 0 评论 -
redis分布式锁redLock算法实现
首先来讲一下单节点上锁对于单机单节点来说,一个锁可以用一个约定好的key来表示。如果key值为0,则表示目前没有线程占有锁; 如果key值为1,则表示已经有线程占有锁。一个线程调用加锁操作时,其实就是检查锁变量是否为0。如果是0,就把锁的变量值设置为1,表示已经占有了这个锁。如果不是0,说明这个锁已经被其它线程占有,则返回错误信息。当使用完毕时要释放锁,就是说要把锁变量值设置为0,这样其它线程就可以占有锁。所以我们可以使用setnx命令来实现这个方案,这个命令在执行时会判断键值对是否存在,如果不原创 2021-01-18 01:12:49 · 308 阅读 · 0 评论 -
redis事件模型源码分析2:aeEvent模型
redis服务器在上电完成初始化后会循环处理时间事件和文件事件。/* * 事件处理器的主循环 */void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { // 如果有需要在事件处理前执行的函数,那么运行它 if (eventLoop->beforesleep != NULL) event原创 2021-01-17 16:19:00 · 313 阅读 · 0 评论 -
redis事件模型源码分析1:事件类型
redis服务器是以事件作为驱动的,事件包含有两种类型:文件事件和时间事件。文件事件:redis服务器和客户端是通过套接字socket进行连接。在Linux系统中一切皆文件,套接字也是一种文件。redis中的文件事件就是指套接字事件,redis服务器是通过监听并处理这些事件来进行网络通信操作。时间事件:redis服务器中的很多操作是需要定时执行的,时间事件可以理解为定时器事件。比如serverCron函数就是在定时器中执行,它根据配置文件中的hz参数来决定执行频率,默认是没秒执行10次(hz默...原创 2021-01-17 15:28:47 · 99 阅读 · 2 评论 -
redis后台线程BIO源码分析2
redis的简单介绍见上一篇博客。biobio类型,这里先用3.0版本的源码分析,3.0版本只有两种bio类型。到4.0版本才加入惰性删除。/* Background job opcodes */#define BIO_CLOSE_FILE 0 /* Deferred close(2) syscall. */#define BIO_AOF_FSYNC 1 /* Deferred AOF fsync. */#define BIO_NUM_OPS 2可以把bio模型理解为原创 2021-01-17 01:02:47 · 193 阅读 · 0 评论 -
redis后台线程BIO源码分析1-使用后台线程的场景
BIO即background I/O service,后台I/O服务,redis将一些可能会堵塞主线程的操作放到后台线程去执行。我们通常说redis是单线程的,但是redis并不是单线程的,单线程指的是redis的主要任务单线程的。redis的主线程主要是处理网络IO、命令执行、定时器任务。目前,7.0版本,redis的后台IO任务有3个:关闭文件描述符close(2)系统调用、AOF磁盘同步fsync,大键bigkey惰性删除。/* Background job opcodes */#define原创 2021-01-16 21:14:26 · 361 阅读 · 0 评论 -
redis的堵塞操作及处理
redis的网络io和键值对读写都是在主线程中完成,如果主线程上的某个操作耗时很长的话就会导致主线程堵塞。下面这张列出了可能会导致redis堵塞的几个点。redis是如何处理这几种场景避免堵塞呢?初略总结大概有这几种种方案:多线程,多进程,io多路复用,渐进式处理。方案场景多线程大键删除,AOF磁盘同步,文件删除,网络io(7.0版本)多进程RDB,AOF重写IO多路复用网络IO渐进式处理哈希扩容收缩rehash,槽位迁移,过期键删除,数据原创 2021-01-16 14:17:21 · 1237 阅读 · 1 评论 -
redis学习笔记-clusterSendPing
redis集群中节点通过gossip协议来交换信息,具体是通过ping消息来实现,主要逻辑是在clusterSendPing函数实现ping消息每次携带的gossip节点数为1/10的节点数,最少携带三个三个节点。wanted = floor(dictSize(server.cluster->nodes)/10); if (wanted < 3) wanted = 3; if (wanted > freshnodes) wanted = freshnodes;为什么原创 2021-01-04 00:49:46 · 378 阅读 · 0 评论 -
Redis-plus-plus学习笔记-cluster模式命令发送
cluster模式的命令发送接口如下,和普通命令发送接口的区别主要有几点1,当命令返回一个io错误IoError的时候,有可能是主节点已经下线,这时候从节点会被晋升为主节点。往一个旧的的主节点发送命令就会返回一个IoError错误,这种情况下需要更新槽位映射关系;2,如果一个节点已被移除,再往这个节点发送命令也会返回一个错误-ClosedError,这时也需要重新更新槽位映射;3,对重定向MovedError错误的处理,发生这个错误意味着槽位映射出错了,所以也要更新槽位映射;4,aski错误,这种情原创 2021-01-03 23:40:02 · 1743 阅读 · 0 评论 -
Redis学习笔记-TCP连接处理器acceptTcpHandler
Redis在初始化阶段会为每个监听fd注册一个连接处理器,当AeEvent多路io复用模块检测到监听socket收到数据之后就会调用这个处理器–acceptTcpHandler。void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask) { int cport, cfd, max = MAX_ACCEPTS_PER_CALL; char cip[REDIS_IP_STR_LEN]; REDIS_N原创 2021-01-03 23:14:54 · 841 阅读 · 0 评论