zoukankan      html  css  js  c++  java
  • Redis读书笔记-1

    Redis内置集合数据类型, 支持对集合的交集,并集,差集等集合计算;
    一,数据库结构与对象
    Redis-Key:
    ----字符串 String
    Redis-Value:
    ----字符串 SET msg "test"
    ----列表 list RPUSH numbers 1 2 3 4
    ----哈希 hash
    ----集合 set
    ----有序集合 sorted list
     
    1.1, Redis字符串为简单动态字符串(SDS)
    (C语言传统字符串表示:以空字符结尾的字符数组)
    SDS遵循C语言传统字符串规则,以空字符串结尾;空字符串不计入SDS的len属性中,但是会为空字符串分配1字节空间
    (遵循C语言传统字符串规则原因:SDS可以直接重用一部分C字符串函数库中的函数
    例如:使用C函数printf打印, printf("%s", s->buf)
     
    1.2 SDS区别C字符串
    区别 SDS C
    结尾 空串 空串
    实际长度 N+1 N+1
    理论长度 N N
    获取字符长度复杂度 O(1) ,取len属性值 O(N)
    缓冲区溢出 无(先检查空间,(不足先扩展),后修改) 有(只修改,无空间检查)
    字符串拼接 多出1字节(含前一个字符串结尾的空串)  
    内存重分配次数 <= N ==N
    判断SDS长度依据 SDS的len属性 空字符
    保存数据格式 任意格式二进制数据 文本数据(因用了C字符串,遇到空字符就结束)
         
      优点  
      常数复杂度获取字符串长度  
      杜绝缓冲区溢出  
      减少修改字符串需要内存重新分配次数  
      二进制安全  
      兼容部分C字符串函数  
    1.3SDS内存分配
    SDS增长:分配(修改必须的空间 + 额外未使用空间[如果修改必须空间足够不会分配额外空间])
    分配优点:SDS连续增长N次,内存重分配次数 <= N (如果C字符串为N次)
    分配原则:
    <1>修改SDS后如果buf大小 < 1Mb,额外未使用空间等于len属性大小
    修改前 free = 0 len = 5 buf = hello buf.length = 5 + 1
    修改后 free = 11 len = 11 buf = hello world buf.length = 11 + 11 + 1
    <2>修改SDS后如果buf大小 >= 1Mb
    额外未使用空间大小均为1Mb
    SDS移除:不释放已移除空间,记录移除空间大小至free
    1.4SDS存储
    所有SDS存放的buf数组数据,都会以二进制方式来处理(写入数据库是什么样的,读取时就什么样)
    SDS属性中的buf用来保存SDS字符串的二进制数据
     
    总结:
     
    1.5,链表
     
    1.6,字典和哈希表
    字典底层由哈希表实现
    每个字典带有两个哈希表,一个平时使用,一个仅限于rehash(哈希表扩展和收缩)使用
    1,添加键值对K0,V0
    2,根据K0计算哈希值(MurmurHash2算法)
    3,根据根据哈希值和哈希表大小计算哈希表数组索引值
    4,根据索引值存入哈希表数组
    负载因子:
    如果负载因子是0.75,hashmap(16)最多可以存储12个元素,想存第16个就得扩容成32。
    如果负载因子是1,hashmap(16)最多可以存储16个元素。
    同样存16个元素,一个占了32个空间,一个占了16个空间的内存。
    1.7 跳跃表
    跳跃表数据结构中的每个节点含多个指向其他节点的指针,可以快速访问节点
    使用条件:
    有序集合元素数量比较多
    有序集合成员是较长的字符串
     
    二,单机数据库的实现
    9.1 数据库
    字典即键空间
    SET message "hello world" 字符串
    RPUSH alphabet "a" "b" "c" 列表
    HSET book name "Redis in Action" 哈希表键book
    HSET book author "Josiah L. Carlson" 哈希表键book
    HSET book publisher "Manning" 哈希表键book
    存储结构:
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/6514033.html
Copyright © 2011-2022 走看看