Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 存储redis密钥的最佳方法_C_Ruby_Database_Redis_Nosql - Fatal编程技术网

C 存储redis密钥的最佳方法

C 存储redis密钥的最佳方法,c,ruby,database,redis,nosql,C,Ruby,Database,Redis,Nosql,我使用Redis来存储一些信息,并检测这些信息随时间的变化(例如,想想用户和位置)。使用较长或较短的键名的值是什么?使用较长的键更清晰,但使用较长的键名会带来很大的内存或性能成本吗 以下是一些例子: SET L:123456 "<name> <latitude> <longitude> ..." HSET U:987654321 loc 123456 time <epoch> 设置L:123456“…” HSET U:987654321 loc

我使用Redis来存储一些信息,并检测这些信息随时间的变化(例如,想想用户和位置)。使用较长或较短的键名的值是什么?使用较长的键更清晰,但使用较长的键名会带来很大的内存或性能成本吗

以下是一些例子:

SET L:123456 "<name> <latitude> <longitude> ..."
HSET U:987654321 loc 123456 time <epoch>
设置L:123456“…”
HSET U:987654321 loc 123456时间

SET loc:{123456}“…”
HSET用户:{U987654321}loc 123456时间

这完全取决于您将如何使用它。 如果每个字节都计算在内,例如,当您必须为传输到云服务的每个kB付费时,您可以计算成本。数学很简单;一个字节是一个“在线路上”的字节。在redis内部,对于较大的值,它同样简单。对于较小的值,Redis会进行一些内存优化

在您的
HSET
示例中,您将成员分开,这只有在大多数情况下需要彼此分开时才有意义。更好的方法可能是:
HSET用户:数据987654321'{“loc”:“123456”,“time”:“2014-01-01T13:00:00”}
。从性能角度看,单独的键/成员比更长的字符串“成本”高很多。您甚至可以将整个表或数据集放在一个成员中,如果它仅用作一个完整的半静态实体

速度和大小:键和值之间存在显著差异

关键点: 更短的内存通常更高效,速度也更高效。如果您使用redis,您甚至可以使用“数字”作为键(排序集“成员”加“分数”)。我之所以说“数字”,是因为分数在技术上是一个浮点数64,但要用作ID,它必须介于-999999999999999和999999999999999之间,包括(15位数字),没有任何小数部分。这真的很有帮助,因为Redis对排序集进行快速、可伸缩的动态排序(使用SkipList,简化)

价值观: MsgPack格式(未压缩)占用的空间最小,尤其是在定义存储一次而值存储多次的情况下。JSON的内存效率稍低,但它是一种常见的IPC格式,所以不应忽略它。原始字符串,字符分隔,固定长度(ugh),无论您想要什么,都可以使用。您可以在将数据存储到Redis之前压缩数据。到目前为止,内存效率。说到速度,就不那么简单了。如果您想使用Lua服务器端脚本(您应该这样做),您不能对压缩数据做任何事情。JSON和MsgPack可以反序列化,但只能“作为一个整体”。这在大多数情况下都很好。最灵活的方法是存储单独的值(例如作为HSET的成员),但这也是有代价的(大多数情况下:代价太高)。你也可以把这些结合起来。我们最常用的是:由两个或三个分隔符分隔的值组成的前缀,后跟MsgPack负载

我的一般建议是:从只使用HSET和ZSET开始,不要分割属于一起的数据,对10-25个字符之间的键使用描述性的PascalCased名称,如果您的键(名称空间)中需要分隔符,请使用“:”,序列化为JSON(为简单起见,但代码可以轻松切换到MsgPack),使用Lua脚本(即使您不知道Lua,您在Redis中使用的子集也很小)

在项目的启动阶段,我不会太担心这个问题,您可以在以后随时更改它,并在获得一些可插值数据后立即进行A/B比较


希望这有帮助,TW

这一切都取决于你将如何使用它。 如果每个字节都计算在内,例如,当您必须为传输到云服务的每个kB付费时,您可以计算成本。数学很简单;一个字节就是一个“在线”字节。在redis内部,对于较大的值,它同样简单。对于较小的值,redis会进行一些内存优化

在您的
HSET
示例中,您拆分了成员,这只有在大多数时候需要将它们彼此分开时才有意义。更好的方法可能是:
HSET用户:数据987654321'{“loc”:“123456”,“time”:“2014-01-01T13:00:00”}“
。从性能上看,单独的键/成员的“成本”远远高于较长的字符串。如果一个成员只作为一个完整的半静态实体使用,您甚至可以将整个表或数据集放在一个成员中

速度和大小:键和值之间存在显著差异

关键点: Shorter通常更节省内存和速度。如果你使用redis,你甚至可以使用“数字”作为键(排序集“成员”加上“分数”)。我说“数字”是因为分数在技术上是float64,但要用作ID,它必须介于-999999999999999和999999999999999999之间(包括15位数字),没有任何小数部分。这非常有用,因为Redis可以快速、可扩展地对已排序集进行动态排序(使用Skiplits,简化)

价值观: MsgPack格式(未压缩)占用的空间最小,尤其是当您存储一次定义和多个值时。JSON的内存效率稍低,但它当然是一种常见的IPC格式,因此不应忽略。原始字符串,字符分隔,固定长度(ugh),无论您想要什么,都可以使用。在将数据存储到Redis之前,您始终可以压缩数据。到目前为止,内存效率很高。在速度方面,就不那么简单了。如果您想使用Lua服务器端脚本(您应该这样做),您无法对压缩数据执行任何操作。JSON和MsgPack可以反序列化,但只能“作为一个整体”。这在大多数TS场景中都很好。最灵活的方法是存储单独的值(例如作为HSET的成员),但这也要付出代价(大多数情况下:代价太高)。您也可以组合所有这些。我们最常用的是:由两个或三个分隔符分隔的值组成的前缀,后跟MsgPack负载

我的一般建议是:从只使用HSET和ZSET开始,不要分割属于一起的数据,
SET loc:{123456} "<name> <latitude> <longitude> ..."
HSET user:{U987654321} loc 123456 time <epoch>