摘要:看了大家的回答,发现很多人在讨论 Redis 究竟「是否适合」用做队列都发表了不同的看法。 我对 Redis 的研究也比较久,对于这个问题也做了深入研究,下面我来把这个问题真正解释清楚。 看完下面的内容,你不止知道 Redis 如何用作队列,还会对它的「优劣」、「适合的场景」有更加清晰的认识。 同时
阅读全文
摘要:1、做消费确认ACK比较麻烦2、不能做广播3、不能重复消费,一旦消费就会被删除4、不支持分组消费
阅读全文
摘要:限流 需求背景:同一用户1分钟内登录失败次数超过3次,页面添加验证码登录验证,也即是限流的思想。 常见的限流算法:固定窗口计数器;滑动窗口计数器;漏桶;令牌桶。本篇选择的滑动窗口计数器 redis zset特性 Redis 有序集合(sorted set)和集合(set)一样也是 string 类型
阅读全文
摘要:实现字典的方法有很多种: 最简单的就是使用链表或数组, 但是这种方式只适用于元素个数不多的情况下; 要兼顾高效和简单性,可以使用哈希表; 如果追求更为稳定的性能特征, 并且希望高效地实现排序操作的话, 则可以使用更为复杂的平衡树; 在众多可能的实现中, Redis 选择了高效且实现简单的哈希表作为字
阅读全文
摘要:前言 近来,分布式的问题被广泛提及,比如分布式事务、分布式框架、ZooKeeper、SpringCloud等等。本文先回顾锁的概念,再介绍分布式锁,以及如何用Redis来实现分布式锁。 一、锁的基本了解 首先,回顾一下我们工作学习中的锁的概念。 为什么要先讲锁再讲分布式锁呢? 我们都清楚,锁的作用是
阅读全文
摘要:对于读多写少的高并发场景,我们会经常使用缓存来进行优化。比如说支付宝的余额展示功能,实际上99%的时候都是查询,1%的请求是变更,所以,我们在这样的场景下,可以加入缓存,用户->余额 1.Redis缓存与数据一致性问题 那么基于上面的这个出发点,问题就来了,当用户的余额发生变化的时候,如何更新缓存中
阅读全文
摘要:整数集合(intset)并不是一个基础的数据结构,而是Redis自己设计的一种存储结构,是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis i就会使用整数集合作为集合键的底层实现。 一、整数集合实现# 整数集合(intset)是Redis用于保存整数值的集
阅读全文
摘要:之前的文章我们曾总结到了Redis数据结构——链表和Redis数据结构——压缩列表这两种数据结构,他们是Redis List(列表)对象的底层实现方式。但是考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都
阅读全文
摘要:Redis链表为双向无环链表! Redis之数据结构——简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构来操作内存,并且简单介绍了Redis简单动态字符串。本篇文章我们继续来分析链表。 链表是一种非常常见的数据结构,在Redis中使
阅读全文
摘要:同整数集合一样压缩列表也不是基础数据结构,而是 Redis 自己设计的一种数据存储结构。它有点儿类似数组,通过一片连续的内存空间,来存储数据。不过,它跟数组不同的一点是,它允许存储的数据大小不同。 一、压缩列表# 听到“压缩”两个字,直观的反应就是节省内存。之所以说这种存储结构节省内存,是相较于数组
阅读全文
摘要:相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用。这个对象系统包括字符串对象,哈希对象,列表对象,集合对象,有序集合对象等。但是Redis面向内存并没有直接使用这些对象。而是使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列
阅读全文
摘要:跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。这么说,我们可能很难理解,我们可以先回忆一下链表。 一、复习跳跃表# 1.1 什么是跳跃表# 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表
阅读全文
摘要:https://blog.csdn.net/y277an/article/details/98342442 为了接下来一篇博客,能使读者更加完整地学习线程模型,所以本文对Redis的线程模型进行必要的讲解。 由于《Redis设计与实现》对于Redis的讲解简练优雅,所以本文大部分内容节选自本书,也欢
阅读全文
摘要:如大家众所周知,redis有string、list、hash、set、zset五种数据类型,但是大家对于每种数据类型的底层存储数据结构,可能还不是很清楚,在下面这篇文章中,主要讲述一下redis底层存储的7中数据类型。 1、简单动态字符串(SDS)(摘自redis设计与实现第二章) 由于C语言字符串
阅读全文
摘要:五种对象对应的 RedisObject 字符串对象(string) 字符串对象的 encoding 有三种,分别是:int、raw、embstr。 如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置
阅读全文
摘要:如上一篇文章所述,介绍了redis底层的几种数据类型(简单动态字符串SDS、双端连表、字典、压缩列表、整数集合等),但是在redis并没有直接使用这些数据类型实现键值对数据库,redis是在基础数据类型的基础上又封装了一层,实现了一个包含了五种数据结构类型的统一对象。 每次在redis中创建一个键值
阅读全文
摘要:本文围绕以下几点进行阐述 1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并
阅读全文