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实例
- 使用连接池,有效控制连接,提高效率
- 高并发添加熔断功能