Redis学习进阶
文章平均质量分 75
skye_fly
这个作者很懒,什么都没留下…
展开
-
Redis 6新特性以及与Memcached、RocksDB比较
1. 多线程网络IO采用epoll的机制,实现一个Redis服务端接收多个客户端的并发网络IO请求(避免有时候Redis服务端处理速度快,而网络IO传输客户端请求慢,造成Redis CPU空闲),网络IO多线程连接,处理请求的还是单线程。2. 客户端缓存Redis服务端一次读取一定数据,将这些key-value缓存在客户端,下次客户端可以直接在自己内存中获取数据(当Redis中某些缓存在客户端的key-value值改变后会以广播形式通知相应的客户端,使得客户端内的数据缓存失效,客户端需要向Redis注原创 2021-09-08 12:25:54 · 685 阅读 · 0 评论 -
Redis秒杀 + 数据倾斜
一、秒杀秒杀活动主要分为三个阶段:秒杀前:尽量将活动页面静态化,因为此时用户会频繁刷新页面,使用CDN以及浏览器缓存进行加速;秒杀时:查询库存 — 扣减库存 — 支付订单(只有查到库存数据的人才能进行后两步操纵)Redis主要支持原子性的查询库存和扣减库存操作(Lua脚本或者分布式锁),因为并发访问量大,不能交给后端数据库处理,而且上述原子性操作可以保证不会出现库存信息更新延迟导致实际用户查到超额的库存量并完成下单操作(避免超额销售)秒杀后:用户刷新频率变低,并发压力小。建议:原创 2021-09-06 14:15:39 · 261 阅读 · 0 评论 -
Redis主从读写分离存在的问题
对比Mysql主从分离问题,数据库的主从分离大概可以从两方面考虑:A) 数据读不一致问题 MySQL:采用事务位点标记的方法,在从库中无法读取到未执行的事务中的数据 + 加速同步措施(多线程刷binlog…) Redis:主从同步延迟监控机制 + 同步删除 + 加速同步措施(RDB大小限制…)B) 主从切换问题 MySQL:主从事务同步位点机制 Redis:哨兵跨服务器访问 + 调整心跳响应上限以下分析Redis中的主从分离问题1. 主从不同步—从库读到旧数据Redi.原创 2021-09-04 12:26:36 · 645 阅读 · 0 评论 -
Redis的原子操作(SET NX PX,Lua,单、多实例分布式锁 )
摘要:1. 单原子性指令2. Lua脚本原子性执行多指令3. Redis实现分布式锁3.1 单Redis实例保证锁的可靠性和高效性3.1.1 加锁:A) SET NX指令作为加锁的单原子性指令B) 设置锁自动释放的有效时间,看门狗C) 加锁释放锁操作对应唯一的客户端3.1.2 释放锁:A) 使用Lua脚本判断是否是加锁的同一个客户端3.2 Redis master集群保证锁的可靠性+可用性3.2.1 Redlock算法:N/2 +1 条件以及重计算锁有效时间机制ps: 所有并..原创 2021-09-03 13:44:40 · 6295 阅读 · 0 评论 -
Redis缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透
先放总结图:异常一:缓存与数据库数据要保持实时一致性如果Redis为只读模式,更新数据时直接更新MySQL里的数据,同时删除Redis里的旧数据;如果Redis为读写模式,更新数据时Redis和MySQL中都要更新,存在两个问题。1. Redis与数据库中各自操作成功/失败的原子性 ------ 成功/失败问题解决方案: 消息队列,更新失败后可以再次从消息队列读取更新信息,再次更新;2. 高并发时,Redis与数据库更新操作间隔时间内有客户端请求,此时得到的数据是旧数据(旧数据可能会原创 2021-09-01 11:11:39 · 105 阅读 · 0 评论 -
Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染
一、应该给Redis分配多少内存空间八二原则:80%的请求都是访问数据库中同样的20%的数据(热点数据只占20%),所以一般给Redis分配15% - 30%数据总量的内存空间(只保存热点数据,冷数据被访问少,直接到数据库访问)二、Redis八种内存淘汰机制三、LRU算法传统LRU算法:底层维护一个双向链表,每个节点存放一个数据,当某个数据被访问时,该节点会被放到链表头部(MRU端),当触发内存淘汰时会先删除链表的尾部(LRU端)。缺点:每个数据都要一个链表节点维护,内存开销大,频繁移动链表,原创 2021-08-31 12:46:18 · 1187 阅读 · 0 评论 -
Redis缓存(一):缓存机制与读写策略
一、缓存的两大特点快速父系统中存放慢速子系统的部分高频访问数据,以免快速运行的CPU被慢速的磁盘、内存读写拖累性能(CPU缓存:存放部分内存数据; 内存缓存:存放部分磁盘数据)。缓存只占据父系统存储空间的一部分(约高级的父系统所拥有的存储空间越小)。二、 旁路缓存就是指Redis作为缓存,只能被动的被调用(程序中通过redisTemplate来读写redis内存中的数据,需要显示的手写调用内存的程序块,而其他内存空间可以直接被CPU访问,无需程序员显示调用)。三、 Redis与MySQL配合原创 2021-08-30 11:12:32 · 1244 阅读 · 0 评论 -
Redis变慢的五大原因以及排查方法
一、 慢操作五大原因如下图所示,主要分为与操作系统相关以及与Redis集群实例之间与内部相关两个方面1. Redis实例之间以及内部数据传输阻塞(客户端、磁盘、主从通信、切片集群通信)解决方法 — 主从集群时,限制主库RDB文件大小。2. 多CPU多核架构(绑核,绑CPU)解决方法—绑核绑CPU。3. sql语句执行阻塞(慢查询、过期key)解决方法—避免慢查询指令、客户端做聚合、对key设置不同的过期时间、使用异步线程删除bigkey。4. AOF文件系统,RDB大内存页(A原创 2021-08-29 12:33:12 · 12687 阅读 · 0 评论 -
Redis内存空间与缓冲区
一、内存空间删除数据后释放的内存会交给内存分配器,并不会直接返还给操作系统—导致Redis仍然持有这些内存,但实际不能使用。(跟MySQL一样明明删除了数据还是没有显示释放内存,需要经过内存整理操作系统才能获得该部分内存)1. 内存碎片产生的原因操作系统分配内存机制:操作系统每次都是按照固定大小分配内存,8、16、32字节等,会预分配一些内存给程序(为了减少内存分配操作次数);Redis业务复杂,每次增删改查的数据所需内存空间不一致,数据删除修改时会导致内存空间的移动。2. Redis碎片自动原创 2021-08-28 18:19:51 · 429 阅读 · 0 评论 -
Redis五大影响性能原因(三四五):慢操作
一、慢操作排查处理步骤判断当前情况是否属于慢操作(基线性能);系统性排查慢操作的原因(Redis本身、AOF文件操作磁盘IO、操作系统内存swap磁盘IO);从应对方案中选择合适的方法加快Redis响应速度。二、 如何判断是否是慢操作:用指令查询当前环境下Redis的基线性能,再查询当前应用Redis的延迟,如果达到两倍以上基线性能说明当前是慢操作。三、 排查慢操作3.1 针对Redis本身A) sql语句慢造成延迟:可以用 Redis日志查看sql语句的执行情况,判断是否变慢了(类似原创 2021-08-27 21:12:28 · 738 阅读 · 0 评论 -
Redis五大影响性能原因(二):多CPU多核架构
一、先放结论:影响原因一(同CPU不同核,多核架构影响):程序在不同核之间切换运行时会有上下文切换(context switch),也就是要将程序原来放在核1上的数据迁移到核2上,影响程序指令执行速度。解决方案:将Redis与某个核绑定,防止Redis进程在不同核之间切换。影响原因二(不同CPU不同核,多CPU架构影响):程序执行时需要通过网络中断程序得到网络数据,当网络中断程序与本程序在不同的CPU上执行时,需要“走远端内存访问”,有通信延迟。解决方案:将网络中断程序与Redis程序原创 2021-08-26 13:57:48 · 937 阅读 · 1 评论 -
Redis五大影响性能原因(一):Redis实例内部的阻塞操作
思路:1.建立一张redis主从切片集群图 ->->2.以一个切片节点为中心考虑其与周围节点会造成阻塞的情况 ->->3.对每一个阻塞情况考虑其是否是客户端需要的返回数据决定是否可以用异步子线程处理一、Redis实例内部阻塞的四大原因客户端:网络 IO,键值对增删改查操作,数据库操作;磁盘:生成 RDB 快照,记录 AOF 日志,AOF 日志重写;主从节点:主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数据库、加载 RDB 文件;切片集群实例:向原创 2021-08-25 11:10:52 · 471 阅读 · 0 评论 -
Redis作为消息队列
一、消息队列的三个要求消息有序执行(有序性);由于网络阻塞等原因,消息不会被重复执行(幂等性);宕机后,消息不会丢失(可靠性)。二、Redis实现消息队列Redis中可以使用List或者Streams两种数据结构来满足以上消息队列的要求List有序性:list本身就是先进先出,天然支持有序性(高并发时需要多个消息队列,每个队列保存同一个服务的消息,对应消费该服务消息的消费者);幂等性:生产者在将消息加入队列时,会给每条消息加上一个id,消费者执行消息时会根据该id判断自己之前原创 2021-08-24 12:53:47 · 796 阅读 · 0 评论 -
Redis的事务操作与统计操作
一、Redis的事务操作使用WATCH 可以实时监控某个数据是否被其他线程改变,可以及时退出当前事务;- MULTI, EXEC标志事务的开始和结束;C. 为了满足原子性(Redis为部分原子性),要先将命令按序写入一个队列,当执行完EXEC指令再依次执行队列中的命令(执行队列中的命令时不会被其他请求打断,遇到无法执行的命令(相当于运行时错误)时会跳过执行下一句命令,所以不能保证队列中的所有命令都被执行);D. 当还没有执行EXEC指令时,当前输入的命令被检测到错误(相当于编译时错误)无法加入队列原创 2021-08-23 11:51:27 · 195 阅读 · 0 评论 -
Redis如何选择合适的数据结构(以RedisTimeSeries为例)
一、选择合适的存储数据结构的步骤:考虑该类数据的读写频率以及一对多还是一对一的键值对关系,选择适合的几个基本数据类型(Redis基于内存,写的速度基本可以保证);根据需要对数据进行的操作,筛选或者组合使用以上的数据类型(同时需要单点查询以及范围查询的可以组合使用Hash以及ZSet,就是同一条记录保存两次,注意组合数据结构时需要启用事务操作来写数据);为了进一步优化,给以上第二步选取的数据结构类型选择合适的底层实现数据结构(比如Hash类型,数据长度短就使用zipList,长就使用HashTable原创 2021-08-23 11:42:18 · 1715 阅读 · 0 评论 -
Redis的扩展数据类型以及自定义数据类型
一、扩展数据类型除了String、List、Set、ZSet、Hash以外还有Bitmap、HyperLogLog、GEO等Bitmap:主要用来做二进制数据的统计(数据内容只有0/1状态);HyperLogLog:主要用来统计海量的不重复数据数量;GEO:主要用来保存经纬度数据。扩展知识:Redis如何存储经纬度数据,并且比较两个经纬度数据表示的地理位置的相近情况(应用于当前地图定位软件,外卖、打车…)。不只是在Redis中,其他应用中(116.025489, 30.02546)和(12原创 2021-08-22 15:52:03 · 570 阅读 · 0 评论 -
不同场景Redis集合类型数据结构的选择(Hash、List、Set、Zset各数据类型的最大存储长度)
先给出指导意见:多个集合操作(聚合操作)----用Set;集合数据排序(排序操作) ---- 分页排序建议使用ZSet;集合数据只有0、1两种状态(二值型数据)----------- 0/1状态数据建议使用Bitmap;集合中不重复元素个数(基数统计)----如果数据量达到亿级的话建议使用HyperLogLog。1. 多个集合操作(聚合操作)Set—求多个集合数据的并、差、交集(求并、差、交集计算量大,可以选一个从库单独进行,或者将多个集合返回客户端,到客户端进行计算)2. 集合数据排序原创 2021-08-21 19:22:08 · 2550 阅读 · 0 评论 -
Redis的String,Hash与ziplist压缩列表数据结构(节省空间向)
一、String数据结构存放数据1. String优点:String可以保存二进制字节流,任何数据转换成二进制字节流就可以用String来存储,比较万金油;2. 缺点:String保存数据时占用的内存空间比其他数据结构更多(保存数据包含字符时底层使用SDS简单动态字符串);3. 为什么String类型会占用更多的空间底层String类型的数据是怎么保存的:一个字符型String占用空间 = SDS结构体占用空间 + RedisObject元数据区占用空间 + HashMap的entry结构体原创 2021-08-20 13:59:42 · 1419 阅读 · 0 评论 -
Redis的切片集群(Redis Cluster)以及集群管理
首先放上一张整合redis切片集群与主从库的关系图,可以结合该图阅读下面文字。一、数据库的扩容机制纵向扩展:增大服务器的内存,磁盘容量;横向扩展:增加多台服务器。如果数据量在一定范围内,且不需要开启持久化可以选择使用纵向扩展,一般选择横向扩容(持久化时需要fork主进程,会拷贝一份主进程的内存,如果内存中数据量大,该fork过程就需要很长时间,而fork是会阻塞主线程处理客户端请求的)。二、为什么使用切片集群百万千万级的大数据量时:单机Redis部署需要很大的内存,硬件成本高;大数据原创 2021-08-19 15:23:15 · 395 阅读 · 0 评论 -
Redis的主从库以及哨兵机制
先放上一张总结的Redis主从集群、pub/sub通信、哨兵选主机制图,可以结合图阅读后面的文字一、 主-从-从级联模式主从备份过程主从库建立长连接 — 从库申请备份数据 — 主库fork子进程 — 子进程将RDB文件发送给从库(主库的主进程同时将更新的数据记入replication buffer,同时主库无论何时都会将自己的更新操作记入一个叫repl_backlog_buffer的环形缓冲区) — 从库清空原有数据并读取RDB快照完成复制 — 主库发送replication buffer中的指令给从原创 2021-08-18 13:32:14 · 211 阅读 · 0 评论 -
Redis的RDB文件快照
一、 对哪些数据做快照做的是全量快照(增量快照指的是第一次做全量快照,之后增量文件只记录每个时刻对数据的修改,会导致增量文件过大)二、 快照时会阻塞主线程吗利用写时复制技术(fork一个子进程进行快照,期间对于主线程中的数据的修改操作会先拷贝出该数据,然后再拷贝的数据上修改,保证快照截取的是一个时间点的数据),保证不影响主进程中的数据读写。fork操作会拷贝一份和主进程一模一样的子进程,但是它们拥有的内存空间独立,内存中的数据是一样的,两个进程可以各自独立地操作它们内存中的数据。利用写时复制技术子原创 2021-08-17 10:29:01 · 421 阅读 · 0 评论 -
Redis的AOF日志
一、写前日志与写后日志:主要针对的是数据库数据的落盘方式MySQL支持的是WAL(Write Ahead Log)写前日志,会先将数据变动写入redo和bin log(此前会将数据先在内存中修改),最后在数据库有空时将数据写入磁盘。Redis支持写后日志,是先将数据写入内存,再写日志(其实就是MySQL执行bin log前的操作),AOF记录的是每一条sql语句的原句(类似于bin log的statement格式),以文件形式保存。二、为什么Redis采用写后日志的形式因为Redis在写AOF原创 2021-08-16 14:06:18 · 607 阅读 · 0 评论 -
Redis的线程机制与IO多路复用
Redis底层存在多个线程单线程是指Redis 的**键值对读写(执行sql语句)**是由一个线程来完成的。主进程中的主线程:负责读,写,删除操作;主进程中的子线程:负责AOF的I/O子线程,负责数据的延迟删除子线程;子进程中的子线程:负责RDB以及主从同步的子线程。IO网络模型与Reids中的IO网络网络I/O模型执行流程:listen/bind — accept(建立连接,会阻塞) — recv(接收数据,会阻塞) — parse(解析数据) — write(操作数据) — sen原创 2021-08-15 12:25:44 · 349 阅读 · 0 评论 -
Redis为什么那么快
Redis快的原因:内存数据库,缓存快速特性;用HashMap保存键值:key对应的value是指向具体存储对象地址的指针(value不是保存的string、list、set、zset、hash对象),所以获取元素值的过程分为两步:A) 无论HashMap数组中有多少个桶,对于一个key,只需要计算它的hash值(二次hash)就可以得到数组下标,然后O(1)查询指针(和具体数据量没有关系);B) 根据指针指向的地址得到数据具体的值(速度由各自的数据底层的数据结构有关)。3. 使用原创 2021-08-14 14:05:33 · 437 阅读 · 0 评论