redis数据结构

全局命令

Redis5数据结构,它们是 键值对 中的 ,对于 来说有一些通用的命令。

查看所有键

keys *

键总数

dbsize

dbsize 命令在 计算键总数不会遍历 所有键,而是直接获取 Redis 内置的键总数变量,所以 dbsize 命令的 时间复杂度O(1)。而 keys 命令会 遍历所有键,所以它的 时间复杂度O(n),当 Redis 保存了 大量键 时,线上环境 禁止 使用。

检查键是否存在

exists key

删除键

del key

del 是一个 通用命令,无论值是什么 数据结构 类型, del 命令都可以将其 删除

键过期

expire key seconds

Redis 支持对 添加 过期时间,当超过过期时间后,会 自动删除键

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

  • 大于等于 0 的整数:表示键 剩余过期时间
  • 返回 -1 没设置 过期时间
  • 返回 -2 不存在。

可以通过 ttl 命令观察 hello剩余过期时间

键的数据结构类型

type key

数据结构和内部编码

type 命令实际返回的就是当前 数据结构类型,它们分别是: string字符串)、 hash哈希)、 list列表)、 set集合)、 zset有序集合),但这些只是 Redis 对外的 数据结构

对于每种 数据结构,实际上都有自己底层的 内部编码 实现,而且是 多种实现。这样 Redis 会在合适的 场景 选择合适的 内部编码,如图所示:

可以看到,每种 数据结构 都有 两种以上内部编码实现。例如 list 数据结构包含了 linkedlistziplist 两种 内部编码。同时有些 内部编码,例如 ziplist,可以作为 多种外部数据结构 的内部实现

单线程架构

Redis 使用了 单线程架构I/O 多路复用模型 来实现 高性能内存数据库服务。那为什么 单线程 还能这么快,下面分析原因:

纯内存访问

Redis 将所有数据放在 内存 中,内存的 响应时长 大约为 100 纳秒,这是 Redis达到 每秒万级别 访问的重要基础。

非阻塞I/O

Redis 使用 epoll 作为 I/O 多路复用技术 的实现,再加上 Redis 自身的 事件处理模型epoll 中的 连接读写关闭 都转换为 事件,从而不用不在 网络 I/O 上浪费过多的时间,如图所示:

采用 单线程 就能达到如此 高的性能,那么不失为一种不错的选择,因为 单线程能带来几个好处:

  • 单线程 可以简化 数据结构和算法 的实现,开发人员不需要了解复杂的 并发数据结构
  • 单线程 避免了 线程切换竞态 产生的消耗,对于服务端开发来说,锁和线程切换 通常是性能杀手。

单线程 的问题:对于 每个命令执行时间 是有要求的。如果某个命令 执行过长,会造成其他命令的 阻塞,对于 Redis 这种 高性能 的服务来说是致命的,所以 Redis是面向 快速执行 场景的数据库。