Redis 中 String 字符串类型详解
目录
Redis 字符串类型详解
字符串类型概述
基本特性
常见命令
SET
GET
MGET
MSET
SETNX
计数命令
其他命令
内部编码
Redis 字符串类型详解
在 Redis 中,字符串是最基础也是最常用的数据类型。这里介绍 Redis 字符串类型的特性、常见命令以及内部编码机制。
字符串类型概述
基本特性
- 所有键都是字符串:在 Redis 里,所有的键(key)都是字符串类型。
- 其他数据结构的基础:列表、集合等其他数据结构的元素也都是字符串类型。
- 值的多样性:字符串类型的值可以是普通的文本、JSON 或 XML 格式的字符串、数字(整数或浮点数),甚至是二进制数据(如图片、音频、视频等)。
- 最大长度限制:一个字符串的最大长度不能超过 512 MB。
- 字符集编码:Redis 内部存储字符串时,完全按照二进制流的形式保存,不处理字符集编码问题。客户端传入的命令是什么字符集编码,就存储什么字符集编码。
常见命令
SET
-
功能:设置一个键的值。如果这个键之前已经存在,那么它的旧值会被新值覆盖,无论原来的数据类型是什么。之前的过期时间也会失效。
-
语法:
1SET key value [EX seconds|PX milliseconds] [NX|XX]
-
选项:
EX seconds
:以秒为单位设置键的过期时间。PX milliseconds
:以毫秒为单位设置键的过期时间。NX
:只有在键不存在时才进行设置。XX
:只有在键存在时才进行设置。
-
示例:
1redis> EXISTS mykey 2(integer) 0 3redis> SET mykey "Hello" 4OK 5redis> GET mykey 6"Hello" 7redis> SET mykey "World" NX 8(nil) 9redis> DEL mykey 10(integer) 1 11redis> EXISTS mykey 12(integer) 0 13redis> SET mykey "World" XX 14(nil) 15redis> GET mykey 16(nil) 17redis> SET mykey "World" NX 18OK 19redis> GET mykey 20"World" 21redis> SET mykey "Will expire in 10s" EX 10 22OK 23redis> GET mykey 24"Will expire in 10s" 25redis> GET mykey # 10秒之后 26(nil)
GET
功能:获取一个键对应的值。如果键不存在,返回 nil
。如果值不是字符串类型,会报错。
语法:
1GET key
示例:
1redis> GET nonexisting
2(nil)
3redis> SET mykey "Hello"
4OK
5redis> GET mykey
6"Hello"
7redis> DEL mykey
8(integer) 1
9redis> EXISTS mykey
10(integer) 0
11redis> HSET mykey name Bob
12(integer) 1
13redis> GET mykey
14(error) WRONGTYPE Operation against a key holding the wrong kind of value
MGET
功能:一次性获取多个键的值。如果某个键不存在或者其值不是字符串类型,返回 nil
。
语法:
1MGET key [key ...]
示例:
1redis> SET key1 "Hello"
2OK
3redis> SET key2 "World"
4OK
5redis> MGET key1 key2 nonexisting
61) "Hello"
72) "World"
83) (nil)
MSET
功能:一次性设置多个键的值。
语法:
1MSET key value [key value ...]
示例:
1redis> MSET key1 "Hello" key2 "World"
2OK
3redis> GET key1
4"Hello"
5redis> GET key2
6"World"
SETNX
功能:设置一个键的值,但只在键不存在的情况下才设置。
语法:
1SETNX key value
示例:
1redis> SETNX mykey "Hello"
2(integer) 1
3redis> SETNX mykey "World"
4(integer) 0
5redis> GET mykey
6"Hello"
计数命令
INCR:将键对应的数值加 1。如果键不存在,则视为值为 0。
语法:
1INCR key
示例:
1redis> EXISTS mykey
2(integer) 0
3redis> INCR mykey
4(integer) 1
5redis> SET mykey "10"
6OK
7redis> INCR mykey
8(integer) 11
DECR:将键对应的数值减 1。如果键不存在,则视为值为 0。
语法:
1DECR key
示例:
1redis> EXISTS mykey
2(integer) 0
3redis> DECR mykey
4(integer) -1
5redis> SET mykey "10"
6OK
7redis> DECR mykey
8(integer) 9
INCRBY 和 DECRBY:分别将键对应的数值加上或减去指定的值。
语法:
1INCRBY key increment
2DECRBY key decrement
示例:
1redis> INCRBY mykey 3
2(integer) 3
3redis> DECRBY mykey 3
4(integer) 0
INCRBYFLOAT:将键对应的浮点数值加上指定的值。
语法
1INCRBYFLOAT key increment
示例:
1redis> SET mykey 10.50
2OK
3redis> INCRBYFLOAT mykey 0.1
4"10.6"
其他命令
APPEND:将值追加到键对应的字符串后面。如果键不存在,则效果等同于 SET
命令。
语法:
1APPEND key value
示例:
1redis> APPEND mykey "Hello"
2(integer) 5
3redis> APPEND mykey " World"
4(integer) 11
GETRANGE:获取键对应字符串的一部分,由起始和结束位置确定。
语法:
1GETRANGE key start end
示例:
1redis> SET mykey "This is a string"
2OK
3redis> GETRANGE mykey 0 3
4"This"
SETRANGE:从指定偏移量开始覆盖字符串的一部分。
语法:
1SETRANGE key offset value
示例:
1redis> SET key1 "Hello World"
2OK
3redis> SETRANGE key1 6 "Redis"
4(integer) 11
STRLEN:获取键对应字符串的长度。
语法:
1STRLEN key
示例:
1redis> SET mykey "Hello world"
2OK
3redis> STRLEN mykey
4(integer) 11
内部编码
Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。字符串类型的内部编码有三种:
- int:8 个字节的长整型。
- embstr:小于等于 39 个字节的字符串。
- raw:大于 39 个字节的字符串。
示例
整型类型:
1127.0.0.1:6379> set key 6379
2OK
3127.0.0.1:6379> object encoding key
4"int"
短字符串:
1127.0.0.1:6379> set key "hello"
2OK
3127.0.0.1:6379> object encoding key
4"embstr"
长字符串:
1127.0.0.1:6379> set key "one string greater than 39 bytes ........"
2OK
3127.0.0.1:6379> object encoding key
4"raw"
感谢阅览,后续会再更新 Redis 中其他数据类型的知识,感谢阅览!!