全局命令
redis 有5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令
-
查看所有键
keys *
-
键总数
dbsize
dbsize 命令在计算键总数时不会遍历所有键,而是直接获取redis 内置的键总数变量,所以dbsize命令的时间复杂度是O(1)。 而keys 命令会遍历所有键,所以它的时间复杂度是O(n),当redis 保存了大量键时,线上环境禁止使用。
-
检查键是否存在
exists key
如果键存在则返回1,不存在则返回0:
127.0.0.1:6379> exists hello
(integer) 1
-
删除键
del key
del 是一个通用命令,无论值是什么类型的数据结构,del 命令都可以将其删除,删除成功返回1,删除不存在的键返回0。
同时删除多个键(a、b、c 为键名)
del a b c
-
键过期
expire key seconds
redis 支持对键添加过期时间,当超过过期时间后,会自动删除键,例如为hello 设置10s 过期时间
expire hello 10
ttl 命令观察键的剩余过期时间,有三种返回值
1)大于等于0的整数:键剩余的过期时间
2)-1: 键没设置过期时间
3)-2: 键不存在 -
键的数据类型
type key
数据结构和内部编码
type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、hash (哈希)、list(列表)、set(集合)、zset(有序集合),这是都是redis 对外的数据结构。
实际上每种数据结构都有自己的底层的内部编码实现,可通过 object encoding 命令查询内部编码:
object encoding hello
"embstr"
redis 这样设计的有两个好处:
第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如redis 3.2 提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外用户基本感知不到。
第二,多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist 比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候redis 会根据配置选项将列表类型的内部实现转换为linkedlist