![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
redis
文章平均质量分 92
循序渐进实现对redis的学习
烟雨忆南唐
这个作者很懒,什么都没留下…
展开
-
第二十三章_Redis高性能设计之epoll和IO多路复用深度解析
select 其实就是把NIO中用户态要遍历的fd数组(我们的每一个socket链接,安装进ArrayList里面的那个)拷贝到了内核态,让内核态来遍历,因为用户态判断socket是否有数据还是要调用内核态的,所有拷贝到内核态后,这样遍历判断的时候就不用一直用户态和内核态频繁切换了。多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(原创 2023-06-25 15:27:43 · 392 阅读 · 0 评论 -
第二十二章_Redis经典五大类型源码及底层实现
2 链表在内存中一般是不连续的,遍历相对比较慢而ziplist可以很好的解决这个问题,普通数组的遍历是根据数组里存储的数据类型找到下一个元素的(例如int类型的数组访问下一个元素时每次只需要移动一个sizeof(int)就行),但是ziplist的每个节点的长度是可以不一样的,而我们面对不同长度的节点又不可能直接sizeof(entry),所以ziplist只好将一些必要的偏移量信息记录在了每一个节点里,使之能跳到上一个节点或下一个节点。取值1字节时,表示上一个entry的长度小于254字节。原创 2023-06-21 10:11:34 · 1464 阅读 · 0 评论 -
第二十一章_Redis的缓存过期淘汰策略
Redis内存满了怎么办redis 一共有 4 个命令来设置键的生存时间(可以存活多久)或过期时间(什么时候被删除)上述四种命令本质上都是通过 pexpireat 命令来实现的。如果自己不小心设置错了过期时间,那么可以删除先前的过期时间。此时,如果没有移除过期时间,那么如果一个键过期了,那它什么时候会被删除呢?这个问题就会有以下三种答案了,它们分别代表三种不同的删除策略(定时删除、惰性删除、定期删除)。redis默认内存多少?在哪里查看?如何设置修改?查看Redis最大占用内存。原创 2023-06-07 11:39:34 · 547 阅读 · 0 评论 -
第二十章_Redis分布式锁Redlock算法和底层源码分析
首先,我们假设客户端能够在大多数实例中获取锁所有实例都将包含一个具有相同生存时间的密钥,然而,这个key是在不用时间设置的,所以过期也会在不同的时间过期,假设第一个key设置时间T1,最后一个key设置时间t2,我们确定第一个key的过期时间至少是MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT,所以所有的key设置超时至少是这个时间,在设置大多数密钥期间,另一个客户端将无法获取锁,因为如果已经存在N/2+1个密钥,则N/2+1 set NX操作无法成功。原创 2023-06-06 13:55:22 · 830 阅读 · 0 评论 -
第十九章_手写Redis分布式锁
在目标锁对象的计数器不为零的情况下,如果锁对象的持有线程是当前线程,那么 Java 虚拟机可以将其计数器加1,否则需要等待,直至持有线程释放该锁。是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。不同进程jvm层面的锁就不管用了,那么可以利用第三方的一个组件,来获取锁,未获取到锁,则阻塞当前想要运行的线程。指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。原创 2023-06-01 10:06:23 · 888 阅读 · 0 评论 -
第十八章_Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透
第一次来查询uid:abcdxxx,redis和mysql都没有,返回null给调用者,但是增强回写后第二次来查uid:abcdxxx,此时redis就有值了。如果发生了缓存穿透,我们可以针对要查询的数据,在Redis里存一个和业务部门商量后确定的缺省值(比如,零、负数、defaultNull等)。黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询。,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这种现象称为缓存穿透,这个redis变成了一个摆设。原创 2023-05-26 10:56:10 · 1363 阅读 · 0 评论 -
第十七章_Redis布隆过滤器BloomFilter实战
使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,因此误判的根源在于相同的 bit 位被多次映射且置 1。因为删掉元素会导致误判率增加,因为hash冲突同一个位置可能存的东西是多个共有的,你删除一个元素的同时可能也把其它的删除了。发现存在黑名单中的,就执行特定操作。原创 2023-05-19 14:42:10 · 721 阅读 · 0 评论 -
第十六章_Redis案例落地实战bitmap/hyperloglog/GEO
截至2020年3月31日的12个月,京东年度活跃用户数3.87亿,同比增长24.8%,环比增长超2500万,此外,2020年3月移动端日均活跃用户数同比增长46%假设10%左右的用户参与签到,签到用户也高达3千万。2 一个月最多31天,刚好我们的int类型是32位,那这样一个int类型就可以搞定一个月,32位大于31天,当天来了位是1没来就是0。距离的单位和用户给定的范围单位保持一致。georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。原创 2023-05-17 14:14:47 · 469 阅读 · 1 评论 -
第十五章_Redis与MySQL数据双写一致性工程落地案例
canal [kə'næl],中文翻译为 水道/管道/沟渠/运河,主要用途是用于 MySQL 数据库增量日志数据的订阅、消费和解析,是阿里巴巴开发并开源的,采用Java语言开发;canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL数据库增量日志解析,提供增量数据订阅和消费。5、salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;4、slave 从服务器将接收到的二进制事件日志保存至自己本地的中继日志文件中;原创 2023-05-12 11:05:56 · 667 阅读 · 0 评论 -
第十四章_缓存双写一致性之更新策略探讨
也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存,达到一致性,3 如果能够成功地删除或更新,我们就要把这些值从消息队列中去除,以免重复操作,此时,我们也可以保证数据库和缓存的数据一致了,否则还需要再次进行重试。(1)请求A进行写操作,删除redis缓存后,工作正在进行中,更新mysql......A还么有彻底更新完mysql,还没commit。A删除缓存后,B查询操作没有命中缓存,B先把老数据读出来后放到缓存中,然后A更新操作更新了数据库。原创 2023-05-11 10:05:34 · 436 阅读 · 0 评论 -
第十三章_Redis中的BigKey
其次,对于同时删除多个 key 的需求,在主动删除的场景下,我们其实是有办法的 -- 分批删除,比如对于一个大的集合,我们可以通过 scan 以循环的方式每次扫描 100 个键然后删除,对于多个 key 的删除,就直接按 key 分批处理就行了,虽然是麻烦了点,却是可以保证不对主线程造成影响;所以,从这个过程我们又了解到,在执行删除命令的时候,redis 会优先判断 key 是否已经过期,如果 已经过期且是主库,则按照过期键删除策略对 key 进行删除,然后还要将同步删除命令到 AOF文件 和 从节点。原创 2023-05-10 11:36:34 · 767 阅读 · 0 评论 -
第十二章_Redis单线程 VS 多线程
主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。I/O 的读和写本身是堵塞的,比如当 socket 中有数据时,Redis 会通过调用先将数据从内核态空间拷贝到用户态空间,再交给 Redis 调用,而这个拷贝的过程就是阻塞的,当数据量越大时拷贝所需要的时间就越多,而这些操作都是基于单线程完成的。,你站在讲台上等,谁解答完谁举手。原创 2023-05-10 10:13:56 · 304 阅读 · 1 评论 -
第十一章_SpringBoot集成Redis
3、lettuce作为新式的redis客户端,基于netty采用异步非阻塞式IO,是线程安全的,优点是提供了很多redis高级功能,例如集群、哨兵、管道等,缺点是api抽象,学习成本高。4、redission作为redis的分布式客户端,同样基于netty采用异步非阻塞式IO,是线程安全的,优点是提供了很多redis的分布式操作和高级功能,缺点是api抽象,学习成本高。Lettuce是一个Redis的Java驱动包,Lettuce翻译为生菜,没错,就是吃的那种生菜,所以它的Logo长这样。原创 2023-04-28 14:47:30 · 866 阅读 · 0 评论 -
第十章_Redis集群(cluster)
Redis主节点的配置信息中它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。cluster-require-full-coverage: 默认值 yes , 即需要集群完整性,方可对外提供服务 通常情况,如果这3个小集群中,任何一个(1主1从)挂了,你这个集群对外可提供的数据只有2/3了, 整个集群是不完整的, redis 默认在这种情况下,是不会对外提供服务的。原创 2023-04-26 10:15:49 · 533 阅读 · 0 评论 -
第九章_Redis哨兵(sentinel)
Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据。表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据。原创 2023-04-23 14:31:49 · 888 阅读 · 0 评论 -
第八章_Redis复制(replica)
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。原创 2023-04-21 10:53:17 · 329 阅读 · 0 评论 -
第七章_Redis发布订阅
以上的缺点导致Redis的Pub/Sub模式就像个小玩具,在生产环境中几乎无用武之地,为此Redis5.0版本新增了Stream数据结构,不但支持多播,还支持数据持久化,相比Pub/Sub更加的强大。发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布。是一种消息通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递。消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功。原创 2023-04-20 09:46:43 · 64 阅读 · 0 评论 -
第六章_Redis管道
如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了,性能不太好,o(╥﹏╥)o。1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。2 服务端处理命令,并将结果返回给客户端。原创 2023-04-17 11:03:41 · 422 阅读 · 0 评论 -
第五章_Redis事务
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的。因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了。一个队列中,一次性、顺序性、排他性的执行一系列命令。原创 2023-04-17 10:42:13 · 345 阅读 · 0 评论 -
第四章_Redis持久化
将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。2:与此同时,主进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。4:当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中。原创 2023-04-14 18:32:46 · 428 阅读 · 0 评论 -
第三章_Redis的十大数据类型
millisecondsTime指的是Redis节点服务器的本地时间,如果存在当前的毫秒时间戳比以前已经存在的数据的时间戳小的话(本地时间钟后跳),那么系统将会采用以前相同的毫秒创建新的ID,也即redis 在增加信息条目时会检查当前 id 与上一条目的 id, 自动纠正错误的情况,一定要保证后面的 id 比前面大,一个流中信息条目的ID必须是单调增的,这是流的基础。Redis 发布订阅 (pub/sub) 有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。原创 2023-04-14 15:40:06 · 431 阅读 · 0 评论 -
第二章_Redis的安装与配置
自己购买云服务器自己购买阿里云、青牛云、腾讯云或华为云服务器,自带CentoOS或者Ubuntu环境,直接安装。VMWare本地虚拟机VMWare虚拟机的安装,下载VMWare虚拟机安装直接默认安装即可。如何查看自己的linux是32位还是64位Redis的安装注意,日常用什么系统安装由于企业里面做Redis开发,99%都是Linux版的运用和安装,几乎不会涉及到Windows,上一步的讲解只是为了知识的完整性,Windows版不是重点,企业实战就使用一个Linux版本。Window 下安装。原创 2023-04-08 17:08:10 · 250 阅读 · 0 评论 -
第一章_Redis入门概述
是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。7.0 版本中一个比较大的变化就是 aof 文件由一个变成了多个,主要分为两种类型:基本文件(base files)、增量文件(incr files),请注意这些文件名称是复数形式说明每一类文件不仅仅只有一个。,当然,O(∩_∩)O哈哈~,如果你是从零开始的新系统,直接上Redis7.0-GA版。原创 2023-04-08 12:06:35 · 230 阅读 · 0 评论