一、简介
字符串类型是redis最基础的数据结构。首先键都是字符串类型,而其它几种数据结构类型都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。
字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如:JSON、XML))、数字(整数、浮点数)、甚至是二进制(图片、音频、视频),但值最大不能超过512MB。
二、命令
1、常用命令
1)设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
下面操作设置键hello,返回结果为OK则代表设置成功:
127.0.0.1:6379> set hello npsee
OK
set命令有几个选项:
- ex seconds:为键设置秒级过期时间。
- px milliseconds:为键设置毫秒级过期时间。
- nx:键必须不存在,才可以设置成功,用于更新。
- xx:与nx相反,键必须存在,才可以设置成功,用于更新。
除了set选项,redis还提供了setex和setnx两个命令,其作用和ex和nx选项是一样的:
setex key seconds value
setnx key value
例:
2)获取值
get key
如果要获取的键不存在,则返回nil(空)。
3)批量设置值
mset key value [key value ...]
如:
127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK
4)批量获取值
mget key [key ...]
如:
127.0.0.1:6379> mget a b c d e
1) "1"
2) "2"
3) "3"
4) "4"
5) (nil)
如果有些键不存在,那么它的值为nil,结果是按照传入键的顺序返回
5)计数
incr key
incr命令用于对值做自增操作,返回的结果分为有一种情况:
- 值不是整数,返回错误。
- 值是整数,返回自增后的结果。
- 键不存在,按照值为0自增,返回结果为1。
如:
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incr key
(integer) 1
127.0.0.1:6379> incr key
(integer) 2
127.0.0.1:6379> set hello nosee
OK
127.0.0.1:6379> incr hello
(error) ERR value is not an integer or out of range
除了incr命令,redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数)。
2、不常用命令
1)追加值
append key value
append可以向字符串尾部追加值,如:
127.0.0.1:6379> get hello
"nosee"
127.0.0.1:6379> append hello 123
(integer) 8
127.0.0.1:6379> get hello
"nosee123"
2)字符串长度
strlen key
如:
127.0.0.1:6379> get hello
"nosee123"
127.0.0.1:6379> strlen hello
(integer) 8
下面操作返回结果6,因为每个中文占用3个字节:
127.0.0.1:6379> set hello '不见'
OK
127.0.0.1:6379> strlen hello
(integer) 6
3)设置并返回原值
getset key value
getset和set一样会设置值,但不同的是,它同时会返回键原来的值,如:
127.0.0.1:6379> getset test no
(nil)
127.0.0.1:6379> getset test see
"no"
4)设置指定位置的字符
setrange key offeset value
下面操作将值由pest变成best:
127.0.0.1:6379> set hello pest
OK
127.0.0.1:6379> setrange hello 0 b
(integer) 4
127.0.0.1:6379> get hello
"best"
5)获取部份字符串
getrange key start end
偏移量从0开始计算,如:
127.0.0.1:6379> get hello
"best"
127.0.0.1:6379> getrange hello 1 2
"es"
3、字符串类型命令时间复杂度
命令 | 时间复杂度 |
set key value | O(1) |
get key | O(1) |
del key [key …] | O(k),k是键的个数 |
mset key value [key value …] | O(k),k是键的个数 |
mget key [key …] | O(k),k是键的个数 |
incr key | O(1) |
decr key | O(1) |
incrby key increment | O(1) |
decrby key decrement | 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个字节的字符串。
- raw:大于39个字节的字符串。
redis会根据当前值的类型和决定使用哪种内部编码实现。
127.0.0.1:6379> set hello 4562
OK
127.0.0.1:6379> object encoding hello
"int"
127.0.0.1:6379> set hello 'hi, noseee!'
OK
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> set hello 'hi, noseee! my name is calvin chan. what is you name?'
OK
127.0.0.1:6379> object encoding hello
"raw"
127.0.0.1:6379> strlen hello
(integer) 53
参考:
《Redis开发与运维》 付磊 & 张益军