Redis基础 | 青训营笔记

58 阅读2分钟

Remote Dictionary Server 一种基于键值对的NoSQL数据库,其提供了丰富的数据结构

使用场景

  • 基于内存,c语言、单线程架构,速度快
  • 简单稳定,无外部库依赖
  • 客户端语言多,支持持久化,主从复制
  • 支持高可用,分布式和水平扩容

数据结构

string

  • 动态字符数组,可以覆盖和追加子串
  • 使用预处理分配的方式减少内存的频繁分配
  • 小于1M时,加倍扩容。超过1M,每次扩容1M直到512M

list

  • 双向链表,随机定位性能弱,首位插入删除优
  • 使用时特别注意相关操作的时间复杂度
  • Redis底层存储不是一个简单的链表,在元素较少时使用连续的内存存储(ziplist),数据量多才会改成quicklist,防止大量的指针浪费空间

hash

  • 数组+链表
  • key值定位数组,链表解决hash冲突
  • hash内部元素拥挤时需要扩容,而后对其中的键值重新定位。如果hash很大,对于单线程的Redis消耗会比较大,于是采用了渐进式Rehash。保存两个新旧hash,后续定时任务及hash结构将元素逐步迁移到新结构中
  • 还具备缩容,是扩容的逆过程

set

  • 内部也是hash结构,只不过所有value指向同一个值

sortedset

  • 可以给每一个元素赋权重score,内部元素会按照socre排序
  • 还可以根据score范围获得元素
  • hash+跳跃列表,前者用于根据value定位score,后者用于排序和范围获取元素
  • 跳跃列表
    • 平衡树的概率替代法,使用概率来平衡而非严格平衡的数据结构
    • 每个节点包含一个高度k,每层高度都有一个指针,指向后一个节点,形成有这层高度的有序单链表
    • 查找时从最高层向下循环根据大小查询
    • 插入和删除都需要先查找定位,而后进行相关操作

使用规范

  • 不要使用过多的Redis事务
  • 避免多个应用使用同一个Redis实例
  • 使用连接池,有效控制连接,提高效率
  • 高并发添加熔断功能