Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

一.全局命令:

1.查看所有键(keys *)

Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

2.键总数(dbsize)


Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

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

3.检查键是否存在(exists key)

如果键存在返回1,不存在返回0

Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

4.删除键(del key [key ...])

del是一个通用命令,无论值是什么数据结构类型,del命令都可以将其删除,例如下面将字符串类型的键java和列表类型的键mylist分别删除:


127.0.0.1:6379> del java
(integer) 1
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> del mylist
(integer) 1
127.0.0.1:6379> exists mylist
(integer) 0


Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

5.键过期(expire key seconds)

Redis支持对键添加过期时间,当超过过期时间后,会自动删除键,例 如为键hello设置了10秒过期时间:
Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

ttl命令会返回键的剩余过期时间,它有3种返回值:
·大于等于0的整数:键剩余的过期时间。
·-1:键没设置过期时间。
·-2:键不存在
可以通过ttl命令观察键hello的剩余过期时间:
Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

6.键的数据结构类型(type key)

例如键hello是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list:
Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

二.Redis数据结构和内部编码

type命令实际返回的就是当前键的数据结构类型,它们分别是: string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集 合),但这些只是Redis对外的数据结构,实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现, 这样Redis会在合适的场景选择合适的内部编码,如下图:

Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

Redis这样设计有两个好处:第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数 据结构和命令;第二,多种内部编码实现可以在不同场景下发挥各自的优 势,例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有 所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为 linkedlist。

三.Redis的单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结为三点:

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大 约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上 Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间,如下图所示。
Redis开发与运维读书笔记-第二章-Redis全局命令及数据结构简介(一)

第三,单线程避免了线程切换和竞态产生的消耗

单线程能带来几个好处:第一,单线程可以简化数据结构和算法的实现。并发数据结构实现不但困难而且开发测试比较麻烦。第二,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。但是单线程会有一个问题:对于每个命令的执行时间是有要求的。如果 某个命令执行过长,会造成其他命令的阻塞,对于Redis这种高性能的服务 来说是致命的,所以Redis是面向快速执行场景的数据库。