Redis 数据类型-String

String 是Redis 中存储的最基本也是最简单的数据类型, String 可存储字符串,数字等。在生产应用中,通常会将业务对象序列化成json 串, 存储在String 中.String 这种数据结构中key 要唯一.

1. 常用命令

以下命令只适用于String 结构的key-value, 对其它结构使用会报错.redis 中的key 在全局应该是唯一的,不区分结构类型.

操作命令

描述

返回值

set $key $val [EX $seconds] [PX $milSeconds] [NX] [XX]

新增/覆盖键值对

正常执行返回OK,若添加NX或XX参数,执行成功返回OK, 失败返回nil

setex $key $seconds $val

新增/覆盖键值对并设置过期时间

正常执行返回OK,如果key存在进行覆盖

setnx $key $value

新增key不存在的键值对

如果key不存在则设置成功,返回1; 否则返回0

strlen $key

获取key 对应的value 的字符长度

会把value 当做字符串,返回字符串的长度

incr/decr $key

整数型value 自增/自减1

正常返回自增自减后的值, 如果value 为非整数型(浮点型或字符串型),则会报错

incrby/incrbyfloat $key $increment

数字型自增自减具体数字

同incr 命令约束类似

mset/msetex

批量操作key-value

一个事务,同时成功,同时失败. 其它参见 set/setex

get

获取key 对应的value

如果key 存在返回对应的value, 否则返回nil

getset

获取key对应原来的value,并赋值新的value

原子性操作, 若key 存在则返回原来的值,否则返回nil

1.1 set 命令

设置String 结构的兼职对, 如果key 已经存在, 则会对原来的key 进行完全覆盖, 包括原来的key 的类型和设置的过期时间. 这些都需要重新设置.set 加上选项可完全替代setex, setnx, psetex 这些命令.

  • EX $secondes: 设置按键时, 同时设置过期时间. 单位为秒
  • PX $milSecondes: 设置按键时, 同时设置过期时间. 单位为毫秒
  • NX: 当键不存在时,设置成功, 返回OK; 否则返回nil.
  • XX: 当键存在时, 设置成功, 返回OK; 否则返回nil.
# 设置成功后返回OK
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"

# 使用NX 设置不成功后, 返回nil
127.0.0.1:6379> set name lisi NX
(nil)
127.0.0.1:6379> get name
"zhangsan"

# 使用XX 设置成功时, 返回OK
127.0.0.1:6379> set name wangwu XX
OK
127.0.0.1:6379> get name
"wangwu"

# 设置key时同时设置过期时间为1000 秒,并使用ttl 查看过期时间
127.0.0.1:6379> set age 20 EX 1000
OK
127.0.0.1:6379> ttl age
(integer) 997

# 覆盖更新key 时,会清空key 的过期时间
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> ttl age
(integer) -1

1.2 setex/psetex

设置String 类型key-value 并设置过期时间, 原子操作, 相当于将set, expire 命令当作一个事务来执行. setex 过期时间为秒, psetex 过期时间为毫秒

127.0.0.1:6379> setex name 1000 zhangsan
OK
127.0.0.1:6379> ttl name
(integer) 997

1.3 setnx

如果key 不存在则设置成功,返回1; 否则返回0

127.0.0.1:6379> setnx age 20
(integer) 1
127.0.0.1:6379> setnx age 35
(integer) 0

1.4 strlen

只能获取String 结构的key 对应的value 的字符串长度.对于非String 结构的key 会报错

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> hset chars A aa
(integer) 1
127.0.0.1:6379> STRLEN name
(integer) 8
127.0.0.1:6379> STRLEN chars
(error) WRONGTYPE Operation against a key holding the wrong kind of value

1.5 incr/decr

如果String 类型key对应的value是整数型(不能是浮点型),对value 自增/自减1,否则抛出异常.

# 设置整数型value
127.0.0.1:6379> set age 20
OK

# 整数型value 自增1, 返回自增之后的value
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"

# 整数型value 自减1, 返回自减后的value
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> get age
"20"

# 如果是非整数型value,调用自增自减操作会报错
127.0.0.1:6379> set price 20.56
OK
127.0.0.1:6379> incr price
(error) ERR value is not an integer or out of range

# key 不存在时,会自动创建key-value, value 值为0,并返回自增/自减后的值
127.0.0.1:6379> INCR money
(integer) 1
127.0.0.1:6379> decr number
(integer) -1

1.6 incrby/incrbyfloat

对整数或浮点数自增自减指定数.

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> set price 20.5
OK
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> incrbyfloat price 3.2
"23.7"

1.7 mset

批量设置键值对,同时成功同时失败.除了批量的概念之外,和set 无选项命令基本无差异。对于已经存在的key 也是覆盖式更新,会同时重置key 的过期时间.

# 批量设置
127.0.0.1:6379> mset A a B b
OK

# 覆盖key 时重置过期时间
127.0.0.1:6379> setex C 1000 ccc
OK
127.0.0.1:6379> ttl C
(integer) 997
127.0.0.1:6379> MSET C ccc
OK
127.0.0.1:6379> ttl C
(integer) -1

1.8 msetnx

批量设置不存在的键值对, 同时成功,同时失败. 当设置的键值对都不存在时,成功返回OK,不成功返回0.

# 批量设置不存在的键值对,成功返回OK
127.0.0.1:6379> mset A a B b
OK

# 对于key A 已经存在, 所以此次执行无效.
127.0.0.1:6379> msetnx A aaa C bbb
(integer) 0
127.0.0.1:6379> keys *
1) "B"
2) "A"
127.0.0.1:6379> get A
"a"

1.9 get

获取String类型key对应的value, 如果key 存在返回value, 否则返回nil. 对于非String 结构的key 会报错.

127.0.0.1:6379> get name
"zhangshan"

1.10 getset

覆盖更新key 对应的value 并返回原来的value. 如果key 不存在,则新增key-value,返回nil. 这是一个实现get与set 的原子性操作.

# key 不存在返回nil
127.0.0.1:6379> GETSET age 20
(nil)

# key 存在时返回原来的value
127.0.0.1:6379> GETSET age 30
"20"

2. 不常用命令

String 结构还有一些对字符串进行追加,修改,截取的命令.这些命令并不常用。

2.1 append

拼接字符串,对value 值进行追加。返回追加后字符串的长度。如果key 不存在则自动创建key. 此命令并不常用

127.0.0.1:6379> set name hello
OK
127.0.0.1:6379> append name ,world
(integer) 11
127.0.0.1:6379> get name
"hello,world"

2.2 setrange

覆盖key对应的value一部分字符,不常用.

127.0.0.1:6379> setrange name 5 --
(integer) 8
127.0.0.1:6379> get name
"zhang--n"

2.3 getrange

截取字符串, 获取key对应的value部分字符。不常用

127.0.0.1:6379> set number 0123456789
OK
127.0.0.1:6379> getrange number 0 4
"01234"
127.0.0.1:6379> getrange number -3 -1
"789"
127.0.0.1:6379> getrange number 0 -1
"0123456789"

2.4 二进制命令

Redis 还提供了一些直接将String 作为二进制来操作的命令, 如: BITCOUNT,BITFIELD,BITOP,BITPOS