标签: Redis

OOM | 2小时前 | Redis后端相关

Redis Stream 用做消息队列完美吗

Redis Stream 是 Redis 5.0 版本中引入的一种新的数据结构,用于实现消息传递的功能。 这篇文章,分享笔者学习 Redis Stream 的心得,希望对大家有所启发。 1 基础知识 Redis Stream 的结构如下图所示,它是一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容。 每个 Redis Stream 都有唯一的名称 ,对应唯一的 Redis Key 。 同一个 Stream 可以挂载多个 消费者组 ConsumerGroup , 消费组不能自动创建,需要 使用 XGROUP CREATE 命令创建 。 每个消费组会有个 游标 last_delivered_id ,任意一个消费者读取了消息...

 3 |  0 |  0 Redis后端相关

花小染 | 3周前 | Redis后端相关

Redis缓存预热,该如何实现?

什么是缓存预热? 缓存预热是一种在程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略。 这样,在实际请求到达程序时,热点数据已经存在于缓存中,从而减少了缓存穿透和缓存击穿的情况,也缓解了 SQL服务器 的压力。 实现 缓存抽象类 首先我们先来实现一个缓存抽象类,这个抽象类的作用就是在将来我们需要将某个模块的数据需要提前加载到缓存中的时候,我们可以创建一个它的实现类,来进行数据的缓存与加载,具体使用方式请看后边我写的例子。 public abstract class AbstractCache {     /        缓存       /     protected abstract void init();     /        获取缓存              @param <T        @return       /     public abstract <T  T get();     /        清理缓存       /     public abstract void clear

 77 |  0 |  0 Redis后端相关

布朗熊 | 4周前 | Redis后端相关Spring 全家桶

SpringBoot+Redis自定义注解实现发布订阅

前言 最近开发了一个内部消息组件,逻辑大体是通过定义注解 @MessageHub ,在启动时扫描全部bean中有使用了该注解的方法后台创建一个常驻线程代理消费数据,当线程消费到数据就回写到对应加了注解的方法里。 @Slf4j @Service public class RedisConsumerDemo {     @MessageHub(topic = "${uptown.topic}", type = "REDIS_PUBSUB")     public void consumer(Object message) {         log.info("pubsub info {} ", message);     }    } 实现redis的队列、stream方式实现都很简单,唯独发布订阅方式,网上的demo全都是一个固定套路,通过redis容器注入监听器,而且回写非常死板。那么如何将这块的逻辑统一呢。 之前总结过消息组件的代码设计,这里贴一下链接: “https://juejin.cn/post/7204113113699729463

 85 |  0 |  0 Redis后端相关

花小染 | 2024-01-31 | Redis后端相关

说说Redis Hash实现原理?

1. 是什么 [Redis Hash]()(散列表)是一种 field-value pairs(键值对)集合类型,类似于 Python 中的字典、Java 中的 HashMap。一个 field 对应一个 value,你可以通过 field 在 O(1) 时间复杂度查 field 找关联的 field,也可以通过 field 来更新或者删除这个键值对。 Redis 的散列表 dict 由 数组 + 链表 构成,数组的每个元素占用的槽位叫做 哈希桶 ,当出现散列冲突的时候就会在这个桶下挂一个链表,用“ 拉链法”解决散列冲突的问题 。 简单地说就是将一个 key 经过散列计算均匀的映射到散列表上。 图 2-18 2. 修炼心法 Hash 数据类型底层存储数据结构实际上有两种。 1. dict 结构。 2. 在 7.0 版本之前使用 ziplist,之后被 listpack 代替。 通常情况下使用 di...

 183 |  0 |  0 Redis后端相关

大牛猫 | 2024-01-30 | Redis后端相关Spring 全家桶

字节二面:Spring Boot Redis 可重入分布式锁实现原理?

书接上回,码哥上一篇[《纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式》](https://www.developers.pub/article/1280668)分享了分布式锁如何从错误到残缺,再到青铜版本的高性能 Redis 分布式锁代码实战,让你一飞冲天。 这是我们最常用的分布式锁方案,今天码哥给你来一个进阶。 [Chaya]():「码哥,上次的分布式锁版本虽然好,但是不支持可重入获取锁,还差一点点意思。」 Chaya 别急,今日码哥给你带来一个高性能可重入 Redis 分布式锁解决方案,直捣黄龙,一笑破苍穹。 什么是可重入锁 当一个线程执行一段代码成功获取锁之后,继续执行时,又遇到加锁的代码,可重入性就就保证线程能继续执行,而不可重入就是需要等待锁释放之后,再次获取锁成功,才能继续往下执行。 public synchronized void a() {     b(); } public synchronized void b() {     // doWork } 假设 X 线程在 a 方法获取锁之后,继续执行

 158 |  0 |  0 Redis后端相关

大牛猫 | 2024-01-30 | Redis后端相关Spring 全家桶

纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式

在说分布式锁之前,我们先说下为什么需要分布式锁。 在单机部署的时候,我们可以使用 Java 中提供的 JUC 锁机制避免多线程同时操作一个共享变量产生的安全问题。JUC 锁机制只能保证同一个 JVM 进程中的同一时刻只有一个线程操作共享资源。 一个应用部署多个节点,多个进程如果要修改同一个共享资源,为了避免操作乱序导致的并发安全问题,这个时候就需要引入分布式锁, 分布式锁就是用来控制同一时刻,只有一个 JVM 进程中的一个线程可以访问被保护的资源。 分布式锁很重要,然而很多公司的系统可能还在跑着有缺陷的分布式锁方案,其中不乏一些大型公司。 所以,码哥今天分享一个正确 Redis 分布式锁代码实战,让你一飞冲天,该代码可直接用于生产,不是简单的 demo。 温馨提示:如果你只想看代码实战部分,可直接翻到 SpringBoot 实战章节。 错误的分布式锁 说正确方案之前,先来一个错误的,知道错在哪,才能意识到如何写正确。 在银行工作的小白老师,使用 Redis SET 指令实现加锁, 指令满足了当 key 不存在则设置 value,同时设置超...

 142 |  0 |  0 Redis后端相关

蔡文姬 | 2024-01-30 | Redis后端相关

Redis分布式锁真的很安全吗?

这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题。 Redis 分布式锁的话题,很多文章已经写烂了,我为什么还要写这篇文章呢? 因为我发现网上 99% 的文章,并没有把这个问题真正讲清楚。导致很多读者看了很多文章,依旧云里雾里。例如下面这些问题,你能清晰地回答上来吗? 基于 Redis 如何实现一个分布式锁? Redis 分布式锁真的安全吗? Redis 的 [Redlock]() 有什么问题?一定安全吗? 业界争论 Redlock,到底在争论什么?哪种观点是对的? 分布式锁到底用 Redis 还是 Zookeeper? 实现一个有「容错性」的分布式锁,都需要考虑哪些问题? 这篇文章,我就来把这些问题彻底讲清楚。 读完这篇文章,你不仅可以彻底了解分布式锁,还会对「分布式系统」有更加深刻的理解。 文章有点长,但干货很多,希望你可以耐心读完。 为什么需要分布式锁? 在开始讲分布式...

 139 |  0 |  0 Redis后端相关

心如止水 | 2024-01-25 | Redis数据库MySQL

4 种策略让 MySQL 和 Redis 数据保持一致

先阐明一下 MySQL 和 Redis 的关系:MySQL 是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis 是用来当缓存,用来提升数据访问的性能。 关于如何保证 MySQL 和 Redis 中的数据一致(即缓存一致性问题),这是一个非常经典的问题。 使用过缓存的人都应该知道,在实际应用场景中,要想实时刻保证缓存和数据库中的数据一样,很难做到。 基本上都是尽可能让他们的数据在绝大部分时间内保持一致,并保证最终是一致的。 1、缓存不一致是如何产生的 如果数据一直没有变更,那么就不会出现缓存不一致的问题。 通常缓存不一致是发生在数据有变更的时候。因为每次数据变更你需要同时操作数据库和缓存,而他们又属于不同的系统,无法做到同时操作成功或失败,总会有一个时间差。在并发读写的时候可能就会出现缓存不一致的问题(理论上通过分布式事务可以保证这一点,不过实际上基本上很少有人这么做)。 虽然没办法在数据有变更时,保证缓存和数据库强一致,但对缓存的更新还是有一定设计方法的,遵循这些设计方法,能够让这个不一致的影响时间和影响范围最小化。 2、缓存更新...

 155 |  0 |  0 Redis数据库

大牛猫 | 2024-01-18 | Redis后端相关

我工作中用Redis的10种场景

前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景,希望对你会有所帮助。 1. 统计访问次数 对于很多官方网站的首页,经常会有一些统计首页访问次数的需求。 访问次数只有一个字段,如果保存到数据库中,再最后做汇总显然有些麻烦。 该业务场景可以使用Redis,定义一个key,比如:OFFICIAL_INDEX_VISIT_COUNT。 在Redis中有incr命令,可以实现给value值加1操作: incr OFFICIAL_INDEX_VISIT_COUNT 当然如果你想一次加的值大于1,可以用incrby命令,例如: incrby OFFICIAL_INDEX_VISIT_COUNT 5 这样可以一次性加5。 2. 获取分类树

 211 |  0 |  0 Redis后端相关

布朗熊 | 2024-01-17 | Redis后端相关

批量执行Redis命令的四种方式!

前言 在我们的印象中Redis命令好像都是一个个单条进行执行的, 如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢? 最容易想到的是Redis的一些批量命令,例如MGET 今天小许就这个问题给大家总结一下! Redis命令执行过程 在了解批量执行有哪些方式之前,我们简单回顾下Redis命令执行的过程: 《[Redis执行用户命令的过程是怎样的](https://mp.weixin.qq.com/s?__biz=MzkxNjIyMDY4OQ &mid=2247483957&idx=1&sn=8abf145bd1e381e5349d2aa8c01dd8e9&chksm=c1527c4bf625f55dba066d5480115db5d

 145 |  0 |  0 Redis后端相关

渣渣辉 | 2024-01-17 | Redis后端相关

1.2万字盘点Redis的15个坑,你踩过几个?

这篇文章,我想和你聊一聊在使用 Redis 时,可能会踩到的「坑」。 如果你在使用 Redis 时,也遇到过以下这些「诡异」的场景,那很大概率是踩到「坑」了: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) 复杂度的 SETBIT 命令,Redis 竟然被 OOM 了? 执行 RANDOMKEY 随机拿出一个 key,竟然也会阻塞 Redis? 同样的命令,为什么主库查不到数据,从库却可以查到? 从库内存为什么比主库用得还多? 写入到 Redis 的数据,为什么莫名其妙丢了? ... 究竟是什么原因,导致的这些问题呢? 这篇文章,我就来和你盘点一下,使用 Redis 时可能会踩到「坑」,以及如何去规避。 我把这些问题划分成了三大部分: 1. 常见命令有哪些坑? 2. 数据持久化有哪些坑? 3. 主从库同步有哪些坑? 导致这些问题的原因,很有可能会「颠覆」你的认知,如果你准备好了,那就跟着我的思路开始吧! 这篇文章干货很多,希望你可以耐心读完。 ![图片](https://static.developers.p...

 128 |  0 |  0 Redis后端相关

蔡文姬 | 2024-01-05 | Redis后端相关

Redis跳跃表如何添加元素?

今天分享的这道题来自于蔚来的真实面试题。 面试 Java 不可能不问 Redis,问到 Redis 不可能不问 Redis 的常用数据类型,问到 Redis 的常用数据类型,不可能不问跳跃表,当问到跳跃表经常会被问到跳跃表的查询和添加流程,所以接下来我们一起来看这道题的答案吧。 Redis 有序集合 ZSet 是由 ziplist (压缩列表) 或 skiplist (跳跃表) 组成的。 1. 压缩列表 ziplist 本质上就是一个字节数组,是 Redis 为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。 2. 跳跃表 skiplist 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均 O(logN)、最坏 O(N) 复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 跳跃表介绍 跳跃表 Skip List,也称之为跳表,是一种数据结构,用于在有序元素的集合中进行高效的查找操作。它通过添加多层链表的方式,提供了一种以空间换时间的方式来加速查找。 跳跃...

 123 |  0 |  0 Redis后端相关

布朗熊 | 2024-01-05 | Redis后端相关

如何使用Redisson实现分布式锁?

在分布式系统中,当多个线程(或进程)同时操作同一个资源时,为了保证数据一致性问题,所以就需要一种机制来确保在同一时间只有一个线程(或进程)能够对资源进行修改,这就是分布式锁的作用。 分布式锁是一种在分布式环境下的锁实现,它允许在多个进程或服务器之间协调对共享资源的访问或操作。分布式锁的关键特性是它能够在集群内的不同节点间保持其锁定状态,使得某一时刻仅有一个客户端能够获取并持有该锁,从而确保对公共资源的原子性和一致性访问。 实现分布式锁的方式有多种,例如基于数据库、Redis、ZooKeeper 等中间件来实现,它们通常依赖于这些中间件提供的事务特性,或者命令语义来达到分布式环境下的锁效果。例如,Redis 通过 SETNX 命令配合过期时间可实现一个简单的分布式锁方案。 1.SETNX 存在的问题 虽然可以使用 SETNX 命令方便的实现分布式锁,但是 SETNX 存在以下问题: 1. 死锁问题:SETNX 如未设置过期时间,锁忘记删了或加锁线程宕机都会导致死锁,也就是分布式锁一直被占用的情况。 2. 锁误删问题:SETNX 设置了超时时间,但因为执行时间太长,所...

 166 |  0 |  0 Redis后端相关

一纸荒年 | 2024-01-04 | Redis后端相关

阿里面试:redis 为什么把简单的字符串设计成 SDS?

面试官:了解 redis 的 String 数据结构底层实现嘛? 铁子:当然知道,是基于 SDS 实现的 面试官: redis 是用 C 语言开发的,那为啥不直接用 C 的字符串,还单独设计 SDS 这样的结构呢? 铁子:····· “其实看得出面试官是想看看,铁子是只停留在redis的使用层面,还是对底层数据结构有过更深入的研究,面试嘛都爱这样问大家都懂得。 我们知道 redis 是用 C 写的,但它却没有完全直接使用 C 的字符串,而是自己又重新构建了一个叫简单动态字符串 SDS (simple dynamic string)的抽象类型。 redis 也支持使用 C 语言的传统字符串,只不过会用在一些不需要对字符串修改的地方,比如静态的字符输出。 而我们开发中使用 redis ,往往会经常性的修改字符串的值,这个时候就会用 SDS 来表示字符串的值了。有一点值得 注意 :在redis数据库中, key-value 键值对含有字符串值的,都是由 SDS 来实现的。 比如:在 redis 执行一个最简单的 set 命令,这...

 130 |  0 |  0 Redis后端相关

石昊 | 2023-12-20 | Redis后端相关

一文搞懂Redis架构演化之路

这篇文章我想和你聊一聊 Redis 的架构演化之路。 现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如何稳定、高性能地提供服务的? 我使用 Redis 的场景很简单,只使用单机版 Redis 会有什么问题吗? 我的 Redis 故障宕机了,数据丢失了怎么办?如何能保证我的业务应用不受影响? 为什么需要主从集群?它有什么优势? 什么是分片集群?我真的需要分片集群吗? ... 如果你对 Redis 已经有些了解,肯定也听说过「 数据持久化、主从复制、哨兵、分片集群 」这些概念,它们之间又有什么区别和联系呢? 如果你存在这样的疑惑,这篇文章,我会从 0 到 1,再从 1 到 N,带你一步步构建出一个稳定、高性能的 Redis 集群。 在这个过程中,你可以了解到 Redis 为了做到稳定、高性能,都采取了哪些优化方案,以及为什么要这么做? 掌握了这些原理,这样平时你在使用 Redis 时,就能够做到「游刃有余」。 从最简单的开始:单机版 Redis 首先,我们从最...

 143 |  0 |  0 Redis后端相关