Redis 如何设置包含空格的Value
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 如何设置包含空格的Value相关的知识,希望对你有一定的参考价值。
参考技术A Redis对于一个做后端的人来说,应该再熟悉不过了,但是最近工作中折腾一个问题许久,其实问题不难,已经不是第一次遇到,以前总没有寻根问源,用其他方式规避了问题,导致一而再的犯同样的错误,着实需要反思下,因此有了此文。Redis 中 string 类型数据结构在设置一对 key-value 的时候, value 中有空格。我使用的 Redis API 接口是已经封装了一层的,只用传入一个命令字符串就行,因此我会先将命令字符串拼接好,然后调用相应的接口即可,然后呢,操作就失败了。。。
Redis 的 API 接口在解析字符串的时候,会将空格作为分隔符分割命令,从而导致命令的参数个不对。
比如: SET k "V V",分割后就变为了 SET 、 K 、 V 、 V 4个块,最终 Redis 执行命令的时候就会判定语法错误,因为参数超过了 SET 命令的限制要求。
刚遇到这个问题,第一反应就是去处理命令字符串,将字符串中value部分特殊处理,比如用 " 将有空格的字符串包含起来,自以为这样就不会被分割,实际结果就是狠狠的打脸,依然不行,究其原因就是:拼接的时候采用的 prinf 格式标准方式拼接,的确会对 " 包含的字符串特殊处理,但是当命令字符串再次传入 Redis API 中的时候就是一普通字符串了,依旧不行。
那还有其他方式么,当然有,将字符串转码,取出的时候再解码,但这种方式明显会恶心到自己,是万万不能接受的,所以我就决定花了一点时间去看了看 Redis 对应 API 的源码。
Redis 执行命令的 API 为 redisCommand。
仔细看了下源码发现,该 API 提供了和printf一样的标准格式化输入,也就是说,直接使用 redisCommand 是可以完美处理有空格的value,只是因为我们封装了一层就导致了格式化失效了,遇到空格就被分割了,最终导致命令语法错误。
redisCommand 的输入格式与 prinf 基本相同,甚至可以说是增强版的,下面一个个说明。
|数据长度|d i|u o x X|
|:--:|:-:|:-:|:-:|:
|none|int|unsigned int|
|hh|signed char|unsigned char|
|h|short int|unsigned short int|
|l|long int| unsigned long int|
|ll|long long int| unsigned long long int|
注意:上表表示不同的前缀表示的数据范围不同
输出为:
细心的各位一定注意到了,输入都为-161,但是只有一个原样输出了-161,并且那个是强制转换了成了 long 型才输出的。这个就涉及到了类型转换了。
基本原则如下:
最后一张图说明:
面对问题,想着回避,不去解决总结,总有一天又会再次遇见。自己偷懒挖的坑还得自己填。
以上是关于Redis 如何设置包含空格的Value的主要内容,如果未能解决你的问题,请参考以下文章