5

如何使用 Redis 存储对象

 1 year ago
source link: https://www.cyningsun.com/03-12-2023/how-to-store-objects-in-redis.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何使用 Redis 存储对象

作者序

本文是一篇 AI 辅助创作的内容。作者的内容发生一些细微的变化,开始转变为不断提出问题、丰富和拓展内容、编辑校研内容。

毫无疑问,“AI 辅助” 将变革当前的工作方式,未来已来。

如何设计 RPC 接口 中讲到一个观点:

资源在用户侧以 hyper media 存在;资源流到服务中以对象来组织;资源落到存储里就变成了id + content。索引 content 的 id,一般又以 单个集合 的形态存在,具体到数据库中,id 以 聚簇索引存在,content 以聚簇索引叶节点存在

越来越多的产品按照先获取 id 再读取 content 来访问资源

Redis 是一个高效的键值存储数据库,可以用来存储对象(Content)。 在 Redis 中,可以使用 String 和 Hash 来存储对象。在生产环境经常看到不少的误用,导致低效的空间利用率、存取性能、以及可靠性怎么存就决定了怎么取,Redis 数据结构选择也能见方案设计者的设计功力。

在实际的应用场景中,常见的使用方式有以下三种:

JSON + String

JSON 是一种轻量级的数据交换格式,常用于前后端之间的数据传输。Redis 中可以存储 JSON 对象,通常使用字符串类型(string)来存储 JSON 数据。将 JSON 对象序列化成字符串并将其存储在 Redis 中,然后在需要时将其反序列化回 JSON 对象。

  • JSON 对象的结构清晰易读,易于维护和理解。
  • JSON 对象可跨多个语言和平台使用,具有很好的兼容性。
  • Redis 中的字符串类型是 Redis 支持的最基本的数据类型之一,具有高效的读写性能。
  • JSON 对象存储为字符串类型可能会占用更多的存储空间(注:相比数值)。
  • JSON 对象存储为字符串类型需要手动进行序列化和反序列化,可能会增加代码复杂度和运行时间。

备注: JSON 也可以替换成 Protobuf,性能更好,成本更低,思路一致。

Multiple String

多个字符串(multiple string)是指将一个对象的多个属性分别存储在 Redis 中不同的字符串键值对中。例如,将一个用户对象的用户名、邮箱、密码等属性存储在不同的 Redis 字符串中。

  • 可以根据需要轻松地读取或更新对象的某些属性,而无需读取或更新整个对象。
  • 不同的属性可以使用不同的 Redis 命令(如 GET、SET、INCR 等)进行操作,具有更高的灵活性。
  • 对于包含多个属性的对象,可能会需要在 Redis 中存储大量的键值对,增加存储开销。
  • 多个字符串可能存放在不同的分片,同时读取时可用性更差
  • 如果需要同时读取或更新对象的多个属性,可能需要进行多个 Redis 操作,增加网络延迟和代码复杂度。

哈希(hash)是 Redis 中的一种特殊数据类型,可以将一个对象存储为一个 Redis 哈希,其中对象的属性存储为哈希的字段,属性的值存储为哈希的值。例如,将一个用户对象存储为 Redis 哈希,其中用户名、邮箱和密码是哈希的字段,相应的值是哈希的值。

  • 与多个字符串相比,使用哈希可以更轻松地管理对象的属性,因为所有属性都存储在单个 Redis 键值对中。
  • 可以使用 Redis 提供的丰富的哈希命令(如 HSET、HGET、HINCRBY 等)对对象进行操作。
  • 对于包含大量属性的对象,Redis 中的哈希可能会占用更多的存储空间。
  • 如果需要同时读取或更新对象的多个属性,可能需要进行多个 Redis 操作,增加网络延迟和代码复杂度。

空间与性能

除了需求,考虑存储空间和存取性能

对于存储空间而言,可以根据具体的数据结构来选择最合适的存储方式。如果数据结构比较简单,使用 JSON+String 可能是比较好的选择,因为 JSON 格式可以非常紧凑,而字符串类型也是 Redis 支持的最基本的数据类型之一,占用的空间比较小。如果数据结构比较复杂,可以考虑使用哈希来存储对象,因为哈希可以将多个属性存储在同一个键值对中,相比于多个字符串,可以减少存储空间的占用。

对于存取性能而言,可以根据具体的应用场景来选择最合适的存储方式。如果需要快速地读取或更新对象的某些属性,可以考虑使用多个字符串或哈希,因为这些方式可以通过对单个属性进行操作来实现,相比于读取或更新整个对象,可以减少网络延迟和代码复杂度。如果需要快速地读取或更新整个对象,可以考虑使用 JSON+String,因为这种方式可以将整个对象序列化成一个字符串,只需要一次读取或更新操作即可。具体来说,三者读取一个对象的性能数据基本等价于 “GET/SET key vs HMGET/HMSET key field [field …] vs Opt(Pipline GET/SET, MGET/MSET) key [key …]“。

总体而言,JSON+String、Multiple String 和 Hash 都是在 Redis 中存储对象的有效方式,具体使用哪种方式取决于数据的结构和应用场景。如果数据结构简单,且需要跨多个语言和平台使用,那么使用 JSON+String 可能是比较好的选择。如果需要更灵活地管理对象的属性,或者需要根据需要读取或更新对象的某些属性,那么使用多个字符串或哈希可能更适合。在实际使用中,可以根据具体的数据结构和应用场景选择最适合的方式。

本文作者:cyningsun
本文地址https://www.cyningsun.com/03-12-2023/how-to-store-objects-in-redis.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。转载请注明出处!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK