![](https://img-blog.csdnimg.cn/direct/cfc9f389e9e7460ab01d9c4054a8fc7a.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Redis
文章平均质量分 91
本Redis专栏将带您深入探索Redis的世界,从基础概念到高级功能,从最佳实践到实用技巧,让您全面了解和充分利用Redis的强大功能。无论您是初学者还是有经验的开发人员,本专栏都将帮助您在Redis领域不断前行。让我们一起探索Redis的无限可能叭!
时间瑾
梦想永在凌云意意气风发,代码成就万世基积沙镇海
展开
-
Redis到底是多线程还是单线程
当我们的客户端想要去连接我们服务器,会去先到IO多路复用模型去进行排队,会有一个连接应答处理器,他会去接受读请求,然后又把读请求注册到具体模型中去,此时这些建立起来的连接,如果是客户端请求处理器去进行执行命令时,他会去把数据读取出来,然后把数据放入到client中, clinet去解析当前的命令转化为redis认识的命令,接下来就开始处理这些命令,从redis中的command中找到这些命令,然后就真正的去操作对应的数据了,当数据操作完成后,会去找到命令回复处理器,再由他将数据写出。原创 2024-07-23 08:42:13 · 715 阅读 · 0 评论 -
Redis内存淘汰(内存过期)策略
Redis中数据过期策略采用定期删除惰性删除策略结合起来,以及采用淘汰策略来兜底。:Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。:在获取 key 时,先判断 key 是否过期,如果过期则删除。原创 2024-07-22 14:10:09 · 1471 阅读 · 5 评论 -
Redis多路复用详解
之前了解到阻塞IO和非阻塞IO, 无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案:如果调用recvfrom时,恰好没有数据,阻塞IO会使CPU阻塞,非阻塞IO使CPU空转,都不能充分发挥CPU的作用。如果调用recvfrom时,恰好有数据,则用户进程可以直接进入第二阶段,读取并处理数据所以怎么看起来以上两种方式性能都不好。原创 2024-07-22 08:39:34 · 1039 阅读 · 1 评论 -
Redis5种网络模型详解
阻塞IO(Blocking IO)非阻塞IO(Nonblocking IO)IO多路复用(IO Multiplexing)信号驱动IO(Signal Driven IO)异步IO(Asynchronous IO)能监听的FD最大不超过1024每次select都需要把所有要监听的FD都拷贝到内核空间每次都要遍历所有FD来判断就绪状态poll利用链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如果监听较多,性能会下降epoll 模式中如何解决这些问题的?原创 2024-07-22 08:34:54 · 751 阅读 · 0 评论 -
Redis 网络模型-用户空间和内核态空间
我们的应用程序也好,还是内核空间也好,都是没有办法直接去物理内存的,而是通过分配一些虚拟内存映射到物理内存中,我们的内核和应用程序去访问虚拟内存的时候,就需要一个虚拟地址,这个地址是一个无符号的整数,比如一个32位的操作系统,他的带宽就是32,他的虚拟地址就是2的32次方,也就是说他寻址的范围就是0~2的32次方, 这片寻址空间对应的就是2的32个字节,就是4GB,这个4GB,会有3个GB分给用户空间,会有1GB给内核系统。写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备。原创 2024-07-21 09:03:22 · 338 阅读 · 2 评论 -
Redis数据结构-Hash篇
都是键值存储都需求根据键获取值键必须唯一zset的键是member,值是score;hash的键和值都是任意值zset要根据score排序;hash则无需排序。原创 2024-07-18 17:18:27 · 1056 阅读 · 0 评论 -
Redis数据结构-ZSet篇
Redis 中的 ZSet(有序集合)是一种特殊的数据结构,它在每个元素的基础上关联了一个分值(score),用来对集合中的元素进行排序。在 Redis 中,ZSet 主要通过跳跃表(skiplist)或者压缩列表和哈希表的混合结构来实现。在 Redis 的 ZSet 中,跳跃表常被用来存储有序集合,因为它支持快速的插入、删除和范围查找操作,平均时间复杂度为 O(log n)。对于元素数量较少的有序集合,Redis 也可以使用压缩列表和哈希表的混合结构来存储数据。之前学习的哪种编码结构可以满足?原创 2024-07-17 14:51:55 · 460 阅读 · 3 评论 -
Redis数据结构-Set篇
Set是Redis不保证有序性保证元素唯一求交集、并集、差集可以看出,Set对查询元素的效率要求非常高,思考一下,什么样的数据结构可以满足?HashTable,也就是Redis中的Dict,不过Dict是双列集合(可以存键、值对)Set是Redis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。原创 2024-07-16 13:58:27 · 345 阅读 · 1 评论 -
Redis数据结构-List篇
在3.2版本之前,Redis采用ZipList和LinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。在3.2版本之后,Redis统一采用QuickList来实现List原创 2024-07-15 08:57:07 · 1064 阅读 · 0 评论 -
Redis数据结构-String篇
对⼀个内部表示成long型的string执行append, setbit, getrange这些命令,针对的仍然是string的值(即⼗进制表示的字符串),而不是针对内部表⽰的long型进⾏操作。因此,在这些命令的实现中,会把long型先转成字符串再进行相应的操作。String 的内部存储结构⼀般是 sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String 类型的 value 的值是数字,那么 Redis 内部会把它转成 long 类型来存储,从⽽减少内存的使用。原创 2024-07-12 16:35:20 · 968 阅读 · 5 评论 -
Redis数据结构解析-IntSet
IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。// intset 结构体定义// 编码方式,用于表示存储的整数类型// intset 中包含的元素个数// 存储整数的数组} intset;其中的 encoding 包含三种模式,表示存储的整数大小不同:为了方便查找,Redis 会将 intset 中所有的整数按照升序Redis会确保Intset中的元素唯一、有序具备类型升级机制,可以节省内存空间底层采用二分查找方式来查询。原创 2024-07-10 08:53:39 · 432 阅读 · 0 评论 -
Redis数据结构解析-SkipList
SkipList(跳表)是一种数据结构,用于实现有序元素的动态集合,它的设计目的是在有序链表的基础上通过增加多级索引来提高查找效率。跳表的核心思想是在原始链表的基础上建立多层索引,每一层索引都是原始链表的子集,其中每个节点都具有指向下一层的指针。这样,从头节点到尾节点的路径形成了一种类似跳跃的结构,使得在搜索时可以跳过一些节点,从而减少了搜索的时间复杂度。SkipList(跳表)首先是链表,但与传统链表相比有几点差异:元素按照升序排列存储节点可能包含多个指针,指针跨度不同。原创 2024-07-10 08:50:51 · 280 阅读 · 0 评论 -
Redis数据结构解析-QuickList
本文介绍了Redis中的QuickList数据结构,一种为存储大量列表数据而设计的高效数据结构,通过分段存储、压缩列表和双向链表实现内存优化,同时讨论了配置项list-max-ziplist-size对内存控制的作用。原创 2024-07-09 16:19:27 · 1139 阅读 · 3 评论 -
Redis数据结构解析-Dict
我们知道Redis是一个键值型(Key-Value Pair)的数据库,我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。哈希表(DictHashTable)、哈希节点(DictEntry)、字典(Dict)当我们向Dict添加键值对时,Redis首先根据key计算出hash值(h),然后利用来计算元素应该存储到数组中的哪个索引位置。我们存储k1=v1,假设k1的哈希值h =1,则1&3 =1,因此k1=v1要存储到数组角标1位置。# 构成。原创 2024-07-09 08:47:40 · 807 阅读 · 0 评论 -
Redis数据结构解析-动态字符串SDS
本文详细介绍了Redis中的SimpleDynamicString(SDS)数据结构,它具有动态扩容、二进制安全、长度获取速度快等优点,并对比了与C语言字符串在大小调整、二进制兼容性和内存管理上的区别。原创 2024-07-08 08:50:36 · 475 阅读 · 0 评论 -
Redis数据结构解析-ZipList
ZipList 是一种特殊的“双端链表” ,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。属性类型长度用途zlbytesuint32_t4 字节记录整个压缩列表占用的内存字节数zltailuint32_t4 字节记录压缩列表表尾节点距离压缩列表的起始地址有多少字节,通过这个偏移量,可以确定表尾节点的地址。zllenuint16_t2 字节记录了压缩列表包含的节点数量。原创 2024-07-07 18:02:46 · 759 阅读 · 0 评论 -
Redis数据结构解析-RedisObject
RedisObject 是 Redis 中表示数据对象的结构体,它是 Redis 数据库中的基本数据类型的抽象。在 Redis 中,所有的数据都被存储为 RedisObject 类型的对象。// 数据类型,如字符串、列表、哈希等// 编码方式,如 int、raw、hashtable 等// Least Recently Used,用于记录对象最近被访问的时间// 引用计数,用于自动内存管理void *ptr;// 指向实际存储数据的指针} robj;type。原创 2024-07-07 09:36:42 · 1152 阅读 · 4 评论 -
Redis主从数据同步原理
本文介绍了redis主从同步的过程及原理原创 2024-07-05 10:18:45 · 1563 阅读 · 0 评论 -
使用Docker搭建Redis主从集群
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。原创 2024-06-18 08:33:47 · 684 阅读 · 0 评论 -
Redis 搭建主从集群
单节点的Redis并发能力有限,要进一步提高 Redis 的并发能力,就需要搭建主从集群,实现读写分离。本篇文章,我们就来实际操作实现主从集群.原创 2024-06-17 08:48:53 · 1543 阅读 · 18 评论 -
一篇文章看懂Redission原理
一篇文章看懂Redission原理原创 2024-06-13 08:34:53 · 4340 阅读 · 73 评论 -
分布式锁的王者:Rediision
Rediision是一个Redis的 Java 客户端库,它提供了一种解决 Redis setnx 命令缺点的方法。setnx 命令用于将键的值设置为指定的字符串,但仅在键不存在时才进行设置。它的一个缺点是如果在设置值和过期时间之间发生故障,可能会导致键一直存在而没有设置过期时间,这可能会导致资源浪费或数据不一致。Rediision 使用了 Redis 的 Lua 脚本功能来解决这个问题。它提供了 setnxex 方法,它不仅会设置键的值,还会设置键的过期时间。原创 2024-06-12 08:33:41 · 949 阅读 · 9 评论 -
Redis实现分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路基于Java自身否锁机制 如下图基于非Java的锁机制 如下图那么分布式锁他应该满足一些什么样的条件呢?可见性:多个线程都能看到相同的结果,注意:这个地方说的可见性并不是并发编程中指的内存可见性,只是说多个进程之间都能感知到变化的意思互斥:互斥是分布式锁的最基本的条件,使得程序串行执行高可用。原创 2024-06-11 09:16:19 · 1527 阅读 · 11 评论 -
Redis用BitMap实现签到
我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap)。这样我们就用极小的空间,来实现了大量数据的表示Redis中是利用string类型数据结构实现 BitMap,因此最大上限是512M,转换为bit则是 2^32个bit位。SETBIT:向指定位置(offset)存入一个0或1GETBIT :获取指定位置(offset)的bit值。原创 2024-06-10 10:03:12 · 1271 阅读 · 4 评论 -
Redis扫描 bigKey
BigKey内存占用较多,即便时删除这样的key也需要耗费很长时间,导致Redis主线程阻塞,引发一系列问题。原创 2024-06-09 17:36:21 · 535 阅读 · 3 评论 -
Redis 内存回收
Redis 中数据过期策略采用定期删除+惰性删除策略结合起来,以及采用淘汰策略来兜底。:Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。:在获取 key 时,先判断 key 是否过期,如果过期则删除。原创 2024-06-08 18:48:57 · 1749 阅读 · 8 评论 -
Redis 持久化: RDB和AOF
Redis 可以通过持久化机制来保证数据在重启后不会丢失。Redis 提供了两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。RDB持久化:RDB 持久化会在Redis数据库中的数据进行快照,并将快照保存到磁盘上的 RDB 文件中。可以通过设置保存快照的条件(比如间隔时间、修改数据量等)来触发 RDB 持久化操作。在 Redis 服务器重启时,可以通过加载 RDB 文件来将数据恢复到内存中。原创 2024-06-03 08:35:09 · 3869 阅读 · 76 评论 -
Redis用GEO实现附近的人功能
GEO就是的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)GEODIST:计算指定的两个点之间的距离并返回GEOHASH:将指定member的坐标转为hash字符串形式并返回GEOPOS:返回指定member的坐标。原创 2024-05-31 08:36:49 · 2970 阅读 · 39 评论 -
Redis实现全局唯一id
ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签。它的主要目的确如平常大家理解的“为一个分布式系统的数据object产生一个唯一的标识”,但其实在一个真实的系统里可能也可以承担更多的作用。唯一性时间相关粗略有序可反解可制造下面我会分别讲每个作用后面的考虑和权衡,也会对比介绍一下业界已知的几种 ID 设计。要唯一性,是否需要全局唯一?原创 2024-05-30 08:41:13 · 1125 阅读 · 7 评论 -
Redis解决缓存一致性问题
由于我们的缓存的数据源来自于数据库, 而数据库的数据是会发生变化的, 因此,如果当数据库中数据发生变化,而缓存却没有同步, 此时就会有一致性问题存在, 其后果是:用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等;怎么解决呢?有如下几种方案人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案由系统本身完成:数据库与缓存的问题交由系统本身去处理调用者只操作缓存:其他线程去异步处理数据库,实现最终一致。原创 2024-05-28 14:45:00 · 2996 阅读 · 45 评论 -
Redis实现Session共享
用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息.所以我们可以使用String结构,就是一个简单的key,value键值对的方式,但是关于key的处理,session他是每个用户都有自己的session,但是redis的key是共享的,咱们就不能使用code了。原创 2024-05-27 12:45:00 · 2129 阅读 · 8 评论 -
Redis使用Set实现点赞功能
Redis中的set类型是一组无序的字符串值。set通过其独特的数据结构和丰富的命令提供了在存储和处理集合元素方面的一些非常有用的功能。:向指定键名的集合中添加一个或多个成员,并返回成功添加的成员数量。:从指定键名的集合中移除一个或多个成员,并返回成功移除的成员数量。:返回指定键名集合中所有的成员。:检查指定成员是否在集合中,存在返回1,不存在则返回0。:随机获取指定键名集合中的一个或多个成员。如果指定count参数,则表示获取不重复的count个随机成员。SCARD key:获取指定键名集合中的成员数。原创 2024-05-27 08:26:40 · 522 阅读 · 4 评论 -
Java客户端SpringDataRedis(RedisTemplate)
方案一自定义RedisTemplate修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer会占用额外的内存空间 记录字节码方案二使用StringRedisTemplate写入Redis时,手动把对象序列化为JSON读取Redis时,手动把读取到的JSON反序列化为对象。原创 2024-05-26 20:18:29 · 479 阅读 · 0 评论 -
RedisTemplate操作Redis, 看这一篇文章就够了
RedisTemplate 是 Spring Framework 提供的用于操作 Redis 数据库的模板类。通过 RedisTemplate,开发人员可以方便地使用 Spring 提供的 API 来对 Redis 进行操作,比如设置值、获取值、删除值等。RedisTemplate 封装了 Redis 连接、数据序列化、异常处理等操作,简化了与 Redis 的交互过程。一般情况下,开发人员需要配置 Redis 连接池、序列化器等信息,并将 RedisTemplate 注入到需要使用 Redis 的 Be原创 2024-05-24 08:43:57 · 1650 阅读 · 21 评论 -
Java客户端SpringDataRedis(RedisTemplate)上手
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做提供了对不同Redis客户端的整合(Lettuce和Jedis)提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化支持基于Redis的JDKCollection实现中提供了工具类,其中封装了各种对。原创 2024-05-21 13:55:22 · 885 阅读 · 0 评论 -
RedisTemplateAPI:ZSet
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。可排序元素不重复查询速度快因为SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。原创 2024-05-21 08:48:37 · 817 阅读 · 3 评论 -
RedisTemplateAPI:Set
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet无序元素不可重复查找快支持交集.并集.差集等功能。原创 2024-05-21 08:35:14 · 729 阅读 · 0 评论 -
RedisTemplateAPI:List
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。特征也与LinkedList有序元素可以重复插入和删除快查询速度一般。原创 2024-05-20 08:33:21 · 599 阅读 · 3 评论 -
RedisTemplateAPI:Hash
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。keyvalueHash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD。原创 2024-05-19 16:38:50 · 1006 阅读 · 0 评论 -
RedisTemplateAPI:String
String 类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:●string:普通字符串●int:整数类型,可以做自增.自减操作●float:浮点类型,可以做自增.自减操作不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过 512 MB。原创 2024-05-19 07:42:12 · 1159 阅读 · 2 评论