一、简介

字符串类型是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开发与运维》 付磊 & 张益军