全局命令
查看所有键
命令:keys *
注意事项:
键总数
命令:dbsize
注意事项:dbsize命令在计算键总数时并不会遍历所有键而是直接获取Redis内置的键总数变量,因此dbsize命令的时间复杂度是O(1);keys命令是获取所有键的名称,因此keys命令会遍历所有键,因此keys命令的时间复杂度是O(n),当Redis保存了大量的键时禁止使用keys命令。
检查键是否存在
命令:exists key
注意事项:如果key存在则返回1,否则返回0
删除键
命令:del key [key...]
注意事项:del是一个通用命令,无论是什么数据结构类型都可以将其删除;返回结果是成功删除键的个数,如果删除一个不存在的键则返回0
键过期
命令:expire key seconds
注意事项:当超过过期时间后会自动删除键,例如:expire hello 10
查看过期时间
命令:ttl key
注意事项:ttl命令返回键的剩余过期时间,如果返回值是大于等于0的整数则代表键剩余的过期时间、如果返回值是-1则代表该键没有设置过期时间、如果返回值是-2则代表该键不存在。
键的数据结构类型
命令:type key
注意事项:如果key存在则返回其类型,否则返回none
数据结构
字符串string、哈希hash、列表list、集合set、有序集合zset,每种数据结构在底层编码实现时有多种实现,方便在不同场合选择合适的内部编码。
每种数据结构在底层代码至少有2种以上的编码实现,有点类似于JAVA代码的接口。可以通过object encoding key命令来查询某变量的底层实现方式。
这种设计方式有2个优点:由于类似于JAVA接口设计当底层发生改动时调用方无需任何修改、针对不同的数据量和场景Redis选择合适的底层实现逻辑。
单线程架构
基于单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。
单线程架构:当多个客户端发送命令到服务端时,这些命令被放入一个队列中,然后Redis单线程逐个执行队列中的命令。
单线程架构还能满足高并发,出于下面3个原因:
- 纯内存访问。
- 非阻塞I/O,Redis使用epoll来作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭转换为Redis事件,不在网络I/O上浪费太多时间。
- 单线程避免了多线程之间切换、锁竞争带来的消耗。
单线程架构的优缺点:
优点:单线程可以简化数据结构和算法的实现、避免多线程切换、锁竞争带来的消耗。
缺点:单线程串行执行命令,因此对命令的执行时间有要求,否则会因为某个命令执行时间过长导致后续其他命令处于等待状态。