Redis总结

Redis基础

Redis的数据是存在于内存中的,读写速度快,广泛应用于缓存方向并且Redis存储的是键值对数据。

Redis读写速度快的原因:1.基于内存;2.高效的事件处理模型,如单线程事件循环、IO多路复用;内置多种优化后的数据结构实现。

使用Redis或缓存的原因:1.读取数据的速度更快,具有高性能;2.可以承受的请求数量更多,具有高并发。

缓存读写策略

旁路缓存模式

旁路缓存模式是平常使用较多的模式,适合读请求较多的场景。
写:1.先更新db;2.删除缓存中对应值
读:1.从缓存中取数据,若有直接返回;2.若缓存中没有想要的数据,从db中取数据;3.将取到的数据缓存(客户端将数据放入缓存中)

写入过程不管是先更新db后删除缓存还是先删除缓存后更新db都可能导致数据不一致问题,先更新db后删除缓存导致数据不一致的概率小的多。要解决数据一致性问题需要加锁。

由于缓存最开始是空的,所有首次请求数据都需要从db中取,要解决该问题可以提前将热点数据放入缓存。

若写操作频繁会导致缓存的数据不断被删除,影响缓存命中率,要解决该问题面对强一致性场景加锁更新db同时更新缓存,面对允许短暂时间数据不一致场景更新db后更新缓存并设置较短的缓存过期时间(数据不一致的影响较小)。

读写穿透模式

读写穿透模式服务端把缓存看成主要的数据存储,读写都先通过缓存。
写:1.先查缓存,若缓存不存在直接更新db;2.若缓存存在,先更新缓存,缓存再更新db
读:1.先从缓存中读取数据,若缓存存在直接返回;2.若缓存不存在,缓存先从db中加载数据后返回

存在首次请求数据一定不在缓存中问题,可对热点数据提前放入缓存中。

异步缓存写入模式

异步缓存写入模式与读写穿透模式相似,只在写入时若缓存存在,只更新缓存不直接更新db,采用异步批量的方式更新db。当缓存服务失效并且还有数据未更新至db时会导致数据不一致,适合数据经常变化数据一致性要求不高的场景。

Redis的应用

Redis可以用于缓存、分布式锁、消息队列。

Redis实现分布式锁

在分布式系统下,需要使用分布式锁实现资源的互斥访问。
使用Redis的Set保证互斥性,获取锁时,查看Set中key值是否存在,若不存在设置key值获得锁,释放锁时删除Set中的key值。
为了避免释放锁程序崩溃导致锁无法释放,需要给key设置过期时间,监控程序会查看获得锁的线程是否执行完成,若还未执行完成监控程序会延长过期时间,反之不延长过期时间等待过期。

Redis实现消息队列

通过Redis的List实现。

Redis数据结构

Redis有5种基本数据结构:String、List、Hash、Set、Zset和3种特殊数据结构:Bitmap、HyperLogLog、GEO。

Zset是有序集合;Bitmap存储连续的二级制数字;HyperLogLog统计独立总数,不管数据多少只占12k标准误差为0.81%;GEO存储地理位置信息。

String可用于常规数据、序列化后对象存储;
List可用于消息队列;
Hash可用于存储购物车等修改频繁信息;
Set可用于记录点赞等信息;
Zset可用于记录排行榜等信息;
Bitmap可用于记录用户签到情况(时间作为下标)、活跃用户情况(用户id作为下标);
HyperLogLog可用于数量巨大的计数,如热门网站每月访问ip数统计;
GEO可用于附近的人功能。

Redis持久化机制

内存数据的持久化就是将内存中的数据写入到硬盘中,Redis支持3种持久化方式:1.快照;2.只追加文件;3.快照和追加文件混合。

快照

Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。

追加文件

追加文件的方式比快照的实时性更好,每执行一条会更改Redis数据的命令,首先会写入追加文件缓冲区,接着写入追加文件,最后同步到硬盘中。随着追加文件的变大,需要定期对追加文件进行重写(重写后保存的数据库状态相同,但是文件体积变小)达到压缩的目的。

快照和追加文件混合

使用混合持久化,追加文件在重写的时候直接将快照的内容写到追加文件的开头。

Redis线程模型

Redis主要逻辑是单线程完成的,4.0版本增加多线程处理大键值对的删除,6.0版本增加多线程处理IO。

Redis整体流程:多个客户端连接套接字->IO多路复用程序监听连接->将套接字关联相应的事件处理器->依次处理事件。

Redis主要逻辑使用单线程的原因:单线程编程容易维护容易、Redis瓶颈不在CPU主要是在内存和网络、多线程会出现死锁线程上下文切换等问题可能会影响性能。

Redis主要逻辑使用单线程,但后台有一些线程用于执行一些比较耗时的操作,如释放持久化过程中产生的临时文件资源、追加文件同步到磁盘、释放已删除大键值对的内存空间。

Redis内存管理

由于内存的空间是有限的,不能保存所有的数据,所以Redis提供设置过期时间的功能。

Redis常用过期数据删除策略:
1.惰性删除:只在取出key的时候检查是否过期;
2.定期删除:每隔一段时间抽取一批key删除过期key。

过期删除策略可能还是会漏掉大量的过期key导致内存不足。
Redis还提供了6种数据淘汰策略:
1.从设置过期时间的数据中挑选最近最少使用的数据淘汰。
2.从设置过期时间的数据中挑选将要过期的数据淘汰。
3.从设置过期时间的数据中随机挑选数据淘汰。
4.从所有数据中挑选最近最少使用的数据淘汰。
5.从所有数据中随机挑选数据淘汰。
6.新写入操作报错。

Redis性能优化

1、使用批量操作减少网络传输。
2、随机设置过期时间避免大量key集中过期。
3、选择合适的数据结构避免大key问题。
4、对热点key进行读写分离、部署在多个Redis节点、本地缓存等操作。

Redis生产问题

缓存穿透

访问不存在的key,直达数据库,造成数据库巨大压力或宕机。
措施:
1、缓存无效key。
2、设置过滤器,无效key直接返回。

缓存击穿

热点key过期的瞬间大量请求直达数据库,造成数据库巨大压力或宕机。
措施:
1、设置热点key永不过期。
2、请求数据库写数据到缓存需要获得互斥锁,数据库只能单个访问,之后的请求可以访问Redis。

缓存雪崩

缓存同一时间大面积过期,导致大量请求直达数据库,造成数据库巨大压力或宕机。
措施:
1、随机设置过期时间避免同时过期。
2、部署多个Redis缓存。
3、增加本地缓存。
4、启动限流降级措施。

Redis常见阻塞原因

慢查询、创建快照、追加文件相关处理(记录,刷盘,重写)、删除大key。

Redis集群

主从复制模式

Redis提供复制功能,可以实现当一台服务器中的数据更新后,自动将更新的数据同步到其他服务器上。主服务器可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从服务器。而从服务器一般是只读的,并接受主服务器同步过来的数据。一个主服务器可以拥有多个从服务器,而一个从服务器只能拥有一个主服务器。引入主从复制机制可以实现读写分离,分担主服务器的压力。若主服务器宕机,需要手动把一台从服务器切换为主服务器。

哨兵模式

哨兵是一个独立的进程,哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个 Redis 服务器。多个哨兵监控Redis服务器,各个哨兵之间也会相互监控。当一个哨兵发现主服务器不可用,所有哨兵对主服务器进行确认是否可用,当一定数量的哨兵确认主服务器不可用时进行故障切换将一个从服务器切换成主服务器,并通知从服务器切换主机。但是该模式当容量达到上限时,在线扩容复杂。

Cluster 集群模式

Cluster 集群模式实现了Redis的分布式存储,Redis 集群有16384个哈希槽,每个 key 通过CRC16校验后对 16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。在该模式下,很容易添加或删除Redis节点,若添加Redis节点,将原本节点的一部分hash槽分给新节点;若删除Redis节点,将该节点负责的hash槽分给其他节点。

为了保证高可用,Cluster集群引入了主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点ping一个主节点 A 时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。若主从节点都宕机,则该集群无法再提供服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值