redis




yubaofu
主题

●   Redis 主要内存结构及主体执流程
●   Redis rehash 介绍
●   Redis 持久化
●   Redis 协议
●   Redis 应用实例
Redis 是什么

●   Redis 是 REmote DIctionary Server 的缩写 .
●   Redis is an open source, advanced key-
    value store. It is often referred to as a
    data structure server since keys can
    contain strings, hashes, lists, sets and
    sorted sets.
Redis 应用场景

●   对复杂数据结构的支持
●   sns 中的关系及统计类的应用
●   top 排名类的应用
Redis 内存数据结构
Redis dict 内存结构
Redis dict 结构源码
Redis key-vale
Key 字符串 通过 sds 实现 struct sdshdr {int len;
  int free;char buf[];
  };
Value typedef struct redisObject {
  unsigned type:4;unsigned notused:2;
  unsigned encoding:4; unsigned lru:22;
   int refcount;
   void *ptr;
} //redis.h
Redis db
Redis db

●   Redis 默认 db 数量是 16 个
●   Client 可以用 select 命令选择 db, 之后的操
    作都在这个 db 上
●   默认第 1 个 db, 即索引为 0 的 db
Redis 主流程
Redis 两个重要的函数
     r
Redis 两个重要的函数

●   ServerCron 定时函数
     每 100ms 执行
●   ServerCron 工作
        如果当前没有后台运行 dump 数据保存到文的
        进程,则可以根据内存使用情况重新调整
        hashTables 大小
        记录些日志
        判断是否有正在进行 dump 数据到文件的后台
        进程
         完成主从复制
Redis io 处理
Redis rehash
●   Dict 结构里 ht[2] 属性
●   默认情况下 ht[0],reash 时使用 ht[1]
●   Rehash 时使用分批 rehash , 每次只 rehash
    部分
●   bucket 初始为 4, 根据需要以 2 的 n 次方增加
    和 java hashmap 扩容大小一样。
Redis rehash 扩容条件

●   _dictExpandIfNeeded 函数判断是否扩容


    初始化时
    (Size/bucket >=1&&(dict_can_resize||
    size/bucked>5))
Redis 扩容判断源码
Redis 扩容 -切换 ht
   re
Redis 持久化方式

●   Dump 出整个库
●   AOF 模式 ( 没研究,这里不细讲 )
●   主从复制
Redis dump

●   主进程 fork 出一个子进程,利于 copy on
    write ,子进程 dump 整个库
●   触发条件
    save 主进程 dump
    bgsave fork 出子进程来 dump
    slave 连接了
●   配置文件里设置
    save 900 1
Redis dump 源码解析 1
Reids dump 源码解析 2
Redis dump 解析 3
Redis 主从复制

●   Slave 在命令行执行 slaveof ip port
    或在配置文件里配置
●   Slave 时 master 要执行 dump
●   同步完成后,以后每次按需复制
●   没有增量复制的方式,每次 slave down 后,要
    重新从 master 复制整个库
Redis 重启

●   从 dump.rdb 文件里读取数据,重建整个库
Redis 通信 协议

●   *<number of arguments> CR LF
●   $<number of bytes of argument 1> CR LF
●   <argument data> CR LF
●   ...
●   $<number of bytes of argument N> CR
    LF
●   <argument data> CR LF
Redis pipelining 模式

●   一次发送多个命令,减少网络传输
●   服务器将命令放到 queue, 结果按请求顺序返回
    给 client
●   内部 api 数据统计就采用了 pipelining
Redis 应用实例
Redis 应用
Redis 各数据类型结构

●   Redis 各数据结构内存结构 ( 还没研究 )
Thanks
参考资料

●   Redis 官网
●   Redis 源代码
●   网上分析 redis 的文章

Redis介绍

  • 1.
  • 2.
    主题 ● Redis 主要内存结构及主体执流程 ● Redis rehash 介绍 ● Redis 持久化 ● Redis 协议 ● Redis 应用实例
  • 3.
    Redis 是什么 ● Redis 是 REmote DIctionary Server 的缩写 . ● Redis is an open source, advanced key- value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
  • 4.
    Redis 应用场景 ● 对复杂数据结构的支持 ● sns 中的关系及统计类的应用 ● top 排名类的应用
  • 5.
  • 6.
  • 7.
  • 8.
    Redis key-vale Key 字符串通过 sds 实现 struct sdshdr {int len; int free;char buf[]; }; Value typedef struct redisObject { unsigned type:4;unsigned notused:2; unsigned encoding:4; unsigned lru:22; int refcount; void *ptr; } //redis.h
  • 9.
  • 10.
    Redis db ● Redis 默认 db 数量是 16 个 ● Client 可以用 select 命令选择 db, 之后的操 作都在这个 db 上 ● 默认第 1 个 db, 即索引为 0 的 db
  • 11.
  • 12.
  • 13.
    Redis 两个重要的函数 ● ServerCron 定时函数 每 100ms 执行 ● ServerCron 工作 如果当前没有后台运行 dump 数据保存到文的 进程,则可以根据内存使用情况重新调整 hashTables 大小 记录些日志 判断是否有正在进行 dump 数据到文件的后台 进程 完成主从复制
  • 14.
  • 15.
    Redis rehash ● Dict 结构里 ht[2] 属性 ● 默认情况下 ht[0],reash 时使用 ht[1] ● Rehash 时使用分批 rehash , 每次只 rehash 部分 ● bucket 初始为 4, 根据需要以 2 的 n 次方增加 和 java hashmap 扩容大小一样。
  • 16.
    Redis rehash 扩容条件 ● _dictExpandIfNeeded 函数判断是否扩容 初始化时 (Size/bucket >=1&&(dict_can_resize|| size/bucked>5))
  • 17.
  • 18.
  • 19.
    Redis 持久化方式 ● Dump 出整个库 ● AOF 模式 ( 没研究,这里不细讲 ) ● 主从复制
  • 20.
    Redis dump ● 主进程 fork 出一个子进程,利于 copy on write ,子进程 dump 整个库 ● 触发条件 save 主进程 dump bgsave fork 出子进程来 dump slave 连接了 ● 配置文件里设置 save 900 1
  • 21.
  • 22.
  • 23.
  • 24.
    Redis 主从复制 ● Slave 在命令行执行 slaveof ip port 或在配置文件里配置 ● Slave 时 master 要执行 dump ● 同步完成后,以后每次按需复制 ● 没有增量复制的方式,每次 slave down 后,要 重新从 master 复制整个库
  • 25.
    Redis 重启 ● 从 dump.rdb 文件里读取数据,重建整个库
  • 26.
    Redis 通信 协议 ● *<number of arguments> CR LF ● $<number of bytes of argument 1> CR LF ● <argument data> CR LF ● ... ● $<number of bytes of argument N> CR LF ● <argument data> CR LF
  • 27.
    Redis pipelining 模式 ● 一次发送多个命令,减少网络传输 ● 服务器将命令放到 queue, 结果按请求顺序返回 给 client ● 内部 api 数据统计就采用了 pipelining
  • 28.
  • 29.
  • 30.
    Redis 各数据类型结构 ● Redis 各数据结构内存结构 ( 还没研究 )
  • 31.
  • 32.
    参考资料 ● Redis 官网 ● Redis 源代码 ● 网上分析 redis 的文章