2.1.1 全局命令
1. 查看所有键
- O(n)
keys *
2. 键总数
- 当前数据库
- O(1)
dbsize
3. 检查键是否存在
exists key
4. 删除键
del key [key ...]
5. 键过期
expire key seconds
ttl 命令会返回剩余过期时间, 3种返回值:
=0: 键剩余的过期时间
- -1: 键设置过期时间
- -2: 键不存在
ttl key
6. 键的数据结构类型
其实应该是查看某 key 的 value 的数据结构类型.
type key
2.1.2 数据结构和内部编码
string, hash, list, set, zset 只是 Redis 对外的数据结构.
- 每种数据结构都有自己底层的内部编码实现, 而且是多种实现
有序集合中有两个 a:3.0, 应该画错了.
- 根据合适的场合选择合适的结构
lish 应该是拼写错误.
查询内部编码:
object encoding key
使用内部编码的好处:
- 改进内部编码, 而对外的数据结构和命令没有影响
- 多种内部编码实现可以在不同场景下发挥各自的优势
2.1.3 单线程架构
- 单线程架构
- I/O 多路复用
1. 引出单线程模型
一条命令从客户端达到服务端不会立刻被执行, 所有命令都会进入一个队列中, 然后逐个被执行:
命令的执行顺序是不确定的:
图2-4 所有命令在一个队列里排队等待被执行
可以确定不会有两条命令被同时执行:
2. 为什么单线程还能这么快
- 纯内存访问
- 内存的响应时长大约为 100ns
- 非阻塞 I/O
- epoll
- 自身实现事件处理
- 单线程避免了线程切换和竞态产生的消耗
单线程的好处:
- 简化数据结构和算法实现
- 单线程避免了线程切换和竞态产生的消耗
单线程的问题:
- 对每个命令的执行时间有要求