redis

作者: AGEGG | 来源:发表于2020-04-13 21:48 被阅读0次

    Memcash和redis的区别

    Memcash:代码层次类似Hash

    支持简单数据类型
    不支持数据持久化存储
    不支持主从
    不支持分片

    redis

    数据类型丰富
    支持数据磁盘持久化储存
    支持主从
    支持分片

    redis为什么能这么快

    10万+QPS
    1.完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高
    2.数据结构简单,对数据操作也简单
    3.采用单线程,单线程也能处理高并发请求,想多核也可启动多实例
    4.使用多路I/O复用模型,非阻塞IO

    多路I/O复用模型

    FD: File Descriptor 文件描述符
    一个打开的文件通过唯一的描述符进行引用,该描述符是打开文件的元文件的元数据到文件本身的映射

    image.png image.png

    Redis采用的I/O多路复用函数:epoll/kqueue/evport/select?
    1.因地制宜
    2.优先选择时间复杂度为O(1)的多路复用函数作为底层实现
    3.以时间复杂度为O(n)的select作为保底
    4.基于react设计模式监听I/O事件

    redis 数据类型

    image.png image.png

    从海量Key里查询出某一固定前缀的Key

    1.摸清数据规模,即问清楚边界


    image.png image.png

    Redis实现分布式锁

    分布式锁需要解决的问题

    1.互斥性
    2.安全性
    3.死锁
    4.容错

    setnx key value :如果key不存在,则创建并赋值
    时间复杂度: O(1)
    返回值:设置成功,返回1;设置失败,返回0

    expire key seconds
    设置key的生存时间,当key过期时(生存时间为0),会被自动删除
    缺点:原子性得不到满足,挂掉后会死锁

    image.png image.png

    set uid 11426 ex 10 nx

    image.png

    使用Redis做异步队列

    使用List作为队列,rpush生产消息,lpop消费消息
    缺点:没有等待队列有值就直接消费
    弥补:可以通过在应用层引入Sleep机制去调用LPOP重试

    BLPOP key [key...] timeout: 阻塞直到队列有消息或者超时

    image.png
    缺点:只能供一个消费者消费

    pub/sub 主题订阅者模式
    发送者(pub)发送消息,订阅者(sub)接受消息
    订阅者可以订阅任意数量的频道

    image.png image.png

    pub/sub 缺点:
    消息的发布是无状态的,无法保证可达

    redis做持久化

    RDB(快照)持久化:保存某个时间点的全量数据快照

    redis.conf  找到save,大概218行
    save 900 1           900s内有一条写入执行执行一次快照
    save 300 10         300s内有10条写入执行一次快照
    save 60 10000     60s内有1万写入,执行一次快照
    
    //当备份进程出错时,主进程停止进行新的写入操作,保护持久化数据一致性问题
    stop-writes-on-bgsave-err yes
    //备份时,将rdb文件进行压缩后进行保存(建议no,cpu比硬盘更值钱)
    rdbcompression yes
    //同时若要禁用rbd配置,也可以在上面添加  save ""
    
    image.png

    文件在 src/dump.rdb
    lastsave 查看最后save的时间

    image.png image.png image.png image.png

    缺点:
    内存数据全量同步,数据量大会由于I/O而严重影响性能
    可能会因为Redis挂掉而丢失从当前至最近一次快照期间的数据

    AOF(Append-Only_File)持久化:保存写状态

    记录下除了查询以外的所有变更数据库状态的指令
    以append的形式追加保存在AOF文件中(增量)

    redis.conf
    //改为yes 开启
    appendonly no
    //文件名 
    appendfilename "appendonly.aof"
    //always 一旦缓存区发生变化 everysec 每秒执行 no 缓存满执行 推荐默认的everysec 
    appendfsync everysec
    
    image.png image.png image.png image.png

    BGSAVE做镜像全量持久化,AOF做增量持久化

    使用pipeline的好处

    Pipeline 和 linux的管道类似
    redis 基于请求/响应模型,单个请求处理需要一一应答
    pipeline批量执行指令,节省多次IO往返的时间
    有顺序依赖的指令建议分批发送

    Redis的同步机制


    image.png image.png image.png image.png image.png

    redis 集群

    image.png

    相关文章

      网友评论

          本文标题:redis

          本文链接:https://www.haomeiwen.com/subject/fcsymhtx.html