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