Redis
文章平均质量分 81
橡 皮 人
代码传递思想,技术创造回响。
展开
-
Redis第18讲——Redis和Redission实现延迟消息
即使不是做电商业务的同学,也一定知道订单超时关闭这种业务场景,这个场景大致就是用户下单后,如果在一定时间内未支付(比如15分钟、半小时),那么系统就会把这笔订单给关闭掉。这个功能实现的方式有很多种,比如JDK中自带的DelayQueue延迟队列、Timer、ScheduledThreadPoolExecutor,强烈推荐的RocketMQ、RabblitMQ及Kafka等消息队列,还有就是Hutool的SystemTimer、Netty的HashedWheelTimer等等,感兴趣的可以去了解一下。今天我们原创 2024-05-23 07:15:00 · 1478 阅读 · 0 评论 -
Redis第17讲——Redis zset结构实现滑动窗口限流
滑动窗口限流是一种流量控制策略,用于控制在一定时间内允许执行的操作数量或请求频率。它的工作方式类似于一个滑动时间窗口,对每个时间窗口的请求数量进行计数,并根据预先设置的限流策略来限制或调节流量,通常包括以下几个要素:原创 2024-05-16 07:15:00 · 434 阅读 · 0 评论 -
Redis第16讲——Redis的发布订阅功能
随着上篇Redis实现分布式锁的完结,Redis的核心知识点也就暂时告一段落了,后续会介绍Redis一些零碎的知识点,比如事务、发布订阅、stream结构等,还有一些基于Redis实现的功能,比如订单到期关闭、排行榜、分布式限流、类似微信的共同关注、推荐关注等功能。我们先从Redis的发布订阅讲起。原创 2024-05-09 07:15:00 · 1016 阅读 · 0 评论 -
Redis第15讲——RedLock、Zookeeper及数据库实现分布式锁
由于篇幅原因,在上篇文章我们只介绍了redis实现分布式锁的两种方式——setnx和Redission,并对Reidssion加锁和看门狗机制的源码进行了分析,但这两种方案在极端情况下都会出现或多或少的问题。那么针对上述问题,比较主流的解决方案有两种:RedLock和Zookeeper实现的分布式锁。原创 2024-05-02 07:30:00 · 1990 阅读 · 0 评论 -
Redis第14讲——Redis实现分布式锁(Redission源码解析)
在多线程环境下,为了保证数据的线程安全,我们通常用加锁的方式,使同一时刻只有一个线程可以对这个共享资源进行操作,在单服务系统我们常用JVM锁——Synchronized、ReentrantLock等。然而在多台服务系统的情况下,JVM锁就无法在多个服务器之间生效了,这时候我们就需要用分布式锁来解决线程安全的问题。分布式锁的实现方式有很多,主流的就是基于数据库、zookeeper以及redis,当然使用redis的居多,由于篇幅原因,本节就详细介绍一下使用redis实现分布式锁的几种方式。原创 2024-04-25 07:30:00 · 1112 阅读 · 0 评论 -
Redis第13讲——缓存不一致问题四种解决方案
上篇文章介绍了缓存常用的三种设计模式,并且对使用最广泛的Cache Aside Pattern进行了深入的探讨,在比较先操作数据库or先操作缓存、删除缓存or更新缓存之后发现,先操作数据库再删除缓存是最优的选择,但是依然存在数据一致性问题,那么,本章在“先操作数据库再删除缓存”这种方案的基础上,给出3个更加完备的方案来解决缓存于数据库一致性问题。原创 2024-04-18 07:30:00 · 1104 阅读 · 0 评论 -
Redis第12讲——缓存的三种设计模式
缓存的使用在项目中是极其常见的,如果使用得当,缓存可谓时提升系统性能的最简单方法之一,反之则会出现一些莫名其妙的问题,在不同场景下,所使用的缓存策略也是有所变化的,下面我们就介绍一下三种常见的缓存设计模式——Cache Aside Pattern(重点)、Read/Write Through Pattern、Write Behind Caching Pattern。原创 2024-04-11 07:30:00 · 826 阅读 · 0 评论 -
Redis第11讲——Redis集群脑裂问题
在Redis集群中,每个节点的部署方式一般都是【一主多从】,主节点提供写操作,从节点提供读操作。如果主节点此时发生网络故障,与从节点断开连接了,但主节点与客户端是正常的,客户端依旧向主节点写入数据。这时哨兵节点发现主节点有故障失联了,于是哨兵节点就会从 从节点选出一个leader作为新主节点,这时脑裂就出现了。原创 2024-04-04 07:30:00 · 1535 阅读 · 0 评论 -
Redis第10讲——Redis数据分片的三种算法
一致性哈希环顺时针映射优先考虑的是:如何实现最少的节点数据发生数据迁移,当增加或移除节点,只有离新节点最近的节点会涉及到数据迁移。redis cluster哈希槽是静态映射,优先考虑的是如何实现数据均匀分布,当增加或移除节点时,所有的节点都会参与进来平摊压力。(我们搞集群的目的是啥?还不是单机容量不足,需要扩容多机组成集群,然后将数据尽可能的均匀分布吗)。同时,redis cluster哈希槽静态映射还有一个优点,就是可以手动调整slots槽的分配。redis cluster集群分为16384个原创 2024-03-28 07:30:00 · 1128 阅读 · 0 评论 -
Redis第9讲——Redis 3.0之前各大厂商的集群方案
上篇文章介绍了Redis 3.0版本开始支持的Cluster集群,但在Redis 3.0版本之前,Redis主要是以单实例模式运行,无法很好地应对大规模和高负载的需求。虽然Redis的开发者Antirez早在博客上就提出Redis 3.0版本中加入集群功能,但是要等到2015年才发布正式版。在3.0版本还没发布之前为了解决这个存储瓶颈问题,纷纷推出自己的Redis集群方案。这些方案的核心是把数据分片(sharding)存储在多个Redis实例中,每一片就是一个Redis实例。原创 2024-03-21 07:30:00 · 742 阅读 · 0 评论 -
Redis第8讲——Cluster集群模式详解
前面两篇文章介绍了Redis主从和哨兵模式,不难发现,它们都有一些共同的缺点,首先在主从切换的过程中会丢失数据;另一个就是只有一个master,只能单点写,并没有水平扩容能力。而且每个节点都保存了所有的数据,这使得内存占用率变高,另一个就是如果进行数据恢复也比较慢。为了解决这些问题,集群模式应运而生,下面我们来一起看看。原创 2024-03-14 07:45:00 · 1072 阅读 · 1 评论 -
Redis第7讲——哨兵模式详解
为了解决主从模式的无法自动容错及恢复的问题,Redis在主从复制的基础上加入了哨兵节点,也就是我们熟悉的哨兵模式。但现在基本不会用到哨兵模式,也就是这种模式只存在于面试中。Redis的哨兵模式(Sentinel)是一种高可用的部署方式,由一个或多个Sentinel实例组成的Sentinel系统可以监控和管理多个Redis实例。在哨兵模式下,有一个或多个哨兵进程监控Redis主服务器和备份服务器的状态,并在主服务器下线时自动切换到备份服务器,继续处理命令请求。原创 2024-03-07 07:45:00 · 903 阅读 · 0 评论 -
Redis第6讲——主从复制模式详解
Redis 2.8之前复制采用SYNC命令,无论是第一次还是断线重连,都采用完整重同步方式,效率很低。Redis 2.8~Redis 4.0版本之间采用PSYNC命令,主要优化了断线重连后可以通过runid和offset使用部分重同步,效率提高,但存在slave重启和master故障切换问题导致执行完整重同步的问题。Redis 4.0版本之后对PSYNC命令进行了优化——PSYNC2,主要优化了PSYNC在slave重启和master故障切换后执行完整重同步的问题。原创 2024-02-29 07:30:00 · 1147 阅读 · 0 评论 -
Redis第5讲——RDB、AOF和混合持久化机制
我们知道Redis是内存数据库,它把数据都存储在了内存中,如果Redis服务器出现了意外,比如宕机、断电等情况,那么内存中的数据就会全部丢失。所以必须有一种机制可以把内存中的数据保存到磁盘里面,为了解决这个问题,Redis提供了RDB和AOF两种持久化机制,这也是Redis的重要特性之一。在开启混合持久化的情况下,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式追加到文件的末尾。原创 2024-01-19 07:30:00 · 1988 阅读 · 0 评论 -
Redis第4讲——Redis的数据库结构、删除策略及淘汰策略
redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。db数组的每项都是一个redis.h/redisDb结构,而每个redisDb结构就代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。过期字典的键是一个指针,这个指针指向键空间中的某个键对象。过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。原创 2024-01-05 07:30:00 · 1131 阅读 · 0 评论 -
Redis第3讲——跳跃表详解
在Redis中,跳跃表是有序集合(zSet)数据类型的实现之一,也在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其它用途。跳跃表支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点,在大部分情况下,跳跃表的效率可以和红黑树、AVL树不相上下,但跳表原理更加简单、实现起来也更简单直观。原创 2023-12-28 08:00:01 · 1613 阅读 · 0 评论 -
Redis第2讲——Java三种客户端(Jedis、Lettuce和Redisson)
上篇文章介绍了Redis的9种数据类型和常命令、7种数据结构和9种编码方式。但是如果想要把它应用到项目中,我们还需要一个redis的客户端。redis的Java客户端种类还是很多的,其中使用最广泛的有三种——Jedis、lettuce和redisson,下面我们一起来学习下。基于redis开放的通信协议,大神们纷纷开发出了各种语言的redis客户端,包括C、C++、C#、D、java、Python、Ruby等50多种,这些客户端都是基于redis命令做了一层封装,并打包成工具,以便更方便地操作redis。原创 2023-12-21 07:15:00 · 1669 阅读 · 0 评论 -
Redis第1讲——入门简介
这段时间思来想去,还是决定把Redis再巩固和学习一下。毕竟Redis不论是在面试还是实际应用中都是极其重要的,在面试中诸如Redis的缓存问题、热key、大key、过期策略、持久化机制等;还有在实际应用中的Redis缓存、分布式锁、Reids实现排行榜、分布式限流功能、Redis做延迟队列、消息队列、发布订阅等。相信大家对这并不陌生,而作者想要做的就是在其基础上,把它们进行总结、整理、扩展并深入。原创 2023-12-13 07:30:00 · 2497 阅读 · 0 评论 -
面试官:你知道Redis的热key问题吗?给出几个解决方案,详细点?
如果在同一时间点上,Redis中的同一个key被大量访问,就会导致流量过于集中,使得很多物理资源无法支撑,如网络带宽、物理存储空间、数据库连接等。这也是为什么某某明星官宣之后,微博上面就会出现宕机的情况。有时候这种宕机发生后,其他功能都是可以使用的,只是和这个热点有关的内容会无法访问,这其实就和热点数据有关系了。对于热key的处理,主要在于事前预测和事中解决。对于事前预测就是根据一些经验,提前识别出可能成为热key的key,比如秒杀;事中解决方面,主要可以考虑:热点key的拆分、多级缓存、热key备份、原创 2023-05-22 20:34:11 · 741 阅读 · 0 评论 -
介绍一下布隆过滤器的原理以及实现它的几种方式(Guava、Redission、Apache Commons、Jedis)
想必大家都知道布隆过滤器,它是为了预防黑客发起大量非法请求的一种手段,例如Redis的缓存穿透,就可以用布隆过滤器来解决。它最大的特点是说没有的一定没有,说有的不一定有(误差在0.01)。1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列的随机映射函数(哈希函数)两部分组成的结构,用于快速检索一个元素是否可能存在于一个集合(bit数组中)。优点:时间复杂度低,增加及查询元素的时间复杂度都是O(k),k为Hash函数的个数;占用存储空间小,布隆过滤器相对于其他数据结构(如Set、M原创 2023-05-19 21:22:10 · 521 阅读 · 0 评论 -
基于Redis ZSet结构实现朋友圈点赞功能
key就是这个具体的朋友圈ID,ZSet的Value表示点赞用户的ID,score表示点赞时间的时间戳,这样可以方便地按时间顺序查询点赞信息,并支持对点赞进行去重,话不多说,接下来就是实战。使用字符串存储每篇朋友圈的ID,作为有序集合的key使用zset存储每篇朋友圈的点赞用户信息,其中value为点赞用户的ID,score为点赞时间的时间戳。点赞操作:将用户的ID添加到zset中,score为当前时间戳。如果用户已经点过赞,则更新其点赞时间戳。取消点赞操作:将用户的ID从有序集合中删除。查询点赞原创 2023-05-18 20:39:23 · 636 阅读 · 0 评论 -
面试官:讲一下Redis与Memcached有什么区别?
1.数据结构:Redis提供了多种数据结构,如字符串、哈希表、列表、集合、有序集合等;而Memcached只支持简单的键值对存储。 2.持久化方式:Redis支持多种持久化方式,如RDB和AOF,可以将数据持久化到硬盘上;而Memcached不支持持久化。 3.数据分片方式不同:Redis使用哈希槽分片,可以实现数据的自动分片和负载均衡;而Memcached只能手动分片。 4.处理数据的方式不同:Redis使用单线程处理数据请求,支持事务、Lua脚本等高原创 2023-05-11 22:15:35 · 198 阅读 · 0 评论 -
Redis缓存击穿、穿透、雪崩、倾斜的问题及解决方案
首先,雪崩的概念比较容易记,就是很多个key同时到期才会雪崩,”缓存雪崩的时候没有一个Key是无辜的“。至于穿透和击穿,区别在于穿透是”透“,什么叫透呢,那就是不仅被缓存击穿了,数据库也被击穿了,这种才叫透。所以,这种缓存和数据库中都没有的情况叫做”缓存穿透“。原创 2023-05-05 22:11:43 · 200 阅读 · 0 评论 -
面试官:Redis的数据完全是存在内存中的吗?Redis的虚拟内存机制是什么?
当需要访问已经被交换到硬盘上的页面时,Redis会将其重新读取到内存中,这样就可以访问其中的数据了。由于需要将数据从磁盘读取的内存中,因此访问被转移到磁盘上的数据会比较慢一些,因此,在实际应用中,需要根据具体的应用场景和硬件条件进行调整,以达到最佳的性能和内存使用效率。并不是,Redis提供了一项虚拟内存(Virtual Memory)技术,允许Redis再数据量超过物理内存容量时,将一部分不经常使用的数据存储到硬盘上,以释放物理内存空间。例如,如果maxmemory设置为4GB,那么它可以设置为8GB。原创 2023-04-22 23:11:04 · 1310 阅读 · 0 评论 -
Redis5.0的Stream数据结构
Stream是Redis5.0新增的一种数据结构,它是一个有序、可重复、可扩展的消息队列。相比于其他消息队列,Stream最大的特点就是它具有严格的有序性,保证消息的先后顺序不变。同时,Stream还提供了多个消费者同时消费的机制,这也是它比其他消息队列更灵活的地方。原创 2023-04-11 00:31:47 · 452 阅读 · 0 评论 -
一文搞懂在Redis中,Lua脚本为什么可以保证原子性?及其常见的使用场景
当Redis执行Lua脚本时,Redis会把Lua脚本作为一个整体并把它当作一个任务加入到一个队列中,然后单线程按照队列的顺序依次执行这些任务,在执行过程中Lua脚本是不会被其他命令或请求打断,因此可以保证每个任务的执行都是原子性的。当你在Redis中执行一些复杂业务逻辑时,你可能需要使用Lua脚本来实现,与其它语言不同的是,Redis通过eval、evalsha等命令来执行Lua脚本。原创 2023-04-09 15:53:15 · 7901 阅读 · 1 评论 -
为什么Redis6.0引入了多线程
目前很多服务器都是多核的,在业务复杂度大的情况下,Redis采用单线程处理大量请求时会出现速度不够的情况,并且单线程也难以充分利用CPU资源。主要还是因为随着越来越复杂的业务场景,需要有更高大的QPS,为了提升QPS,很多公司的做法就是搭集群,但这种做法你懂的。从上图我们可以看出,调用select(其他函数同理)的过程中是阻塞的,所以瓶颈也就在这。,所以限制Redis的性能瓶颈主要出现在网络IO的处理上。的多线程设计,以充分利用多核CPU的性能优势,提高Redis在多核环境下的性能表现。原创 2023-04-08 21:10:57 · 482 阅读 · 0 评论 -
什么是Redis的多路复用?
具体实现方式是Redis采用了select、poll、epoll等系统调用来实现多路复用I/O,Redis会将所有需要监听的socket(包括客户端和服务器端)加入到一个事件集合中,并使用select、poll、epoll等系统调用等待这些socket上是否有I/O事件发生,当有I/O事件发生时,Redis会通过事件处理器将该事件分发到对应的处理器进行处理。在这个过程中,Redis维护了一个事件处理器,它包含了多个事件的处理器,每个事件处理器都是一个函数指针,用于处理特定的事件类型。那么它有什么特别的呢?原创 2023-04-07 21:17:59 · 441 阅读 · 1 评论 -
Redis为什么最开始被设计成单线程而不是多线程?
Redis确实是一个I/O操作密集的框架,数据操作过程中会有大量的网络和磁盘I/O的发生,所以提升I/O利用率是毋庸置疑的。采用多线程的方式可以帮助我们提高I/O利用率,但是多线程带来的并发问题给框架带来了更多的复杂性,同时,多线程的切换也会带来一定的性能开销。首先我们要想一下多线程的适用场景,一个计算机程序在执行的过程中,主要的操作就是读和写,也就涉及网络I/O和磁盘I/O,计算主要涉及CPU,而多线程的目的就是通过并发来提升I/O和CPU的利用率。很多人说Redis是单线程的,这其实是不对的。原创 2023-04-06 16:54:56 · 311 阅读 · 2 评论