Redis - 用于存储多个对象的选项
Redis - Option for storing multiple objects
当我们需要存储同一类别的多个对象时,redis 中的最佳实践是什么?
目前我将整个对象存储为 json 字符串。
例如:书籍。
{
title:...,
author:...
}
选项 1:
set book:1 book1
set book:2 book2
set book:3 book3
用法:get book:1
给我书对象。
选项 2:散列
hset book 1 book1
hset book 2 book2
hset book 3 book3
用法:hget book 1
会给我整本书对象
在性能或使用等方面是否存在巨大差异?
如果您想到任何其他方法,请分享!
用于存储 JSON 个对象的字符串与哈希
哈希和字符串的大部分相关操作在时间复杂度上是等价的(GET/HGET/MGET/HMGET/SET/HSET)。使用 strings(GET/SET) 的唯一缺点是,如果您担心能够扫描整套书籍,因为 SCAN and KEYS commands operate over the entire keyspace (every key in Redis) - even if your pattern was books:*
, Redis would still need to iterate over all the keys. Whereas HSCAN and HGETALL 仅在散列上运行。换句话说,如果你在 Redis 中存储了很多东西,并且你希望能够遍历你的所有书籍,那么 HASH 可以节省你一些时间。
在 Redis 中存储 JSON
你在评论中问了一个问题存储JSON是否是不好的做法,它肯定没有错,而且很常见,使用JSON的唯一缺点是你只能GET/SET 整个字符串,每次您从 Redis 中提取数据时,您的应用程序都必须从 JSON 编组数据并将其序列化回 JSON 每当您想要将更新发送到数据库。如果这是一个问题,可以使用 RedisJson 模块来解决,但这是一个完全独立的主题。
当我们需要存储同一类别的多个对象时,redis 中的最佳实践是什么?
目前我将整个对象存储为 json 字符串。
例如:书籍。
{
title:...,
author:...
}
选项 1:
set book:1 book1
set book:2 book2
set book:3 book3
用法:get book:1
给我书对象。
选项 2:散列
hset book 1 book1
hset book 2 book2
hset book 3 book3
用法:hget book 1
会给我整本书对象
在性能或使用等方面是否存在巨大差异? 如果您想到任何其他方法,请分享!
用于存储 JSON 个对象的字符串与哈希
哈希和字符串的大部分相关操作在时间复杂度上是等价的(GET/HGET/MGET/HMGET/SET/HSET)。使用 strings(GET/SET) 的唯一缺点是,如果您担心能够扫描整套书籍,因为 SCAN and KEYS commands operate over the entire keyspace (every key in Redis) - even if your pattern was books:*
, Redis would still need to iterate over all the keys. Whereas HSCAN and HGETALL 仅在散列上运行。换句话说,如果你在 Redis 中存储了很多东西,并且你希望能够遍历你的所有书籍,那么 HASH 可以节省你一些时间。
在 Redis 中存储 JSON
你在评论中问了一个问题存储JSON是否是不好的做法,它肯定没有错,而且很常见,使用JSON的唯一缺点是你只能GET/SET 整个字符串,每次您从 Redis 中提取数据时,您的应用程序都必须从 JSON 编组数据并将其序列化回 JSON 每当您想要将更新发送到数据库。如果这是一个问题,可以使用 RedisJson 模块来解决,但这是一个完全独立的主题。