1、准备知识
1.1 全局命令:
命令 | 解释 |
---|---|
keys * | 查看所有键 |
dbsize | 查看键总数 |
exists key | 检查键是否存在 |
del key [key …] | 删除键 |
expire key seconds | 键过期(-1 未设置/-2 键不存在) |
type key | 键的数据结构类型 |
1.2 数据结构与内部编码:
type命令实际返回的就是当前键的数据结构类型,分别为:string、hash、list、set、zset;
每种数据类型结构都有自己底层的内部编码实现,而且是多种实现,这样redis在合适场景选择合适的内部编码:
命令 | 解释 |
---|---|
object encoding key | 查看key对应值的编码类型 |
设计的好处:
1、改进内部的编码对外的数据结构和命令无影响;
2、多种内部编码实现可以在不同场景下发挥各自的优势;
1.3 单线程架构:
使用单线程架构和I/O多路复用模型
2、字符串(string)
2.1 常用命令:
命令 | 解释 |
---|---|
set key value [ex seconds] [px millis] [nx|xx] | 设值 |
set命令选项:
ex seconds:为键设值秒级过期时间
px millis:为键设值毫秒级过期时间
nx:键必须不存在才可添加成功,用于添加
xx:与nx相反,键必须存在才可设置成功,用于更新;
命令 | 解释 |
---|---|
get key | 获取值 |
mset key value [key value …] | 批量设值 |
mget key [key …] | 批量获取值 |
incr key | 计数 |
incr命令用于对值做自增操作,返回结果分三种情况:
(1)、值不是整数,返回错误;
(2)、值是整数,返回自增后的结果;
(3)、键不存在,按照值为0自增,返回结果为1;
除了incr命令,redis提供了decr、incrby、decrby、incrbyfloat等;
很多存储系统和编程语言内部使用CAS机制实现计数功能,会有一定cpu开销,但在redis中完全不存在这个问题
2.2 不常用命令:
命令 | 解释 |
---|---|
append key value | 追加值 |
strlen key | 字符串长度 |
getset key value | 设置并返回原值 |
setrange key offset value | 设置指定位置的字符 |
getrange key start end | 获取部分字符串 |
2.3 内部编码:
字符串类型的内部编码有三种:
(1)、int:8个字节的长整型;
(2)、embstr:大于等于39个字节的字符串;
(3)、大于39个字节的字符串;
3、哈希(hash)
3.1 常用命令:
命令 | 解释 |
---|---|
hset key field value | 设值 |
hget key field | 获取值 |
hdel key field | 删除field |
hlen key | 计算field个数 |
hmset key field value [field value … ] | 批量设置field-value |
hmget key field [field …] | 批量获取field-value |
hexists key field | 判断field是否存在 |
hkeys key | 获取所有field |
hvals key | 获取所有value |
hgetall key | 获取所有的field-value |
hincrby key field | 值自增 |
hincrbyfloat key field | 值自增 |
hstrlen key field | 计算value的字符串长度 |
3.2 内部编码:
哈希类型内部编码有两种:
1、ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于has-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,故在节省内存方面比hashtable更加优秀;
2、hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1);
(1)、当field个数较少且没有大的value时,内部编码为ziplist;
(2)、当有value大于64字节,内部编码会由ziplist变为hashtable;
(3)、当field个数超过512,内部编码也会有ziplist变为hashtable;
参考《redis开发与运维》