String类型
命令
-
增
命令 含义 返回值 对应的英文速记 setnx [key] [value] 如果key不存在时设置该key对应的值 1 - 成功
0 - 失败set if not exist【如果不存在则设置】 msetnx [key1] [value1] [key2] [value2]... 当所有key都不存在时,设置值 1 - 成功
0 - 失败multiple set if not exist【如果不存在则设置多个值】 -
删
命令 含义 返回值 对应的英文速记 del [key] 删除指定的key 1 - 成功
0 - 失败delete【删除】 -
改
命令 含义 返回值 英文速记 例子 set [key] [value] [EX seconds] [PX mill-seconds] 设置值【如果key存在,则覆盖原始值;否则,创建新的键值对】 1 - 成功
0 - 失败set 【设置】 mset [key1] [value1] [key2] [value2] ... 设置值【如果key存在,则覆盖原始值;否则,创建新的键值对】 1 - 成功
0 - 失败multiple set【设置多个值】 setrange [key] [startoffset] [value] 修改指定的键对应位置的值
startoffset为值开始位置的偏移量
value为需要替换为的值
如果startoffset超过当前字符串长度,则会填充\x001字符。数字 - 修改后字符串的长度 127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> setrange k2 1 100
(integer) 4
127.0.0.1:6379> get k2
"v100"
127.0.0.1:6379> setrange k2 5 111
(integer) 8
127.0.0.1:6379> get k2
"v100\x00111"
127.0.0.1:6379> getrange k2 4 5
"\x001"append [key] [value] 向字符串添加值 数字 - 修改后字符串的长度 127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> append k1 aa
(integer) 5
127.0.0.1:6379> get k1
"100aa"getset [key] [value] 获取key对应的旧值,并且将其替换为新值 字符串 - 旧值 127.0.0.1:6379> get k1
"100aa"
127.0.0.1:6379> getset k1 aaa
"100aa"
127.0.0.1:6379> get k1
"aaa"incr [key] 如果对应的字符串是一个数字,则加一,否则报错。 数字 - 加一后数字大小 increase【增加】 127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> incr k1
(integer) 101
127.0.0.1:6379> set k2 aaa
OK
127.0.0.1:6379> incr k2
(error) ERR value is not an integer or out of rangedecr [key] 如果对应的字符串是一个数字,则减一,否则报错。 数字 - 减一后数字大小 decrease【减去】 127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> decr k1
(integer) 99
127.0.0.1:6379> set k2 aaa
OK
127.0.0.1:6379> decr k2
(error) ERR value is not an integer or out of rangeincrby [key] [number] 如果对应的字符串是一个数字,且number是数字,则加上number的值,否则报错。 数字 - 增加后数字大小 increase by【增加一个数】 127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> set k2 aaa
OK
127.0.0.1:6379> incrby k1 200
(integer) 300
127.0.0.1:6379> incrby k1 aaa
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrby k2 aaa
(error) ERR value is not an integer or out of rangedecrby [key] [number] 如果对应的字符串是一个数字,且number是数字,则减去number的值,否则报错。 数字 - 减去后数字大小 decrease by 【减去一个数】 127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> set k2 aaa
OK
127.0.0.1:6379> decrby k1 50
(integer) 50
127.0.0.1:6379> decrby k1 aaa
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby k2 1
(error) ERR value is not an integer or out of range -
查
命令 含义 返回值 英文速记 例子 get [key] 获取key对应的值 值,如果key没有值,返回nil 127.0.0.1:6379> setnx k1 v1
(integer) 1
127.0.0.1:6379> get k1
"v1"mget [key1] [key2] [...] 获取多个key对应的值 列表值,如果某个key没有值,对应的项为nil 127.0.0.1:6379> setnx k1 v1
(integer) 1
127.0.0.1:6379> setnx k2 v2
(integer) 1
127.0.0.1:6379> mget k1 k3 k2
1) "v1"
2) (nil)
3) "v2"strlen [key] 获取key对应的value字符串长度 字符串长度。
如果查询不存在的key,返回0127.0.0.1:6379> setnx k1 v1
(integer) 1
127.0.0.1:6379> strlen k1
(integer) 2
127.0.0.1:6379> strlen k3
(integer) 0getrange [key] [start] [end] 获取字符串某个范围的值 值。
如果查询的key不存在,返回""。
如果查询的范围超过字符串的长度,返回""127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> getrange k1 3 4
""
127.0.0.1:6379> getrange k2 0 1
""
127.0.0.1:6379> getrange k1 1 4
"1" -
设置过期时间
命令 含义 例子 setex [key] [expire-seconds] [value] 创建和设置一个值的过期时间 127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> setex k1 5 vvvv
OK
127.0.0.1:6379> get k1
"vvvv"
127.0.0.1:6379> get k1
(nil)
数据结构概述
-
采用的是类似
Java动态数组的ArrayList设计思路。可以动态扩容。不同的是,扩容的倍数刚开始会比较小,后面会变大。 -
如果让我们设计
string的底层实现,我们应该如何实现呢?目标
- 不可删除字符
- 可供修改
- 性能良好
设计:
-
不删除意味着如果采用数组,无需删除移动元素,数组其他特性时间复杂度都为1。【可能采用数组】
-
可修改意味着可能需要原地替换,并且允许增加字符的话,最好是设计为动态可扩容数据结构,至于缩容,如果考虑性能和空间可以想想。
-
内存的容量是一定的,不可能允许一个数据占用无限大的空间,所以设置默认字符串最大长度,以及提供修改的配置。
-
扩容一般遵从先慢后快,或者说刚开始扩容小,比如刚开始1K,后扩容大,比如1M扩。但是不能无限大,这样很容易把内存消耗完。
对应的数学图示应该是: