当前位置: 首页 > 面试题库 >

存储Redis密钥的最佳方法

万英武
2023-03-14
问题内容

我正在使用Redis来存储一些信息并检测该信息随时间的变化(例如,考虑用户和位置)。使用更长或更短的键名的值是什么?使用更长的键会更清楚,但是使用更长的键名是否会在内存或性能上付出很多成本?

以下是示例:

SET L:123456 "<name> <latitude> <longitude> ..."
HSET U:987654321 loc 123456 time <epoch>

要么

SET loc:{123456} "<name> <latitude> <longitude> ..."
HSET user:{U987654321} loc 123456 time <epoch>

问题答案:

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

在您的HSET示例中,您拆分了成员,这仅在大多数情况下需要将它们彼此分离时才有意义。更好的方法 -might- 是:HSET user:data 987654321 '{"loc": "123456", "time": "2014-01-01T13:00:00"}'。出于性能考虑,单独的键/成员比较长的字符串“花费”更多。如果仅将整个表或数据集用作一个完整的半静态实体,则甚至可以将其放在一个成员中。

速度和大小: 之间存在显着差异。

关键: 较短的内存通常更有效地提高存储效率,并提高速度。如果您使用redis Sorted
Set
,甚至可以使用“数字”作为键(已排序的“成员”加“分数”)。我说“数字”是因为分数从技术上讲是float64,但要用作ID,它必须介于-999999999999999和999999999999999之间(包括15位数字),且没有小数部分。这确实很有帮助,因为Redis可以对排序集进行快速,可扩展的O(log(n))动态排序(使用跳过列表,已简化)。

值:
MsgPack格式(未压缩)占用的空间最少,特别是如果您存储一次定义和很多值的话。JSON的内存效率较低,但是当然是一种通用IPC格式,因此不应忽略。原始字符串,字符分隔,固定长度(ugh),无论您需要什么,都可以使用。您始终可以先压缩数据,然后再将其存储在Redis中。到目前为止的
内存效率 。谈到 速度
,它不那么简单。如果要使用Lua服务器端脚本(应使用),则不能对压缩数据执行任何操作。JSON和MsgPack可以反序列化,但只能是“整体”。在大多数情况下都可以。最灵活的是存储单独的值(例如,作为HSET的成员),但这也是有代价的(大多数情况下:价格太高)。您也可以将所有这些结合起来。我们最常使用的:两个或三个以分隔符分隔的值的前缀,后跟一个MsgPack有效负载。

我的一般建议是:从仅使用HSET和ZSET开始,不要拆分属于它们的数据,在10到25个字符之间使用描述性PascalCased键名作为键,如果键中需要定界符(命名空间),请使用’:’
,序列化为JSON(为简单起见,但为了轻松切换至MsgPack而使用代码),使用Lua脚本(即使您不知道Lua,在Redis中使用的子集也很小)。

在项目的启动阶段,我不必担心太多,您可以稍后再更改它,并在拥有一些可插值数据后立即进行A / B比较。

希望这会有所帮助,TW



 类似资料:
  • 问题内容: 使用&等redis expire 命令时,在某些情况下根本不需要键来保存值,因为 生存时间 就是这样。 __ 但是,redis要求任何键具有值。 如果您不想阅读它,最合理的使用价值是什么? 问题答案: 谁说您实际上应该在Redis密钥中存储任何内容? 空字符串是redis密钥的完美有效值,并且它是最短的一个:

  • 问题内容: 我需要做的是存储一对一的映射。数据集包含大量相同类型的键值对(10M +)。例如,可以使用Java中的HashMap对象的单个实例来存储此类数据。 第一种方法是存储许多键值对,如下所示: 第二种选择是使用单个“哈希”: Redis的哈希有一些方便的命令(,,等),他们不污染密钥空间,所以这看起来像一个更好的选择。但是,使用此方法时是否有任何性能或内存方面的考虑? 问题答案: 是的,正如

  • 问题内容: 尝试使用键前缀存储过期时间x的值 我正在使用Redis。我目前正在使用hset存储值 我希望每个密钥都有不同的到期时间,因为我将分别存储每个密钥。 我该怎么做呢? 问题答案: 这不能直接完成。您可以在整个hset上添加有效期,但不能在单个字段上添加。如果要执行此操作,可以调用,其中是到期之前的秒数。 或者,您可以使用代替: 这将带走某些功能,因为(例如)您将没有一种好的方法来列出所有以

  • 我按照web上一些教程使用redis设置Spring缓存,

  • 问题内容: 我的应用程序中有一个添加用户选项。我想将用户密码以哈希格式存储在数据库中。密码以纯文本格式存储在框架随附的示例代码中。经过一番搜索,我发现在play2中实现了一个Crypto.encryptAES()函数,可用于保护密码。 我的问题是使用它的最佳地点是什么?以及如何使用它来创建最可维护的代码? 问题答案: 我个人将在模型中执行此操作。我的领域有吸气剂,所以在方法中: 该只是为多目的散列

  • 我正在寻找一个简单、安全的解决方案,使用Node存储用户密码。我是一个密码学新手,但是一直在试图通过网上搜索拼凑出一个解决方案。我正在寻找一种验证,即我所提出的是一个具有基本(而不是银行、医院等)安全需求的web应用程序的可靠解决方案。这是: …以下是我做出的选择让我走到了这一步: 使用什么哈希算法? 根据这篇被广泛引用的文章,看起来领先的竞争者是PBKDF2、bCrypt和scrypt。我选择P