瘦弱的皮卡丘
2018
展开
-
什么是分布式锁?
目录一、前言二、为什么需要分布式锁?三、分布式锁怎么实现?四、如何避免死锁?五、锁被别人释放怎么办?六、锁过期时间不好评估怎么办?七、Redlock 真的安全吗?八、Redlock 的争论谁对谁错?九、分布式专家 Martin 对于 Relock 的质疑十、Redis 作者 Antirez 的反驳十一、基于 Zookeeper 的锁安全吗?十二、我对分布式锁的理解十三、总结一、前言下面这张图包含了本文的核心内容,并且我讲围绕下面这些问题进行撰写。原创 2022-01-11 17:12:11 · 147 阅读 · 0 评论 -
缓存和数据库的一致性问题
目录一、前言二、更新缓存1) 先更新缓存,后更新数据库2) 先更新数据库,后更新缓存三、删除缓存3) 先删除缓存,后更新数据库4) 先更新数据库,后删除缓存四、主从库延迟和延迟双删问题五、可以做到强一致吗?六、总结七、后记一、前言在讨论缓存和数据库的一致性问题之前,我们首先要明白: 写请求只写数据库 读请求先读缓存,如果缓存不存在,则从数据库读取,并重建缓存 同时,写入缓存中的数据,都设置失效时间 二、更新缓存再来看数原创 2022-01-11 16:25:57 · 142 阅读 · 0 评论 -
redis缓存相关问题
缓存穿透当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据,我们称这种现象为"缓存穿透"。缓存穿透会穿透Redis的保护,提升底层数据库的负载压力,同时这类穿透查询没有数据返回也造成了网络和计算资源的浪费。解决方案: 在接口访问层对用户做校验,如接口传参、登陆状态、n秒内访问接口的次数; 利用布隆过滤器,将数据库层有的数据key存储在位数组中,以判原创 2021-12-25 21:25:05 · 128 阅读 · 0 评论 -
Redis | 发布与订阅
目录一、前言二、频道的订阅与退订(1)订阅频道(2)退订频道三、模式的订阅与退订(1)订阅模式(2)退订模式四、发送消息(1)将消息发送给频道订阅者(2)将消息发送给模式订阅者五、查看订阅信息(1)PUBSUB CHANNELS(2)PUBSUB NUMSUB(3)PUBSUB NUMPAT一、前言Redis的发布与订阅功能由 PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行 SUBSCRIBE命令,...原创 2021-12-25 12:14:33 · 680 阅读 · 0 评论 -
Redis | 集群
目录一、前言二、节点(1)启动节点(2)集群数据结构(3)CLUSTER MEET命令的实现三、槽指派(1)什么是槽 (2)传播节点的槽指派信息(3)在集群中执行命令一、前言Redis集群是 Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。二、节点一个 Redis集群通常由多个节点组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一...原创 2021-12-10 18:40:04 · 345 阅读 · 0 评论 -
Redis | 哨兵模式-Sentinel
目录一、前言(1)什么是哨兵模式(2)示例(看懂这个示例特别重要)二、启动并初始化 Sentinel(1)初始化服务器(2)使用 Sentinel专用代码(3)初始化 Sentinel状态(4)初始化 Sentinel状态的 masters属性(5)创建连向主服务器的网络连接三、获取主服务器信息四、获取从服务器信息五、向主服务器和从服务器发送信息六、接收来自主服务器和从服务器的频道信息七、更新 sentinels字典八、创建连向其他 Sentin.原创 2021-12-07 14:17:10 · 643 阅读 · 0 评论 -
Redis | 服务器
目录一、前言二、初始化服务器(1)初始化服务器状态结构(2)载入配置选项(3)初始化服务器数据结构(4)还原数据库状态(5)执行事件循环三、命令请求的执行过程(1)发送命令请求(2)读取命令请求(3)命令执行器,查找命令实现(4)命令执行器,执行预备操作(5)命令执行器,调用命令的实现函数(6)命令执行器,执行后续工作(7)将命令回复发送给客户端(8)客户端接收并打印命令回复一、前言Redis服务器负责与多个客户端建立网...原创 2021-12-05 13:04:07 · 204 阅读 · 0 评论 -
Redis面经汇总(持续更新ing... ...)
2021.12.04一、Redis 有哪些特性? 读写性能优异, 读的速度是100000次/s,写的速度是80000次/s 数据持久化,支持RDB 、AOF两种持久化方式 支持事务。通过MULTI和EXEC指令包起来 支持多种数据结构类型 主从复制 其他特性:发布/订阅、通知、key过期等 二、Redis 为什么这么快? 完全基于内存,没有磁盘IO上的开销,异步持久化除外 单线程,避免多个线程切换的性能损耗 非阻塞.原创 2021-12-04 14:02:13 · 334 阅读 · 0 评论 -
Redis | 事务
目录一、前言二、事物的实现(1)事务开始(2)命令入队(3)事务队列(4)执行事务三、WATCH命令的实现(1)使用 WATCH命令监视数据库键(2)监视机制的触发(3)判断事务是否安全三、事务的ACID性质(1)原子性(2)一致性1.入队错误2.执行错误3.服务器停机(3)隔离性(4)持久性一、前言Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次...原创 2021-12-25 12:50:42 · 452 阅读 · 0 评论 -
Redis | AOF持久化
目录一、前言二、AOF持久化的实现(1)命令追加(2)AOF文件的写入与同步(3)AOF持久化的效率和安全性三、AOF文件的载入与数据还原四、AOF重写(1)AOF文件重写的实现(1)AOF后台重写一、前言除了RDB持久化功能之外, Redis还提供了AOF持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如下图所示:例如,如果我...原创 2021-12-02 14:42:50 · 327 阅读 · 0 评论 -
Redis | RDB持久化
目录一、前言二、RDB文件的创建与载入三、RDB文件结构(1)databases部分(2)key_value_pairs部分(3)value的编码一、前言因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。为了解决这个问题, Redis提供了RDB持久化功能,这个功能可以将 Redis在内存中的数...原创 2021-12-01 15:31:07 · 469 阅读 · 0 评论 -
Redis | Redis的过期键以及其删除策略
目录一、前言二、设置过期时间三、保存过期时间四、移除过期时间五、过期键的判断六、过期键删除策略(1)定时删除(2)惰性删除(3)定期删除七、Redis的过期键删除策略(1)惰性删除策略的实现(2)定期删除策略的实现一、前言通过一些特定命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。二、设置过期时间Redis有四个不同的命令可以用于...原创 2021-11-30 18:03:19 · 111 阅读 · 0 评论 -
Redis | 单机数据库的实现
目录一、服务器中的数据库二、数据库键空间(1)添加新键(2)删除键(3)更新键(4)取键取值三、读写键空间时的维护操作一、服务器中的数据库Redis服务器将所有数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb结构代表一个数据库:struct redisServer{ //... redisDb* db;//一个数组,保存着服务器中的所有数据库 ...原创 2021-11-29 12:03:33 · 160 阅读 · 0 评论 -
Redis | 哨兵模式-选举策略
目录一、检测主观下线二、检查客观下线状态三、选举领头 Sentinel四、故障转移(1)选出新的主服务器(2)修改从服务器的复制目标(3)将旧的主服务器变为从服务器一、检测主观下线在默认情况下, Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他 Sentinel在内)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。在下图展示的例子中,带箭头的连线显示了 Sentine...原创 2021-12-08 10:39:06 · 1057 阅读 · 0 评论 -
Redis | 什么是对象?
目录一、前言(1)什么是对象(2)使用对象的好处二、对象的类型与编码(1)类型(2)编码和底层实现(三)字符串对象(四)列表对象(五)哈希对象(六)集合对象(七)有序集合对象(八)类型检查与命令多态(九)内存回收(十)对象共享一、前言(1)什么是对象在前面的博文里,我们陆续介绍了 Redis用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等等。但Redis并没有直接使用这些数据结构来实...原创 2021-11-28 10:54:15 · 494 阅读 · 0 评论 -
Redis | 集合对象
集合对象的编码可以是 intset或者 hashtable。intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。例如:redis> SADD numbers 1 3 5OK另一方面, hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL。例如:redis> SAD Dfru...原创 2021-11-27 15:22:41 · 407 阅读 · 0 评论 -
Redis | 多机数据库的实现-主从复制
目录一、前言二、旧版复制功能的实现(1)同步(2)命令传播(3)旧版复制功能的缺陷三、新版复制功能的实现(1)复制偏移量(2)复制积压缓冲区(3)服务器运行|D三、复制的实现(1)设置主服务器的地址和端口(2)建立套接字连接(3)发送PING命令(4)身份验证(5)发送端口信息(6)同步(7)命令传播四、心跳检测(1)检测主从服务器的网络连接状态(2)辅助实现min-slaves配置选项(3)检测命令丢失一、前言..原创 2021-12-06 11:38:24 · 113 阅读 · 0 评论 -
Redis | 哈希对象
哈希对象的编码可以是ziplist或者 hashtable。ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推人到压缩列表表尾,因此保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后。 先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。例如:redis> HSE...原创 2021-11-26 15:41:40 · 531 阅读 · 0 评论 -
Redis | serverCron函数
目录一、前言二、serverCron函数做了哪些事(1)更新服务器时间缓存(2) 更新LRU时钟(3)更新服务器每秒执行命令次数(4)更新服务器内存峰值记录(5)处理 SIGTERM信号(6)管理客户端资源(7)管理数据库资源(8)执行被延迟的 BGREWRITEAOF(9)将AOF缓冲区中的内容写入AOF文件(10)关闭异步客户端(11)增加 cronloops计数器的值一、前言Redis服务器中的 serverCron函数默认每...原创 2021-11-25 18:57:36 · 400 阅读 · 0 评论 -
Redis | 列表对象
列表对象的编码可以是 ziplist或者linkedlist。例如,如果我们执行以下 RRUSH命令,那么服务器将创建一个列表对象作为 numbers键的值:redis> PRUSH number 1 "three" 5OK如果 numbers键的值对象使用的是ziplist编码,这个这个值对象将会是下图所示:如果我们使用linkedlist编码,那么 numbers键的值对象将是下图所示的样子:而 Stringob]ect字样下面的是字符串对象所保存的值。比如说,下.原创 2021-11-25 12:39:10 · 464 阅读 · 0 评论 -
Redis | 字符串对象
字符串对象的编码可以是:int raw embstr如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成long),并将字符串对象的编码设置为int。 例如,如果我们执行以下SET命令,那么服务器将创建一个如图所示的int编码的字符串对象作为number键的值:redis> SET number 10086OK如果字符串对象保...原创 2021-11-24 12:19:34 · 389 阅读 · 1 评论 -
Redis | 客户端
目录一、前言二、客户端的属性(1)套接字描述符(2)身份验证三、客户端的创建与关闭(1)创建普通客户端(2)关闭普通客户端(3)Lua脚本的伪客户端(4)AOF文件的伪客户端一、前言Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由IO多路复用技术实现的文件事件处理器,Reds服务器使用...原创 2021-12-04 11:01:48 · 580 阅读 · 0 评论 -
Redis | 有序集合对象
有序集合的编码可以是ziplist或者skiplist。ziplist编码的压缩列表对象使用压编列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,而第二个元素则保存元素的分值。压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值较大的元素则被放置在靠近表尾的方向。例如:redis> ZADD price 8.5 apple 5.0 banana 6.0 cherryOK...原创 2021-11-23 16:00:19 · 95 阅读 · 0 评论 -
Redis | 事件
目录一、前言二、文件事件(1)文件事件处理器的构成(2)一次完整的客户端与服务器连接事件示例三、时间事件四、时间事件应用实例五、事件的调度与执行一、前言Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件: Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件: Redis服务器中的一些操作...原创 2021-12-03 10:16:42 · 194 阅读 · 0 评论 -
Redis | 压缩列表
目录一、前言二、压缩列表的构成三、压缩列表节点的构成(1)previous_entry_length(2)encoding(3)content四、连锁更新一、前言压缩列表( ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么是小整数值,要么是长度比较短的字符串,那么 Redis就会使用压缩列表来做列表健的底层实现。另外,当一个哈希键只包含少量键值对,比且每个键值对的键和值要么是小整数...原创 2021-11-22 10:20:33 · 325 阅读 · 0 评论 -
Redis | 整数集合
目录一、前言二、整数集合的实现三、升级(1)何为升级(2)升级的好处四、降级一、前言整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis就会使用整数集合作为集合键的底层实现。二、整数集合的实现整数集合是 Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。typede...原创 2021-11-21 11:30:22 · 468 阅读 · 0 评论 -
Redis | 跳跃表
一、前言Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时, Redis就会使用跳跃表来作为有序集合键的底层实现。Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在 Redis里面没有其他用途。二、跳跃表的实现仅靠多个跳跃表节点就可以组成一个跳跃表typedef struct zskiplist...原创 2021-11-20 10:45:55 · 691 阅读 · 0 评论 -
Redis | 字典
目录一、前言二、字典的实现(1)哈希表(2)哈希表节点(3)字典1.向字典中添加一条新的数据2.解决哈希冲突三、rehash四、渐进式 rehash一、前言在字典中,一个键(key)可以和一个值( value)进行关联。这些关联的键和值就称为键值对。字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对,等等。字典在 Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现..原创 2021-11-19 18:13:14 · 519 阅读 · 0 评论 -
Redis | 双端链表
目录一、前言二、链表和链表节点的实现三、Redis的链表实现的特性一、前言链表在 Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时, Redis就会使用链表作为列表键的底层实现。除了链表键之外,发布与订阅、慢査询、监视器等功能也用到了链表, Redis服务器本身还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。二、链表和链表节点的实现...原创 2021-11-18 15:21:36 · 292 阅读 · 0 评论 -
Redis | 简单动态字符串(simple dynamic string)-SDS
目录一、引言二、SDS的定义三、为什么SDS比C字符串更适合于Redis(1)常数复杂度获取字符串长度(2)杜绝缓冲区溢出(3)减少修改字符串时带来的内存重分配次数1.空间预分配2.惰性空间释放(4)二进制安全(5)兼容部分C字符串函数四、SDS的用处五、总结一、引言Reds没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串( simple dynamic string,SDS)的抽象类原创 2021-11-15 15:03:09 · 406 阅读 · 0 评论 -
Redis | 事务
腾讯二面:Redis 事务支持 ACID 么?原创 2021-11-06 18:34:37 · 88 阅读 · 0 评论