Redis

136 阅读3分钟

Redis基础

Redis支持的类型

image.png

  • string 三种encoding

    • int 设置为long类型表示的整数 image.png

    • embstr 保存的值小于40的时候使用,有点事比较快 调用一次内存分配函数来分配一块连续的空间,包含object和sdshdr,所以比较快 embstr是只读的,如果要修改是先变成raw再进行修改

    image.png

    • raw 存储比较复杂的数据,数据大于等于40的时候 调用两次内存分配,分别获取object和sdshdr

    image.png

    • SDS

      1、 简单的动态的字符串,复杂度比较低

      2、 不会出现缓冲区溢出,sds会自动扩展

      3、 C的字符串内存重新分配比较耗性能,所以需要空间预分配、惯性空间释放

  • list

    • ziplist
    • linklist 他们之间可以互相转换
  • set

    • intset编码 针对整形集合作为底层实现

      1、 集合对象保存的所有元素都是整数值

      2、 集合对象保存的所有元素<=512个

    • hashtable编码 底层是字典,每个键都是字符串对象,字典对应的值是null

  • zset 有序集合

    • ziplist image.png
  • hash

    • 同时满足以下两种情况就是ziplist,否则是hashtable

      1、 hashi里面的键值对中。key和value的长度全部小于46个字节

      2、 hash里面的键值对中,个数小于512个 image.png

redis的对象类型

  • 编码的数据结构实现

image.png

image.png

redis的应用

分布式锁

  • 实现要点

    • 加锁解锁的key要一致
    • 不用永久加锁,要有过期时间
    • 一定要保证加锁与设置过期时间的原子性
    • 要支持过期续租、重入
  • 加锁 setnx+过期时间

  • 解锁delkey 要原子性

  • 问题、雷区:

    1、 锁过期

    • 增加加锁时间,增加自旋

    2、 重叠解锁 (A的锁到了过期时间自动解锁,B获得了锁,A此时执行完调用解锁方法,解除了B的锁),

    • 解决方案:通过唯一标识加入到key里面,防止自己解除了别人的锁

    3、 单点的问题

    • RedLock算法

消息队列

位图

redis持久化

Redis数据库(内存),内存中存储的问题,服务挂掉,数据就没了,所以需要持久化,恢复数据,

RDB和AOF

  • RDB手工执行和服务器定期执行,二进制文件,可以设值时间、更新次数来进行存储,可以停止进程存储和开子线程存储

  • AOF 记录redis命令来去记录数据库的变更,将执行的语句放到AOF文件里面

    • aof_buf:打开aof开关,每执行完一个写命令,都会把写命令以请求协议格式保存到aof_buf缓冲区中
  • 写入和同步

    image.png

    • appendfsync always:将aof_buf里面的内容写入&同步到AOF文件中,真正的把指令存入磁盘,优点是:数据不丢失,缺点是效率低
    • appendfsync everysec:将aof_buf里面的内容写入到AOF文件中,上次同步时间,距离一秒的进行AOF同步
    • appendfsync no:将aof_buf里面的内容写入到AOF文件中,但是不对AOF文件进行同步操作,由操作系统决定
  • AOF的缺陷

    1、 AOF越来越大,造成磁盘空间的大量浪费,数据加载会非常慢 2、 多条执行命令的保存,有很大几率都是浪费的

  • AOF重写

  • 可以通过一条实现数据的还原可以配置重写的体量和文件体积大于多少之后

  • fork一个子进程去执行AOF重写,主进程不会被阻塞

  • 创建AOF缓冲区

    1、 创建缓冲区之后再开子进程重写

    2、 产生新的AOF

    3、 重写完毕阻塞进程

    4、 覆盖旧的AOF文件

集群搭建