• Redis〔篇〕


    目录

    redis怎么做到双写一致性呢?

    Redis数据持久化?

    数据过期策略?

    数据淘汰策略

    Redission分布式锁

    主从数据同步的流程是什么?

    哨兵的作用

    哨兵模式(脑裂问题)

    分片集群:

    Redis分片集群中数据是怎么存储和读取的?


    redis怎么做到双写一致性呢?

    这个是要分情况的 业务要是对一致性要求不是很高的话可以使用延时双删,要强一致的话需要双写一致性。


    Redis数据持久化?

    redis是有两种数据持久化方式的,一种RDB一种AOF

    1. rdb是redis数据快照,它是把内存中所有记录保存在磁盘中的。当redis实例出现故障后从磁盘读取快照文件进行数据恢复;
    2. aof采用的是一种刷盘策略,可以设置everysec每秒进行一次刷盘,记录操作命令,当redis出现故障后,会根据记录的命令重新执行达到数据恢复的效果。


    数据过期策略?

    有两种 惰性删除和定期删除

    • 惰性删除:设置key的过期时间后,不用去管它,等到下次需要这key的时候然后检查是否过期,过期然后进行删除。(如果下次一直不使用key,那么就会一直存在内存中,不会被释放)
    • 定期删除:每隔一段时间会对一些key进行检查,删除里边过期的key。
    • 一般是惰性删除和定期删除配合使用。

    数据淘汰策略

    当redis中内存不够用时,再向redis中添加新的key,那么redis就会按照某一种规则将内存中的数据删除掉,就称为内存淘汰策略。

    redis支持8种不同策略来选择要删除的key;

    1. noeviction: 不淘汰任何key,但是内存满时不允许写入新数据(默认就是这种策略);
    2. volatile-ttl:对设置了过期时间的key,比较key剩余的ttl值,值越小越先被淘汰;
    3. allkeys-random: 对全体key,随机进行淘汰;
    4. volatile-random:对设置了过期时间的key,随机进行淘汰;
    5. allkeys-lru:对全体key基于LRU算法进行淘汰(最少使用时间);
    6. volatile-lru:对设置了过期时间的key基于LRU算法进行淘汰;
    7. allkeys-lfu:对全体key基于LFU算法进行淘汰(最少使用频率);
    8. volatile-lfu:对设置了过期时间的key基于LFU算法进行淘汰;

    Redission分布式

    • redis实现分布式锁是利用了redis的setnx命令。
    • 首先还是进行加锁操作,加锁成功后会另开一个线程去监听持有锁的线程(看门狗机制)对锁过期时间进行续期。
    • 加锁和设置过期时间都是基于lua脚本完成的
    • Redisson分布式锁是可重入的;


    主从数据同步的流程是什么?

    1 主从全量同步:从节点发送请求给主节点master,master节点判断是不是第一次请求,是的话返回master的数据信息,master执行bgsave生成RDB文件,从节点然后清空本地数据,加载RDB文件,在主节点生成RDB文件期间有别的命令会记录在repl_backlog日志文件中,再把日志文件中的命令发送给从节点,从节点进行执行。

    2 主从增量同步: 从节点向主节点发送请求,主节点判断是不是第一次同步,不是第一次同步的话,主节点会在repl_log中获取offset之后的数据 发送给从节点,从节点进行增量同步。


    哨兵的作用

    1 监控 :Sentinel会不断检查master和slave是否按预期工作;(发送ping命令)

    2 自动故障恢复: 如果master节点发生故障,Sentinel会将一个slave节点提升为master节点。

    3 通知:集群发生故障时,会将最新信息推送给redis客户端。


    哨兵模式(脑裂问题)

    1 最少的salve节点为一个

    2 数据同步延迟不能超过5秒


    分片集群:

    解决了哨兵模式不能承受高并发写的问题

    还有海量数据存储问题

    • 集群中有多个master节点,每个master节点保存不同的数据。(解决了高并发写)
    • 每个master都有多个slave节点。(解决了高并发读的问题)
    • master之间可以互相检测(监控)
    • 可以访问任意节点,会把请求路由到正确的节点。

    Redis分片集群中数据是怎么存储和读取的?

    哈希槽是0-16383,每个key通过CRC16校验后对16384取模。


    Redis是单线程的为什么还那么快?

    • redis是基于内存操作的,执行速度快。
    • 采用单线程,避免上下文切换,多线程还得考虑线程安全问题。
    • 使用I/O多路复用模型,非阻塞IO。

    I/O多路复用模型:redis是基于内存操作的,执行速度非常快,它的瓶颈是网路延迟而不是执行速度,I/O多路复用模型主要就是实现看高效的网路请求。

       

  • 相关阅读:
    Python实用技术——爬虫(二):爬虫需要使用的库
    L70.linux命令每日一练 -- 第十章 Linux网络管理命令 -- nc和ssh
    14、获取1-10000之间的所有回文数
    分布式微服务 - 3.服务调用 - 1.概念
    【智能电网随机调度】智能电网的双层模型时间尺度随机优化调度(Matlab代码实现)
    笔尖笔帽检测2:Pytorch实现笔尖笔帽检测算法(含训练代码和数据集)
    补坑:Java的字符串String类(1)
    HTML CSS JS游戏网页设计作业「响应式高端游戏资讯bootstrap网站」
    C语言每日一题(9):跳水比赛猜名次
    C++异常处理throw try catch
  • 原文地址:https://blog.csdn.net/Pjk020121/article/details/133326880