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 --rawubuntu:~$ 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 range2.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 range2.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 range2.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 range2.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