不止是java等语言存在序列化和反序列化,在Redis中同样也存在序列化(dump命令)和反序列化(restore命令)。下面我们将通过讲解dump和restore命令的用法来了解Redis的序列化和反序列化。
语法:dump key
序列化给定 key ,并返回被序列化的值,使用restore命令可以将这个值反序列化为 Redis 键。
序列化生成的值有以下几个特点:
它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和。
值的编码格式和 RDB 文件保持一致。
RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。
序列化的值不包括任何生存时间信息。
可用版本:
>= 2.6.0
时间复杂度:
查找给定键的复杂度为 O(1) ,对键进行序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。
如果序列化的对象是比较小的字符串,那么复杂度为 O(1) 。
返回值:
如果 key 不存在,那么返回 nil 。否则,返回序列化之后的值。
实例:
# 设置greeting key的值为“hello, dumping world!” redis> set greeting "hello, dumping world!" OK # 序列化greeting key redis> dump greeting "\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde" # 序列化一个不存在的key redis> dump not-exists-key (nil)
语法:restore key ttl serialized-value
反序列化给定的序列化值,并将它和给定的 key 关联。
参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间。
restore 在执行反序列化之前会先对序列化值的 RDB 版本和数据校验和进行检查,如果 RDB 版本不相同或者数据不完整的话,那么restore会拒绝进行反序列化,并返回一个错误。
可用版本:
>= 2.6.0
时间复杂度:
查找给定键的复杂度为 O(1) ,对键进行反序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。
有序集合(sorted set)的反序列化复杂度为 O(N*M*log(N)) ,因为有序集合每次插入的复杂度为 O(log(N)) 。
如果反序列化的对象是比较小的字符串,那么复杂度为 O(1) 。
返回值:
如果反序列化成功那么返回 OK ,否则返回一个错误。
实例:
# 设置一个greeting key,值为“hello, dumping world!” redis> set greeting "hello, dumping world!" OK # 使用dump命令序列化greeting key redis> dump greeting "\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde" # 反序列化greeting的序列化结果到greeting-again ke redis> restore greeting-again 0 "\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde" OK # 获取反序列化后的key的值 redis> get greeting-again "hello, dumping world!" # 使用错误的值进行反序列化 redis> restore fake-message 0 "hello moto moto blah blah" (error) ERR DUMP payload version or checksum are wrong