一. 字符串对象编码
Redis 中字符串可以存储 3 种类型, 分别是字节串(byte string), 整数, 浮点数. 在上章节中讲到字符串对象的编码可以是 int, raw,embstr. 如果一个字符串对象保存的是整数值, 那么对象 RedisObject 结构的 ptr 属性里面将 void * 转换成 long, 字符串对象的编码设置为 int.
例 1: 使用 set 命令, 创建一个 int 编码的字符串对象.
- 127.0.0.1:6379> set num1 10086
- OK
- 127.0.0.1:6379> object encoding num1
- "int"
RedisObject 结构中 ptr 指向一个 long 值, 参考图如下所示:
例 2: 使用 set 命令, 创建一个 raw 编码的字符串对象. 这个字符串值的长度大于 32 字节.
- 127.0.0.1:6379> set story3 "long long long long long long long long long ..."
- OK
- 127.0.0.1:6379> strlen story3
- (integer) 48
- 127.0.0.1:6379> object encoding story3
- "raw"
RedisObject 结构中 ptr 指向 SDS 的 sdshdr 结构, 参考图如下所示:
例 3: 使用 set 命令, 创建一个 embstr 编码的字符串对象, 这个字符串值的长度小于等于 32 字节.
- 127.0.0.1:6379> set story4 "long long long long long lon"
- OK
- 127.0.0.1:6379> strlen story4
- (integer) 28
- 127.0.0.1:6379> object encoding story4
- "embstr"
embstr 编码是专门用于保存短字符串的一种优化编码方式, 这种编码和 raw 编码一样, 都使用 RedisObject 结构和 sdshdr 结构来表示字符串对象. 使用 embstr 编码的字符串对象来保存短字符串值有以下好处:
(1) embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次.
(2) 释放 embstr 编码的字符串对象只需要调用一次内存释放函数. 而 raw 编码的为二次.
(3) embstr 编码的字符串对象的所有数据都保存在一块连续的内存中, 能更好的带来缓存优势.
例 4: 使用 set 命令, 创建一个浮点数, 也是作为字符串保存, 属于 embstr 编码的字符串对象.
- 127.0.0.1:6379> set pi 3.14
- OK
- 127.0.0.1:6379> object encoding pi
- "embstr"
最后: 总结字符串对象保存各类型值的编码方式
字符串对象值 | 编码 |
可以用 long 类型保存的整数 | int |
可以用 long double 类型保存的浮点数 | Embstr 或者 raw |
值长度太长而没办法用 long 类型表示的整数,或者浮点数。 | Embstr 或者 raw |
值的长度大于 32 字节 | raw |
长度小于 32 字节 | Embstr |
二. key 命令
-- del 命令 删除存在的 key, 如果没有存在的 key 返回 0.
- 127.0.0.1:6379> del msg
- (integer) 1
-- dump 命令 序列化给定 key, 如果 key 不存在, 那么返回 nil, 否则返回序列化之后的值.
- 127.0.0.1:6379> dump msg
- "\x00\x05hello\b\x00\xda_3\xc9\xcc-\xaa2"
-- EXISTS 命令 用于检查给定 key 是否存在, 若 key 存在返回 1 , 否则返回 0 .
- 127.0.0.1:6379> exists msg
- (integer) 1
-- Expire 命令用于设置 key 的过期时间. key 过期后将不再可用. 设置成功返回 1. 下面设置了过期时间为 1 分钟, 1 分钟后该键会自动删除.
- 127.0.0.1:6379> expire msg 60
- (integer) 1
-- pattern 命令用于查找所有符合给定模式, 返回符合给定模式的 key 列表 (Array).
- 127.0.0.1:6379> set msg1 1
- OK
- 127.0.0.1:6379> set msg2 2
- OK
- 127.0.0.1:6379> set msg3 3
- OK
- 127.0.0.1:6379> keys msg*
- 1) "msg2"
- 2) "msg1"
- 3) "msg3"
-- PERSIST 命令用于移除给定 key 的过期时间, 使得 key 永不过期.
-- Pttl 命令以毫秒为单位返回 key 的剩余过期时间.
-- ttl 命令以秒为单位返回 key 的剩余过期时间.
- 127.0.0.1:6379> expire msg1 60
- (integer) 1
- 127.0.0.1:6379> ttl msg1
- (integer) 49
- 127.0.0.1:6379> persist msg1
- (integer) 1
- 127.0.0.1:6379> ttl msg1
- (integer) -1
-- RANDOMKEY 命令从当前数据库中随机返回一个 key
- 127.0.0.1:6379> RANDOMKEY
- "fruit-price"
-- Rename 命令用于修改 key 的名称
- 127.0.0.1:6379> rename msg1 msg1new
- OK
-- Renamenx 命令修改 key 名称, 新的 key 没有存已有数据库中时, 修改成功. 返回 1.
- 127.0.0.1:6379> get msg2
- "2"
- 127.0.0.1:6379> get msg3
- "3"
- 127.0.0.1:6379> renamenx msg2 msg3
- (integer) 0
- 127.0.0.1:6379> renamenx msg2 msg4
- (integer) 1
其它:
MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中.
-- type 命令用于返回 key 所储存的值的类型
none (key 不存在),string (字符串),list (列表),set (集合),zset (有序集),hash (哈希表)
三. 字符串对象命令
-- set 命令指定 key 的值
-- get 命令获取指定 key 的值
-- GETRANGE 返回 key 中字符串值的子字符
- 127.0.0.1:6379> set msg "hello"
- OK
- 127.0.0.1:6379> getrange msg 0 2
- "hel"
-- getset 命令将给定 key 的值重新设置 value , 并返回 key 的旧值(old value)
- 127.0.0.1:6379> getset msg "hi"
- "hello"
- 127.0.0.1:6379> get msg
- "hi"
-- MGET 命令获取所有 (一个或多个) 给定 key 的值
- 127.0.0.1:6379> mget msg msg3
- 1) "hi"
- 2) "3"
-- setex 将值 value 关联到 key , 并将 key 的过期时间设为 seconds (以秒为单位)
- 127.0.0.1:6379> setex message 10 "hello"
- OK
- 127.0.0.1:6379> get message
- "hello"
- 127.0.0.1:6379> get message
(nil) 10 秒后
-- setnx 命令 只有在 key 不存在时设置 key 的值, 下面 msg 键存在, 设置失败返回 0,msg1 键不存在, 设置成功, 返回 1
- 127.0.0.1:6379> setnx msg "hello"
- (integer) 0
- 127.0.0.1:6379> setnx msg1 "hello"
- (integer) 1
-- setrange 命令用 value 参数覆写给定 key 所储存的字符串值, 从偏移量 offset 开始.
- 127.0.0.1:6379> set msg "hello"
- OK
- 127.0.0.1:6379> setrange msg 1 "i..."
- (integer) 5
- 127.0.0.1:6379> get msg
- "hi..."
-- strlen 命令返回 key 所储存的字符串值的长度.
- 127.0.0.1:6379> strlen msg
- (integer) 5
-- mset 命令同时设置一个或多个 key-value 对.
- 127.0.0.1:6379> mset msg "hi" msg2 "hi"
- OK
- 127.0.0.1:6379> mget msg msg2
- 1) "hi"
- 2) "hi"
-- msetnx 命令同时设置一个或多个 key-value 对, 所有给定 key 都必须不存在, 只要存在一个已有的 key, 所有添加失败.
- 127.0.0.1:6379> msetnx msg6 "hello" msg5 "hello"
- (integer) 1
- 127.0.0.1:6379> mget msg6 msg5
- 1) "hello"
- 2) "hello"
-- psetex 命令 它以毫秒为单位设置 key 的生存时间, 而不是像 SETEX 命令那样, 以秒为单位.
- 127.0.0.1:6379> psetex msg5 5000 "hi"
- OK
- 127.0.0.1:6379> get msg5
- "hi"
- 127.0.0.1:6379> get msg5
(nil) 5 秒后
-- Incr 命令将 key 中储存的数字值增一.
- 127.0.0.1:6379> set num 1
- OK
- 127.0.0.1:6379> incr num
- (integer) 2
- 127.0.0.1:6379> get num
- "2"
-- Incrby 命令将 key 中储存的数字加上指定的增量值. 在值为 2 是加 10.
- 127.0.0.1:6379> incrby num 10
- (integer) 12
- 127.0.0.1:6379> get num
- "12"
-- Decrby 命令将 key 所储存的值减去指定的减量值. 将值为 12 减去 10.
- 127.0.0.1:6379> decrby num 10
- (integer) 2
- 127.0.0.1:6379> get num
- "2"
-- Append 命令用于为指定的 key 追加值.
- 127.0.0.1:6379> set msg "hello"
- OK
- 127.0.0.1:6379> append msg "world"
- (integer) 10
- 127.0.0.1:6379> get msg
- "helloworld"
来源: https://www.cnblogs.com/MrHSR/p/9957253.html