之前我们以及了解到redis的介绍与简单用法,本文将从各个数据结构的性能与操作redis名字的复杂度进行实际生产中的分析。
String类型
操作字符串类型命令的时间复杂度
命令 | 时间复杂度 |
---|---|
set key value | O(1) |
get key | O(1) |
del key [key …] | O(k),k为key的个数 |
mset key value [key value …] | O(k),k为key的个数 |
mget key [key …] | O(k),k为key的个数 |
incr key | O(1) |
decr key | O(1) |
incrby key increment | O(1) |
decrby key increment | O(1) |
incrbyfloat key increment | O(1) |
append key value | O(1) |
strlen key | O(1) |
setrange key offset value | O(1) |
getrange key start end | O(n),n是字符串的长度,由于获取字符串非常快,所以如果字符串不是很长,可以视为O(1) |
字符串类型的内部编码有三种:
- int 8个字节的长整型
- embstr 小于等于39个字节的字符串 (redis版本3.0之前是39,redis3.2之后是44字节)
- raw 大于39个字符串的字符串(redis版本3.0之前是39,redis3.2之后是44字节)
redis会根据当前值的类型和长度决定使用哪种内部编码实现。
int类型:
127.0.0.1:6379> set test:int 15
OK
127.0.0.1:6379> get test:int
"15"
127.0.0.1:6379> type test:int
string
127.0.0.1:6379> object encoding test:int
"int"
embstr类型字符串长度小于等于39:
127.0.0.1:6379> set test:str hello
OK
127.0.0.1:6379> get test:str
"hello"
127.0.0.1:6379> object encoding test:str
"embstr"
当字符串长度大于39(3.0之前,3.2之后是44)的时候会变成raw,如下:
127.0.0.1:6379> set test:raw 12345678912345678912345678912345678912345678
OK
127.0.0.1:6379> strlen test:raw #我用的是redis5.0故是44
(integer) 44
127.0.0.1:6379> object encoding test:raw
"embstr"
127.0.0.1:6379> set test:raw 123456789123456789123456789123456789123456789
OK
127.0.0.1:6379> strlen test:raw
(integer) 45
127.0.0.1:6379> object encoding test:raw