2.1.1 全局命令

1. 查看所有键

  • O(n)
  1. keys *

2. 键总数

  • 当前数据库
  • O(1)
  1. dbsize

3. 检查键是否存在

  1. exists key

4. 删除键

  1. del key [key ...]

5. 键过期

  1. expire key seconds

ttl 命令会返回剩余过期时间, 3种返回值:

  • =0: 键剩余的过期时间

  • -1: 键设置过期时间
  • -2: 键不存在
  1. ttl key

6. 键的数据结构类型

其实应该是查看某 key 的 value 的数据结构类型.

  1. type key

2.1.2 数据结构和内部编码

string, hash, list, set, zset 只是 Redis 对外的数据结构.

  • 每种数据结构都有自己底层的内部编码实现, 而且是多种实现

image.png

有序集合中有两个 a:3.0, 应该画错了.

  • 根据合适的场合选择合适的结构

image.png

lish 应该是拼写错误.

查询内部编码:

  1. object encoding key

使用内部编码的好处:

  • 改进内部编码, 而对外的数据结构和命令没有影响
  • 多种内部编码实现可以在不同场景下发挥各自的优势

2.1.3 单线程架构

  • 单线程架构
  • I/O 多路复用

1. 引出单线程模型

一条命令从客户端达到服务端不会立刻被执行, 所有命令都会进入一个队列中, 然后逐个被执行:

image.png

命令的执行顺序是不确定的:

image.png
图2-4 所有命令在一个队列里排队等待被执行

可以确定不会有两条命令被同时执行:

image.png

2. 为什么单线程还能这么快

  1. 纯内存访问
    1. 内存的响应时长大约为 100ns
  2. 非阻塞 I/O
    1. epoll
    2. 自身实现事件处理

image.png

  1. 单线程避免了线程切换和竞态产生的消耗

单线程的好处:

  • 简化数据结构和算法实现
  • 单线程避免了线程切换和竞态产生的消耗

单线程的问题:

  • 对每个命令的执行时间有要求