Redis
文章平均质量分 90
本专栏的特色是:
带有丰富的图示和表格, 帮助读者更好地理解书中的知识点。
关注功能的高层设计思路而不是底层的实现代码, 让读者无须花时间研读代码就可以了解到 Redis 的内部实现。
提供带有中文注释的 Redis 源码, 帮助有需要的读者做进一步的学习。
奔走的蚂蚁~
这个作者很懒,什么都没留下…
展开
-
秒杀场景:如何通过 Redis 减库存?
Redis扣库存,主要目的是减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来的时候,大量的读取数据有可能会导致数据库的崩溃。系统初始化的时候,将商品库存加载到 Redis 缓存中保存收到请求的时候 , 现在 Redis 中拿到该商品的库存值,进行库存预减,如果减完之后库存不足,直接返回逻辑 Exception 就不需要访问数据库再去减库存了,如果库存值正确,进行下一步。原创 2024-05-30 09:11:59 · 282 阅读 · 0 评论 -
Redis 击穿、穿透、雪崩产生原因以及解决思路
大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,比如当缓存中某一个热点key失效。原创 2024-05-29 09:36:36 · 629 阅读 · 0 评论 -
面试官:Redis 用的多?那你说说他的内存使用和优化吧
对于redis来说,什么是最重要的?毋庸置疑,是内存。原创 2024-05-27 09:26:44 · 1040 阅读 · 0 评论 -
Redis20种使用场景
文章目录1缓存2抽奖3Set实现点赞/收藏功能4排行榜5PV统计(incr自增计数)6UV统计(HeyperLogLog)7去重(BloomFiler)8用户签到(BitMap)9GEO搜附近10简单限流11全局ID12简单分布式锁13认识的人/好友推荐14发布/订阅15消息队列16数据共享(session共享)17商品筛选18购物车19定时取消订单(key过期监听)20物流信息(时间线)后端程序员,不管是出去面试,还是当面试官,Redis几乎是100%会问到的技术点;究其原因,主要是因为他实在过于强大、原创 2024-05-10 11:02:12 · 831 阅读 · 0 评论 -
Redis 基础之常用数据类型及命令
Redis 比 Memcached 更优秀的地方之一就是支持更丰富的数据类型Redis 支持七种数据类型1、 string(字符串);2、 hash(哈希);3、 list(列表);4、 set(集合);5、 zset(sortedset:有序集合);6、 Bitmaps(位图);7、 HyperLogLogs(基数统计);原创 2024-05-10 09:49:26 · 1114 阅读 · 0 评论 -
Redis 基础之Redis 配置
Redis 提供了很多配置选项来优化 Redis 服务Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf可以通过 Redis CONFIG 命令查看或设置配置项Redis CONFIG GET 命令语法格式。原创 2024-05-09 09:48:11 · 787 阅读 · 0 评论 -
Redis 实战之监视器
客户端可以通过执行 MONITOR 命令, 将客户端转换成监视器, 接收并打印服务器处理的每个命令请求的相关信息。当一个客户端从普通客户端变为监视器时, 该客户端的 REDIS_MONITOR 标识会被打开。服务器将所有监视器都记录在 monitors 链表中。每次处理命令请求时, 服务器都会遍历 monitors 链表, 将相关信息发送给监视器。原创 2024-05-09 09:32:22 · 421 阅读 · 0 评论 -
Redis 实战 之慢查询日志功能
Redis 的慢查询日志功能用于记录执行时间超过指定时长的命令。Redis 服务器将所有的慢查询日志保存在服务器状态的 slowlog 链表中, 每个链表节点都包含一个 slowlogEntry 结构, 每个slowlogEntry 结构代表一条慢查询日志。打印和删除慢查询日志可以通过遍历 slowlog 链表来完成。slowlog 链表的长度就是服务器所保存慢查询日志的数量。原创 2024-05-08 09:28:13 · 1034 阅读 · 0 评论 -
Redis 实战之创建并修改 Lua 环境
Redis 服务器在启动时, 会对内嵌的 Lua 环境执行一系列修改操作, 从而确保内嵌的 Lua 环境可以满足 Redis 在功能性、安全性等方面的需要。Redis 服务器专门使用一个伪客户端来执行 Lua 脚本中包含的 Redis 命令。Redis 使用脚本字典来保存所有被 EVAL 命令执行过, 或者被 SCRIPT_LOAD 命令载入过的 Lua 脚本, 这些脚本可以用于实现SCRIPT_EXISTS 命令, 以及实现脚本复制功能。原创 2024-05-08 09:15:41 · 1171 阅读 · 0 评论 -
Redis 实战之事务的实现
事务提供了一种将多个命令打包, 然后一次性、有序地执行的机制。多个命令会被入队到事务队列中, 然后按先进先出( FIFO )的顺序执行。事务在执行过程中不会被中断, 当事务队列中的所有命令都被执行完毕之后, 事务才会结束。带有 WATCH 命令的事务会将客户端和被监视的键在数据库的 watched_keys 字典中进行关联, 当键被修改时, 程序会将所有监视被修改键的客户端的 REDIS_DIRTY_CAS 标志打开。原创 2024-05-07 09:28:21 · 926 阅读 · 0 评论 -
Redis 实战之命令请求的执行过程
一个命令请求从发送到完成主要包括以下步骤: 1. 客户端将命令请求发送给服务器;2. 服务器读取命令请求,并分析出命令参数;3. 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复;4. 服务器将命令回复返回给客户端。serverCron 函数默认每隔 100 毫秒执行一次, 它的工作主要包括更新服务器状态信息, 处理服务器接收的 SIGTERM 信号, 管理客户端资源和数据库状态, 检查并执行持久化操作, 等等。原创 2024-05-07 09:18:43 · 1152 阅读 · 0 评论 -
Redis 实战之客户端属性
服务器状态结构使用 clients 链表连接起多个客户端状态, 新添加的客户端状态会被放到链表的末尾。客户端状态的 flags 属性使用不同标志来表示客户端的角色, 以及客户端当前所处的状态。输入缓冲区记录了客户端发送的命令请求, 这个缓冲区的大小不能超过 1 GB。命令的参数和参数个数会被记录在客户端状态的 argv 和 argc 属性里面, 而 cmd 属性则记录了客户端要执行命令的实现函数。原创 2024-05-06 09:54:26 · 836 阅读 · 0 评论 -
Redis 实战之文件事件
Redis 服务器是一个事件驱动程序, 服务器处理的事件分为时间事件和文件事件两类。文件事件处理器是基于 Reactor 模式实现的网络通讯程序。文件事件是对套接字操作的抽象: 每次套接字变得可应答(acceptable)、可写(writable)或者可读(readable)时, 相应的文件事件就会产生。文件事件分为 AE_READABLE 事件(读事件)和 AE_WRITABLE 事件(写事件)两类。原创 2024-05-06 09:37:21 · 1498 阅读 · 0 评论 -
Redis 实战之RDB文件结构
RDB 文件用于保存和还原 Redis 服务器所有数据库中的所有键值对数据。SAVE 命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器。BGSAVE 命令由子进程执行保存操作,所以该命令不会阻塞服务器。服务器状态中会保存所有用 save 选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执行 BGSAVE 命令。RDB 文件是一个经过压缩的二进制文件,由多个部分组成。对于不同类型的键值对, RDB 文件会使用不同的方式来保存它们。原创 2024-05-05 11:25:51 · 1089 阅读 · 0 评论 -
Redis 实战之数据库键空间
因为数据库的键空间是一个字典, 所以所有针对数据库的操作 —— 比如添加一个键值对到数据库, 或者从数据库中删除一个键值对, 又或者在数据库中获取某个键值对, 等等, 实际上都是通过对键空间字典进行操作来实现的, 以下几个小节将分别介绍数据库的添加、删除、更新、取值等操作的实现原理。原创 2024-05-05 11:03:16 · 711 阅读 · 0 评论 -
Redis 实战之对象
Redis 数据库中的每个键值对的键和值都是一个对象。Redis 共有字符串、列表、哈希、集合、有序集合五种类型的对象, 每种类型的对象至少都有两种或以上的编码方式, 不同的编码可以在不同的使用场景上优化对象的使用效率。服务器在执行某些命令之前, 会先检查给定键的类型能否执行指定的命令, 而检查一个键的类型就是检查键的值对象的类型。Redis 的对象系统带有引用计数实现的内存回收机制, 当一个对象不再被使用时, 该对象所占用的内存就会被自动释放。Redis 会共享值为 0 到 9999 的字符串对象。原创 2024-05-04 10:21:28 · 1159 阅读 · 0 评论 -
Redis 实战之压缩列表
压缩列表是一种为节约内存而开发的顺序型数据结构。压缩列表被用作列表键和哈希键的底层实现之一。压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值。添加新节点到压缩列表, 或者从压缩列表中删除节点, 可能会引发连锁更新操作, 但这种操作出现的几率并不高。原创 2024-05-04 09:38:05 · 1245 阅读 · 0 评论 -
Redis 实战3
1、跳跃表跳跃表是有序集合的底层实现之一, 除此之外它在 Redis 中没有其他应用。Redis 的跳跃表实现由 zskiplist 和 zskiplistNode 两个结构组成, 其中 zskiplist 用于保存跳跃表信息(比如表头节点、表尾节点、长度), 而 zskiplistNode 则用于表示跳跃表节点。每个跳跃表节点的层高都是 1 至 32 之间的随机数。在同一个跳跃表中, 多个节点可以包含相同的分值, 但每个节点的成员对象必须是唯一的。原创 2024-05-03 10:36:24 · 1473 阅读 · 0 评论 -
Redis 实战2
字典被广泛用于实现 Redis 的各种功能, 其中包括数据库和哈希键。Redis 中的字典使用哈希表作为底层实现, 每个字典带有两个哈希表, 一个用于平时使用, 另一个仅在进行 rehash 时使用。当字典被用作数据库的底层实现, 或者哈希键的底层实现时, Redis 使用 MurmurHash2 算法来计算键的哈希值。哈希表使用链地址法来解决键冲突, 被分配到同一个索引上的多个键值对会连接成一个单向链表。原创 2024-05-03 10:16:28 · 1076 阅读 · 0 评论 -
Redis 实战1
/ 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len;// 记录 buf 数组中未使用字节的数量 int free;// 字节数组,用于保存字符串 char buf [ ];图2-1 展示了一个 SDS 示例:free 属性的值为 0 , 表示这个 SDS 没有分配任何未使用空间。len 属性的值为 5 , 表示这个 SDS 保存了一个五字节长的字符串。原创 2024-05-02 10:05:01 · 959 阅读 · 0 评论