字符串类型是redis 中最基础的数据结构,其它类型的数据也是在字符串的基础上构建;字符串类型的value 格式可以是字符串,也可是Json字符串,还可以是二进制的字符串, 但是字符串类型的value 最大只支持512MB,同时如果字符串的value比较大,也会影响Redis 的性能。
字符串类型有以下几种操作:
set
key valuesetex
key seconds valuepsetex
key millseconds valuesetnx
key valuemset
key value [key1 value1 key2 value2 ...]msetnx
key value [key1 value1 key2 value2]setbit
key offset valuesetrange
key offset valueget
key mget
key [key1 key2 ...]getset
key valuegetrange
key start endgetbit
key offsetincr
keydecr
keyincrby
key incrementdecrby
key decrementincrbyfloat
key incrementappend
key valuestrlen
key set
key value 完整命令为:set key value [ex seconds] [px milliseconds] [nx|xx]
set有以下几个选项:
ex seconds :为键设置秒级过期时间。
px milliseconds :为键设置毫秒级过期时间。
nx 在设置值的时候,键必须不存在,才可以设置成功,用于添加新的key。
xx 在设置值的时候,键必须存在,才可以设置成功,用于更新已有的key。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:6379> set hello world ex 60
OK
setex
key seconds valuesetex 等同于 set key value ex second ,即为键设置秒级过期时间
可用版本:
>= 2.0.0
时间复杂度:
O(1)
127.0.0.1:6379> setex hello 60 world
OK
127.0.0.1:6379> ttl hello
(integer) 56
psetex
key milliseconds valuepsetex 等同于 set key value px milliseconds ,即为键设置毫秒级过期时间
可用版本:
>= 2.6.0
时间复杂度:
O(1)
127.0.0.1:6379> psetex hello 60000 world
OK
127.0.0.1:6379> ttl hello
(integer) 55
setnx
key valuesetnx 等同于 set key value nx ,即键必须不存在,才可以设值,如下:第一次为hello设值,redis 返回1 ,说明设置成功; 第二次为hello 设值,redis 返回为0,说明第二次没有成功。在实际场景中,setnx可以作为分布式锁的一种解决方案。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:6379> setnx hello world
(integer) 1
127.0.0.1:6379> setnx hello world
(integer) 0
mset
key value [key1 value1 key2 value2 ...]批量设置多个key的value。如:hello=world,my=name;
可用版本:
>= 1.0.1
时间复杂度:
O(N),N为key的个数
127.0.0.1:6379> mset hello world my name
OK
msetnx
key value [key1 value1 key2 value2 ...]批量设置多个key的value。设值之前,必须所有的key都不存在,才成功 ,否则,只要有一个key已存在,则失败。如:hello=world,my=name;
1:hello 和my 两个key 都不存在;无论几个key,成功的返回值都是1
127.0.0.1:6379> msetnx hello world my name
(integer) 1
2:hello 或 my 两个key中有一个存在;都会提示失败。返回值为0
可用版本:
>= 1.0.1
时间复杂度:
O(N),N为key的个数
127.0.0.1:6379> set hello world
(integer) 1
127.0.0.1:6379> msetnx hello world my name
(integer) 0
127.0.0.1:6379> get my
(nil)
setbit
key offset value按位替换字符串的值,因为Redis 在存储字符串类型的时候 ,都是以二进制存储,而setbit key offset 就是
按照二进制,做偏移。
如字符a 对应的ASCII码是97,转换成二进制则为:01100001,字符b 的ASCII码是98,转换成二进制为01100010 。
也就是说在redis 中把字符a 变成字符b ,需要对a 的二进制编码做偏移,把第七位(左从往右,下标为6)0变成1,把第八位(下标为7)1变成0。
可用版本:
>= 2.2.0
时间复杂度:
O(1)
127.0.0.1:6379> set hello a
OK
127.0.0.1:6379> setbit hello 6 1
OK
127.0.0.1:6379> setbit hello 7 0
OK
127.0.0.1:6379> get hello
"b"
setrange
key offset value对指定偏移的字符进行覆盖,如果指定的长度大于字符串本身的长度,则在字符串后面补0以达到offset,不存在的key被认为是空字符串; offset 的最大值为229-1(536870911),原因是redis string 类型的value最大是512M; 该命令的返回值为覆盖后的字符串长度。
可用版本:
>= 2.2.0
时间复杂度:
O(1)
1:将key为hello的值从第一位覆盖,即由world-->wredis ;
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> setrange hello 1 redis
(integer) 6
127.0.0.1:9000> get hello
"wredis"
2:将key为hello的值覆盖,如果偏移量大于字符串本身,则补0 ;
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> setrange hello 10 redis
(integer) 15
127.0.0.1:9000> get hello
"world\x00\x00\x00\x00\x00redis"
3:如果对不存在的字符串覆盖,则认为是空字符串;
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> setrange hello 5 redis
(integer) 10
127.0.0.1:9000> get hello
"\x00\x00\x00\x00\x00redis"
get
key获取字符串的值,如果key不存在,返回nil;如果key的类型不是string 类型,则返回错误。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> get hello
"world"
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> get hello
(nil)
mget
key [key1 key2 ...]
批量获取字符串类型的key,如果key不存在或者某个key 的类型不为字符串 ,则对应的key都返回nil,结果以key的顺序为准;
从性能方面来讲,虽说mget的时间复杂度为O(N),但是如果同时取1000个字符串key,使用mget远比get效率快:
因为1000次get 操作在网络链接方面的耗时已经远远超过mget的时间,假设网络时间为1毫秒,取一次数据为0.1毫秒;
则:
1000次get 的时间为:1000*1+1000*0.1 = 1100毫秒= 1.1秒
1次mget 的时间为: 1*1 + 1000 * 0.1 =101毫秒 = 0.101秒
可用版本:
>= 1.0.0
时间复杂度:
O(N),N为key的个数
127.0.0.1:9000> mset hello world hi redis
OK
127.0.0.1:9000> mget hello hi
1) "world"
2) "redis"
127.0.0.1:9000> mget hello hi notexistkey
1) "world"
2) "redis"
3) (nil)
127.0.0.1:9000> lpush mylist value1
(integer) 1
127.0.0.1:9000> mget hello hi notexistkey mylist
1) "world"
2) "redis"
3) (nil)
4) (nil)
getset
key value将key 的value 设置为新的值 ,并返回旧值 ;如果key不存在,则返回nil;如果key的类型不是string ,则返回错误。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> getset hello redis
"world"
127.0.0.1:9000> get hello
"redis"
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> getset hello world
(nil)
127.0.0.1:9000> get hello
"world"
127.0.0.1:9000> getset mylist world
(error) WRONGTYPE Operation against a key holding the wrong kind of value
getrange
key start end
该命令小于2.0版本的时候是substr 命令,其作用为返回某个string key 的value字符串区间值,具体由start 和end 的位移决定。
如果位移为负数,则是从字符串的右侧开始截取,-1代表从右侧最后一个字符串,如果位移的长度,超过了整体长度,则全部返回。
注意:
start 与end 全部都为字符串的下标(下标从0开始,右侧从-1开始),结束的下标必须要在开始的下标右侧,否则结果为空字符串;
可用版本:
>= 2.4.0
时间复杂度:
O(N),N是字符串的长度,但由于通过一个字符串创建子符串,是很容易,所以也可以认为是O(1)
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> getrange hello 0 2
"wor"
127.0.0.1:9000> getrange hello 2 4
"rld"
127.0.0.1:9000> getrange hello -1 4
"d"
127.0.0.1:9000> getrange hello -1 2
""
127.0.0.1:9000> getrange hello -1 -2
""
127.0.0.1:9000> getrange hello -1 -1
"d"
127.0.0.1:9000> getrange hello -1 -2
""
127.0.0.1:9000> getrange hello -1 0
""
127.0.0.1:9000> getrange hello -4 0
""
127.0.0.1:9000> getrange hello -4 1
"o"
127.0.0.1:9000> getrange hello -4 2
"or"
127.0.0.1:9000> getrange hello 0 10
"world"
getbit
key offset返回指定下标对应的字符串的bit值。当offset 大于字符串的时候 ,直接返回0的bit值。
可用版本:
>= 2.2.0
时间复杂度:
O(1)
127.0.0.1:9000> setbit hello 3 1
(integer) 1
127.0.0.1:9000> get hello
"world"
127.0.0.1:9000> setbit hello 3 0
(integer) 1
127.0.0.1:9000> get hello
"gorld"
127.0.0.1:9000> getbit hello 3
(integer) 0
127.0.0.1:9000> getbit hello 20
(integer) 0
incr
key
计数命令incr,可以用于对数值做自增操作;返回结果有三种:
如果数据不为整数,则返回错误;
如果是整数,返回自增结果;最大为64位的整数
如果键不存在,则返回1
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> incr num
(integer) 2
127.0.0.1:9000> incr num
(integer) 3
127.0.0.1:9000> incr hello
(error) ERR value is not an integer or out of range
decr
key
与计数命令incr相反,用于对数值做自减操作;返回结果有三种:
如果数据不为整数,则返回错误;
如果是整数,返回自减结果;如果字符串不能解析成64位的整数,则报错
如果键不存在,则返回-1
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello 5
OK
127.0.0.1:9000> decr hello
(integer) 4
127.0.0.1:9000> decr hello
(integer) 3
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> decr hello
(error) ERR value is not an integer or out of range
127.0.0.1:9000> set hello 256987322390480948024562389123
OK
127.0.0.1:9000> decr hello
(error) ERR value is not an integer or out of range
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> decr hello
(integer) -1
127.0.0.1:9000> decr hello
(integer) -2
incrby
key increment
与计数命令incr类似,可以用于对数值做自增操作;但是需要手动提供增长步长;返回结果有三种:
如果数据不为整数,则返回错误;
如果是整数,返回自增结果;最大为64位的整数
如果键不存在,则返回步长。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> incrby hello 5
(integer) 5
127.0.0.1:9000> get hello
"5"
127.0.0.1:9000> incrby hello 256987322390480948024562389123
(error) ERR value is not an integer or out of range
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> incrby hello 5
(error) ERR value is not an integer or out of range
decrby
key decrement
与命令incrby类似,可以用于对数值做自减操作;但是需要手动提供减少步长,返回结果有三种:
如果数据不为整数,则返回错误;
如果是整数,返回自减结果;最大为64位的整数;
如果键不存在,则返回负的步长。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello 100
OK
127.0.0.1:9000> decrby hello 5
(integer) 95
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> decrby hello 5
(integer) -5
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> decrby hello
(error) ERR wrong number of arguments for 'decrby' command
incrbyfloat
key increment
与命令incrby类似,只不过步长为浮点数,可以用于对数值做自减操作,返回结果有三种:
如果数据不为转化为浮点数,则返回错误;
如果可以转换为浮点数,返回自增结果;输出精度都固定为小数点后17位;
如果键不存在,则返回对应的浮点步长。
可用版本:
>= 2.6.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello 0.5
OK
127.0.0.1:9000> incrbyfloat hello 10.4
"10.9"
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> incrbyfloat hello 10.4
(error) ERR value is not a valid float
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> incrbyfloat hello 10.5
"10.5"
append
key value对字符串类型的key,进行值的追加;如果该key不存在,则默认该key值为空字符串;返回结果为追加后的字符串长度。
可用版本:
>= 2.0.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> append hello cup
(integer) 8
127.0.0.1:9000> get hello
"worldcup"
strlen
key返回字符串类型的value长度;如果不是字符串类型,则返回错误;如果key不存在,则返回0。
可用版本:
>= 2.2.0
时间复杂度:
O(1)
127.0.0.1:9000> set hello world
OK
127.0.0.1:9000> strlen hello
(integer) 5
127.0.0.1:9000> del hello
(integer) 1
127.0.0.1:9000> strlen hello
(integer) 0
127.0.0.1:9000> hset test field value
(integer) 1
127.0.0.1:9000> strlen test
(error) WRONGTYPE Operation against a key holding the wrong kind of value