Redis的一些全局命令、数据结构和内部编码、单线程命令处理机制是十分有必要的,主要体现在两个方面:第一、Redis的命令有上百个,如果纯靠死记硬背比较困难,但是如果理解Redis的一些机制,会发现这些命令有很强的通用性。第二、Redis不是万金油,有些数据结构和命令必须在特定场景下使用,一旦使用不当可能对Redis本身或者应用本身造成致命伤害。
全局命令
1.keys * 查看所有的键
2.dbsize 查看键的总数
区别:计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量,
所以dbsize命令的时间复杂度是O(1)。而keys命令会遍历所有键,所以它的时间复杂度是O(n),
当Redis保存了大量键时,线上环境禁止使用
3.exists key 检查键是否存在,键存在则返回1,不存在则返回0
4.del key 删除键 一个通用命令,无论值是什么数据结构类型,都可以将其删除,
返回结果为成功删除键的个数
5.expire key seconds 设置键过期的时间。
6.ttl 命令会返回键的剩余过期时间,它有3种返回值:
·大于等于0的整数:键剩余的过期时间。
·-1:键没设置过期时间。
·-2:键不存在可
7.type key 键的数据结构类型,如果键不存在,则返回none
数据结构和内部编码
type命令实际返回的就是当前键的数据结构类型,它们分别是:
string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构,实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码.
内部编码
Redis这样设计有两个好处:第一,可以改进内部编码,而对外的数据结构和命令没有影响,
这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如Redis3.2提供了quicklist,
结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,
而对外部用户来说基本感知不到。第二,多种内部编码实现可以在不同场景下发挥各自的优势,
例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,
这时候Redis会根据配置选项将列表类型的内部实现转换为 linkedlist。
待续。。。
网友评论