![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
文章平均质量分 60
看着蓝天抽支烟
这个作者很懒,什么都没留下…
展开
-
redis7 hash之listpack
在获取 element内容的时候,先去读取当前element的len属性,不用ziplist那样去计算。读取完根据下一个element的len属性来读取内容。先回顾下 zilist。原创 2023-05-31 19:49:04 · 132 阅读 · 0 评论 -
Redis6 数据结构Hash
在Redis中,hashtable 被称为字典(dictionary),它是一个数组+链表到结构。每个键值对都会有一个dictEntry这种编码夯实内部才是真正的哈希表结构,或称为字典结构,其可以实现O(1)复杂度的读写操作,因此效率很高。在Redis内部。原创 2023-05-31 18:55:16 · 588 阅读 · 0 评论 -
redis 数据结构String之SDS
当字符串的键值为长度大于44的超长字符串时,redis则会将键值的内部编码改为OBJ_ENCODING_RAW,这与OBJ_ENCODING_EMBSTR编码方式的不同之处在于,此时动态字符串sds的内存与其依赖的redisObject的内存不在连续了。字符串保存的小于44字节的字符串值,则使用简单动态字符串(SDS)结构,并将编码设置为raw,此时内存结构与SDS结构一致,内存分配次数为两次,创建redisObject对象和sdshdr结构。如:访问当前字符串的长度,直接读取即可,时间复杂度0(1)。原创 2023-05-31 17:00:13 · 609 阅读 · 0 评论 -
redis高级篇 缓存双写一致性之更新策略
是指在第一次删除之后,延迟一段时间再次进行删除,所以我们把它叫做“延迟双栓”。删除成功则已出,删除失败重试。如果重试次数较多,加入死信队列,后续处理,排查故障。这个方案在第一次删除之后,延迟一段时间再次进行删除,所以我们把它叫做“延迟双栓”2.如果redis 中无数据: 数据库中的值如果是最新的,则要写入到redis。因为要删除2次,所以吞吐量会降低,另起一个线程,异步删除。如果redis 删除成功, 数据库删除失败,则数据不一致。缓存中使错误的数据,数据不一致,且高并发下问题更是严重。原创 2023-05-26 19:01:17 · 869 阅读 · 0 评论 -
Redis BigKey问题
非字符串的bigkey,不要使用del删除,使用hscan,sscan,zscan的方式渐进式删除,同时防止bigkey过期自动删除问题,例如一个200w元素的list设置一个小时过期,会触发del操作。与del命令不同的是,unlink命令会异步地删除指定的键以及与之相关联的值。即,它会将要删除的键添加到一个待删除的列表中,并立即返回,不会阻塞客户端。在这么长 时间内,所有其他读写命令都会延后甚至报错,随着命令的积压,可能会造成缓存雪崩,甚至数据库宕机。原创 2023-05-26 14:25:52 · 911 阅读 · 0 评论 -
Redis6/7多线程总结
redis将所有数据放到内存中,内存的响应速度大概是100纳秒,对于小数据包,redis服务器可以处理8w到10w的QPS,这也就是Redis的处理极限了。如果你在实际的开发中,发现redis实例的CPU开销不大但是吞吐量没有提升,可以考虑使用Redis7多线程机制,加速网络I/O处理,进而提升吞吐量。这个数量使用讲究的,如果服务器是4核CPU,那么建议设置2-3个io-thread.如果是8核CPU,那么建议使用6个。在redis6/7中,多线程机制默认是关闭的。对于大数据的key的删除还是耗时的问题。原创 2023-05-25 15:37:07 · 482 阅读 · 0 评论 -
Redis 主线程和IO线程是如何完成协作处理的
从Redis6开始,就新增了多线程功能来提高I/O读写能力,它主要实现思路是:将主线程的读写任务拆分成一组独立的线程去执行,这样就可以使多个socket的读写并行化。采用I/O多路复用技术可以让单个线程高效处理多个连接请求(减少网络IO的时间的消耗),将最耗时的socket读取,请求解析,写入单独外包出去,I/O的读写本身是堵塞的,比如socket有数据时。而这个拷贝过程是阻塞的,当数据量越大,所需要的时间就越多。仍然由主线程执行,并将结果写入内存。网络IO操作就变成了多线程化,其他线程仍然是线程安全的。原创 2023-05-25 15:03:42 · 255 阅读 · 0 评论 -
redis高级篇一
主要是指redis的网路IO和键值对的读写是由一个线程来完成的,Redis在处理客户端的请求时,包括获取(socket 读),解析,执行,内容返回(socket 写)等,这些按顺序串行的命令由一个线程执行,这就是所谓的单线程。这也是redis对外提供键值存储的主要流程。比如redis-cli -a 11111 --raw 对应 创建socket 解析请求set k1 v1 对应 执行操作 返回的结果对应 写入socket。原创 2023-05-25 13:17:57 · 743 阅读 · 0 评论 -
Springboot整合redis集群
springboot 集成配置。原创 2023-05-23 18:43:28 · 353 阅读 · 0 评论 -
RedisTemplate
因为当使用jedis连接redis服务器的时候,每个线程都要拿自己创建的实例去连接redis服务端,当有多个线程的时候,不仅开销大,还需要反复创建和关闭一个jedis连接,而且也是线程不安全的,一个线程通过Jedis实例更改redis服务器中数据会影响另一个线程。而这种方式是线程安全的。Lettuce是基于Netty框架的事件驱动的Redis客户端,其方法调用是异步的,Lettuce的API也是线程安全的**,所以多个线程可以操作单个Lettuce连接来完成各种操作,同时Lettuce也支持连接池.**原创 2023-05-23 17:17:16 · 404 阅读 · 0 评论 -
redis集群读写,容错切换,从属调整,扩容,缩容
rediscluster 读写一定要注意redis实例的区间实例范围。需要路由到位。比如hashsolt=hash(k1) mod 16384=12706,而12706槽位不在6391上,在6393上。如何让rediscluster 路由到槽呢?redis-cli命令尾部加上 -c即可。防止路由失效。如果k1不在6391上,则自动路由到6393上。查看某个key 属于对应的槽位值。原创 2023-05-23 16:04:00 · 663 阅读 · 0 评论 -
redis集群实操
同时在我们指定的目录下生成了 nodes-6391conf…nodess-6392.conf文件。原创 2023-05-19 14:12:19 · 439 阅读 · 0 评论 -
redis集群之hash槽分析算法
上文提过了 hash取余算法和hash一致性算法一致性hash算法是为了减少节点数目发生改变时尽可能的减少数据迁移将所有的存储节点排在首位相连的Hash环上,每个key在计算hash后会顺时针找到临近的存储节点。而当有节点加入或退出时,仅影响该节点在hash环上顺时针相邻的节点。优点缺点刚刚提到一致性hash算法有数据倾斜问题,为了解决这个问题便又了hash槽分析算法。原创 2023-05-18 17:32:07 · 575 阅读 · 0 评论 -
Redis集群简介及槽位映射(哈希取余和一致性哈希算法)
redis cluster需求至少需要3个master才能组成一个集群,同时每个sentinel至少有一个slave节点,各个节点之间保持tcp通信。当master发生宕机,redis cluster自动将对应的slave节点提拔为master,来重新对外提供服务。先来说一下槽,集群的中每个redis实例都负责接管一部分槽,总槽数为:16384(2^ 14),如果有3台master,那么每台负责5641个槽(16284)。官网建议 集群个数不要超过1000个。原创 2023-05-17 19:09:40 · 1254 阅读 · 0 评论 -
redis哨兵监控leader和master选举原理
当一个主从配置中的master失效后,sentinel可以选举出一个新的master,用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据。是如何具体做的呢,主要有以下4步。一般建议sentinel 采取奇数台.原创 2023-05-17 14:36:23 · 915 阅读 · 0 评论 -
Redis哨兵模式
哨兵巡查监控 master主机是否故障,如果故障了,根据投票数自动将一个从库转换为新数据库,继续对外服务。原创 2023-05-16 15:13:47 · 105 阅读 · 0 评论 -
Redis 主从复制流程及缺点
slave 启动,第一次申请同步发送心跳,保持通行master 每隔10 ping 一次 slave心跳正常,增量复制master 继续将新的收集到写入命令自动依次发给slave,slave完成增量同步从机下线,重连续传master 会检查backlog里面的offset。master和slave都会保存一个复制的offset,还有一个masterId。offset是保存在backlog中的,master只会把已经复制的offset后面的数据复制给slave,类似断点续传。原创 2023-05-12 18:19:27 · 55 阅读 · 0 评论 -
Redis主从复制之薪火相传与反客为主
如果master 的从机太多,则master就有压力,因为要频发发送命令给多个从库。所以出现一个优化方案让master 的slave1从库也有从库,master 就可以减少了 slave1的所有从库的压力量。原创 2023-05-11 19:20:43 · 80 阅读 · 0 评论 -
redis主从复制之一主二从
一句话,就是master以写为主,slave 以读为主。当master 有数据变化时,自动将新数据异步同步到slave数据库中。原创 2023-05-11 19:00:36 · 126 阅读 · 0 评论 -
Redis Pub/Sub
redis 使用 publish,subscribe,unsubscribe实现发布订阅消息。Pub/Sub 的消息将被发送一次,一旦redis服务发送了消息,就不能再次发送。如果订阅者无法处理该消息,该消息将丢失。如果不想丢失消息,则可以使用redis stream,stream中的消息是持久的,并且支持最多一次,和至少一次。原创 2023-05-10 14:55:58 · 296 阅读 · 0 评论 -
Redis管道
1. pipeline与原生批量命令对比(1)原生批量命令具备原子性,pipeline非原子性(2)原生命令一次只能执行一种命令,pipeline支持批量执行不同命令(3)原生命令是服务端实现,而pipeline需要服务端和客户端共同完成2. pipeline与事物对比(1)事物具备原子性,pipeline不具备原子性(2)pipeline一次将多条命令发送到服务端,事物是一条一条的发,事物只有在接收到exec才会执行(3)执行事物会阻塞其他命令的执行,而pipeline不会。原创 2023-05-09 19:44:45 · 41 阅读 · 0 评论 -
Redis事物
以multi开启一个事物将多个命令入队到事物中由EXEC命令执行事物。原创 2023-05-09 18:24:06 · 67 阅读 · 0 评论 -
Redis持久化AOF
自Redis 7.0.0以来,Redis使用多部分AOF机制。也就是说,原始的单个AOF文件被拆分为基本文件(最多一个)和增量文件(可能有多个)。基本文件表示重写AOF时存在的数据的初始(RDB或AOF格式)快照。增量文件包含自上次创建基本AOF文件以来的增量更改。所有这些文件都放在一个单独的目录中,并由清单文件跟踪。原创 2023-05-08 18:06:31 · 85 阅读 · 0 评论 -
Redis RDB持久化参数优化
2.rdb 在保存rdb文件时,父进程唯一要做的事是fork一个子进程,接下来的工作,全部交给子进程来做,父进程不需要在做其他的操作,所以rdb的持久化方式可以最大化redis的性能。2.rdb需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是比较耗时的,可能导致redis在毫秒内不能响应客户端的请求。在存储快照后,还可以让redis进行数据校验,但这样会加大10%的性能消耗,3.与AOF相比,在恢复大的数据集时候,rdb的方式会更快一些。1.rdb 是一个非常紧凑的文件。原创 2023-05-05 18:52:38 · 113 阅读 · 0 评论 -
第十章 redis数据恢复RDB
shutdown也会生成dump.rdb文件,这个文件是shutdown之前的快照,里面是有数据的(前提redis是里面数据)不要把备份文件的dump.rdb和redis服务器放在同一台机器机器上。防止机器损坏后,备份文件也找不到了。执行 flashdb 或 flashily 也会产生dump.rdb 文件,但是里面是空的,无意义。定期生成dump.rdb 文件在硬盘上,当服务器故障或宕机后,从dump.rdb 文件恢复数据。查询 dump.rdb 文件所在目录。原创 2023-04-27 19:42:07 · 452 阅读 · 0 评论 -
第九章redis stream 特殊的ID
前两个特殊ID是-和+,用于使用XRANGE命令进行范围查询。这两个ID分别意味着最小的ID(基本上是0-1)和最大的ID(即184467440709551615-18446744073709551615)。正如你所看到的,写-和+而不是那些数字要j简洁得多。您可能已经注意到,Redis API中可以使用几个特殊ID。这里有一个简短的回顾,以便它们在未来更有意义。原创 2023-04-26 14:18:16 · 110 阅读 · 0 评论 -
第8章 stream的界限
例如:第8章 stream的界限。原创 2023-04-26 13:51:41 · 42 阅读 · 0 评论 -
redis stream消费组与kafka的的不同
Redis流中的消费者群体可能在某种程度上类似于基于Kafka(TM)分区的消费者群体,但请注意,实际上,Redis流非常不同。分区只是逻辑的,消息只是放入一个Redis key中,因此不同客户端的服务方式取决于谁准备好处理新消息,而不是从哪个分区客户端读取。例如,如果消费者C3在某些时候永久失败,Redis将继续为C1和C2提供所有到达的新消息,就好像现在只有两个逻辑分区一样。同样,如果给定的消费者比其他消费者更快地处理消息,该消费者将在同一时间单位内按比例收到更多的消息。原创 2023-04-26 13:26:07 · 436 阅读 · 0 评论 -
redis stream 消息转移原理
同一消费者组的消费者,每个消费者都接受消息的子集进行处理,并在从失败中恢复时重新读取仅发送给他们的待处理消息。然而,在现实世界中,消费者可能会永久失败,永远不会恢复。消费者停止后,从未恢复的待处理消息会发生什么?原创 2023-04-25 17:17:55 · 310 阅读 · 0 评论 -
redis消费组的创建与使用
请注意,我们可能会多次或一次处理消息(至少在消费者失败的情况下,但也涉及Redis持久性和复制的限制,请参阅有关此主题的特定部分)。这样,Alice、Bob和组中的任何其他消费者都能够从同一流中读取不同的消息,阅读他们尚未处理消息的历史记录,或将消息标记为已处理。如果ID是“>” 该命令将仅返回迄今为止从未发送给其他消费者的新消息,还有一个作用,将更新消费者组的最后一个ID。如果您还不知道XACK的工作原理,请不要担心,这里在这个消费者待处理的消息记录中移除这条已经确认的消息。原创 2023-04-25 15:57:06 · 699 阅读 · 0 评论 -
redis 消费组介绍
当消息是来自不同生产者的相同流时,那么XREAD已经提供了一种扇出到N个客户端的方法。然而,在某些问题上,我们想做的不是向多个消费者提供相同的消息流,而是向多个消费者提供来自同一流的不同消息子集。这样有一个明显的好处:通过多个消费者,加速处理消息。原创 2023-04-24 18:25:15 · 231 阅读 · 0 评论 -
第四章 key操作命令
查看还有多少秒过期,-1 表示永不过期,-2表示已过期。非阻塞删除,真正的删除会在后续异步中删除。为指定key 设置过期时间。查看当前库中所有的key。判断库中是否有key。删除指定key的数据。将key 移到指定库。原创 2023-04-23 14:28:34 · 252 阅读 · 0 评论 -
第三章 redis redisson实现分布式锁
上一章节 通过spring boot 集成了 redis ,本章在上一章的基础上集成 redisson,并实现分布式锁1.在pom.xml 文件中加入 以下 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> </dependency> <原创 2021-10-20 18:13:36 · 380 阅读 · 0 评论 -
第二章 SpringBoot使用redis
1.在pom.xml 添加org.springframework.bootspring-boot-starter-data-rediscom.fasterxml.jackson.modulejackson-module-jaxb-annotations2 .在application.yml 中配置reidsspring:redis:database: 2host: localhostport: 6379lettuce:pool:max-active: 8max-idle:原创 2021-10-15 13:19:10 · 140 阅读 · 0 评论 -
第一章 redis简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction翻译 2021-10-15 11:18:46 · 97 阅读 · 0 评论 -
Redis基础第一篇
redis 中的术语实例代表一个redis-server进程。同一台主机上可运行多个Redis实例,只要这些实例使用不同的配置即可。比如绑定不同的端口号,使用不同的路径保存持久化相关的文件,或采用不同的日志路径等。数据类型string,list,hash,set,sorted set,HyperLogLog,Goe.SET 和 GET可能是Redis 中最常用的命令了,Set"key" “...原创 2019-03-21 11:33:57 · 132 阅读 · 0 评论