Redis的string类及基础指令
数据结构和内部编码
string
1️⃣字符串数据类型

2️⃣内部编码
| 编码 | 说明 |
|---|---|
| int | 存储64位(8个字节)有符号整数时使用 |
| embstr | 短字符串专用,内存分配效率更高 |
| raw | 长字符串使用的基础动态字符串 |
-
这些内部编码,会随着存入的数据变化进行变换,比如数字和字符一起存会让int转为embstr或者raw
-
针对汉字的存储,在reids的客户端是什么编码,存入时就是什么编码
127.0.0.1:6379> set key 你好
OK
127.0.0.1:6379> get key
"\xe4\xbd\xa0\xe5\xa5\xbd"
这里 \xe4\xbd\xa0 就是 你 的UTF-8的编码,\xe5\xa5\xbd 这个就是 好 的编码
-
想要Redis能够get到汉字,可以在启动客户端的时候,使用这样的命令
redis-cli --raw ubuntu:~$ redis-cli --raw 127.0.0.1:6379> get key 你好
3️⃣常见指令
1.1 SET
将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之
前关于此 key 的 TTL 也全部失效。
语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
SET 命令支持多种选项来影响它的行为:
- EX seconds 使用秒作为单位设置key的过期时间
- PX milliseconds 使用毫秒为单位设置key的过期时间
- NX 只在key不存在时才进行设置,如果key存在,则该命令不执行
- XX 只在key存在时才进行设置,如果key不存在,则该命令不执行
注意:
- \| 这表示中括号里面的设置可选,但是只能选择由 | 分割的其中一个
- 上面的部分命令可以进行合并,SETNX,SETEX,PSETEX等,这些算是旧命令了
返回值:
如果设置成功,返回 OK
如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)
-
EX
127.0.0.1:6379> SET key1 hello EX 100 OK 127.0.0.1:6379> ttl key1 (integer) 92 127.0.0.1:6379> get key1 "hello" 127.0.0.1:6379> SETEX key2 100 world OK 127.0.0.1:6379> ttl key2 (integer) 95 127.0.0.1:6379> get key2 "world" -
NX
127.0.0.1:6379> exists key3 (integer) 0 127.0.0.1:6379> set key3 hello nx OK 127.0.0.1:6379> set key3 world nx (nil) 127.0.0.1:6379> get key3 "hello" 127.0.0.1:6379> exists key4 (integer) 0 127.0.0.1:6379> setnx key4 hello (integer) 1 127.0.0.1:6379> setnx key4 world (integer) 1 127.0.0.1:6379> get key4 "hello" -
XX
127.0.0.1:6379> exists key5 (integer) 0 127.0.0.1:6379> set key5 hello xx (integer) 0 127.0.0.1:6379> set key5 hello OK 127.0.0.1:6379> set key5 hello xx OK 127.0.0.1:6379> get key5 "hello"
1.2 GET
获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错
语法:
GET key
返回值:
key 对应的 value,或者 nil 当 key 不存在
示例:
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> set key abc
OK
127.0.0.1:6379> get key
"abc"
1.3 MSET
一次性设置多个 key 的值
语法:
MSET key value [key value ...]
返回值:
永远是 OK
示例:
127.0.0.1:6379> mset key1 aa key2 bb key3 cc
OK
127.0.0.1:6379> mget key1 key2 key3
1) "aa"
2) "bb"
3) "cc"
1.4 MGET
一次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil
语法:
MGET key [key ...]
返回值:
对应 value 的列表
示例:
127.0.0.1:6379> mset key1 aa key2 bb key3 cc
OK
127.0.0.1:6379> mget key1 key2 key3
1) "aa"
2) "bb"
3) "cc"
127.0.0.1:6379> mget key4
1) (nil)
- 使用 mget / mset 由于可以有效地减少了网络时间,所以性能相较更高
2.1 INCR
将 key 对应的 string 表示的数字加一。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对
应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错
语法:
INCR key
返回值:
integer 类型的加完后的数值
示例:
redis> EXISTS mykey
(integer) 0
redis> INCR mykey
(integer) 1
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> INCR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> INCR mykey
(error) value is not an integer or out of range
2.2 INCRBY
将 key 对应的 string 表示的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如
果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错
语法:
INCRBY key decrement
返回值:
integer 类型的加完后的数值
示例:
redis> EXISTS mykey
(integer) 0
redis> INCRBY mykey 3
(integer) 3
redis> SET mykey "10"
"OK"
redis> INCRBY mykey 3
(integer) 13
redis> INCRBY mykey "not a number"
(error) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> INCRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> INCRBY mykey 3
(error) value is not an integer or out of range
2.3 DECR
将 key 对应的 string 表示的数字减一。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对
应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错
语法:
DECR key
返回值:
integer 类型的减完后的数值
示例:
redis> EXISTS mykey
(integer) 0
redis> DECR mykey
(integer) -1
redis> SET mykey "10"
"OK"
redis> DECR mykey
(integer) 9
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> DECR mykey
(error) value is not an integer or out of range
2.4 DECRBY
将 key 对应的 string 表示的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如
果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错
语法:
DECRBY key decrement
返回值:
integer 类型的减完后的数值
示例:
redis> EXISTS mykey
(integer) 0
redis> DECRBY mykey 3
(integer) -3
redis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7
redis> DECRBY mykey "not a number"
(error) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
"OK"
redis> DECRBY mykey 3
(error) value is not an integer or out of range
2.5 INCRBYFLOAT
将 key 对应的 string 表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果
key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是一个浮点数,则报
错。允许采用科学计数法表示浮点数
语法:
INCRBYFLOAT key increment
返回值:
加/减完后的数值
示例:
redis> SET mykey 10.50
"OK"
redis> INCRBYFLOAT mykey 0.1
"10.6"
redis> INCRBYFLOAT mykey -5
"5.6"
redis> SET mykey 5.0e3
"OK"
redis> INCRBYFLOAT mykey 2.0e2
"5200"
3.1 APPEND
如果 key 已经存在并且是一个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,
则效果等同于 SET 命令
语法:
APPEND KEY VALUE
返回值:
追加完成之后 string 的长度
示例:
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> GET mykey
"Hello"
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
3.2 GETRANGE
返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭)。可以使用负数表示倒数。-1 代表
倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整
成正确的值
语法:
GETRANGE key start end
返回值:
string 类型的子串
示例:
redis> SET mykey "This is a string"
"OK"
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"
3.3 SETRANGE
覆盖字符串的一部分,从指定的偏移开始
语法:
SETRANGE key offset value
返回值:
替换后的 string 的长度
示例:
redis> SET key1 "Hello World"
"OK"
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"
3.4 STRLEN
获取 key 对应的 string 的长度。当 key 存放的类似不是 string 时,报错
语法:
STRLEN key
返回值:
string 的长度。或者当 key 不存在时,返回 0
示例:
redis> SET mykey "Hello world"
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0