Redis深度历险阅读笔记(1)

前言

前段时间自己在写小框架,今天开始阅读Redis深度历险,准备深入了解一下Redis的原理与应用。第一章是比较基础的数据结构,算是一个大概的介绍吧,作者的很多类比用到了Java中的数据结构,因此有Java基础阅读起来会比较直观。没有的话,我看目录后续有探索内部结构的,到后面会再看到。

基础数据结构

String

  • Redis的字符串是可以修改的字符串,预分配了冗余空间以减少内存的频繁分配。
  • 当字符串小于1M,一次扩容一倍,大于1M,一次扩容1M。
  • 如果value是一个整数,不能超过signed long的最大最小值

List

  • 类似LinkedList,链表而非数组,这意味着插入/删除快,查询慢
  • 通常用来做异步队列使用,生产者将任务序列化后放入尾部,消费者从头部拿出任务消费
  • 可以用作队列(右进左出),也可以用作栈(右进右出)
  • list的一些慢操作:lindex(需要遍历)lrange(获取两个参数的区间值)ltrim(只保留两个参数的区间值)比如:
> lrange key 0 -1 # 获取所有元素
1) "v1"
2) "v2"
3) "v3"

> ltrim key 1 -1  # 只保留第二个到最后一个

> ltrim key 1 0   # 清空整个列表
  • 类似LinkedList,其实是QuickList,将多个ZipList(所有元素分配一块连续的内存)使用双向指针串起来使用

QuickList

Hash

  • 结构同Java的HashMap,数组+链表法解决冲突,不同的是HashMap的rehash是一次性的,Redis为了不堵塞服务,采用了渐进式

Rehash

  • rehash时,保留新旧两个结构,查询时同时查询,在后续的hash操作时,将旧hash一点点迁移到新的hash
  • hash可以实现表结构,比如:
> hset user-gmd age 20
> hget user-gmd name

Set

  • 类似Java的HashSet
  • 可以利用去重功能,来存储一些东西(比如中奖用户)

ZSet

  • SortedSet和HashMap的结合体。一方面是一个Set,保证了唯一性,另一方面可以给value赋予score,进行权重排序
  • 数据结构:跳表 -> 一个有趣的小漫画

SkipList

0层所有的元素都会串起来,然后每个几个元素挑出一个代表,代表们用另外一级指针串起来,以此类推。使用随机法来决定一个节点能到多少层:0层100%,1层50%,2层25%…..

容器型数据结构原则

list/set/hash/zset 这四种数据结构是容器型数据结构

  1. create if not exists:如果容器不存在,那就创建一个,再进行操作。比如 rpush 操作刚开始是没有列表的,Redis 就会自动创建一个,然后再 rpush 进去新元素。
  2. drop if no elements:如果容器里元素没有了,那么立即删除元素,释放内存。这意味着 lpop 操作到最后一个元素,列表就消失了。

过期时间

  1. 过期时间以整个对象为单位,不以key为单位
  2. 调用Set修改字符串,过期时间会消失
Table of Contents