在 Redis 中存储 java 个对象列表的最佳方式
Best way to store a list of java objects in Redis
如果有人能建议我在 Redis 中存储 java 个对象列表的最佳方法,那就太好了。
目前,我正在将 java 对象转换为 json 字符串并将这些字符串存储在 Redis 中,我在 Redis 中有一个集合来跟踪所有这些。
例如:-
SET student:1 '{"name":"testOne","stream":computer science}'
SET student:2 '{"name":"testTwo","stream":electronics}'
SADD students 1
SADD students 2
因此,每当我想获取学生列表时,我首先获取集合 students
,然后对其进行迭代并在这些键处获取 json 字符串。
只是想知道是否有任何其他更好的方法来处理将 java 个对象列表存储到 Redis 的场景。
(我使用redis作为缓存)
Redis 不仅仅是一个简单的键值存储。可以使用哈希在redis中存储结构化数据
HMSET student:1 名称 "testOne" 流 "computer science"
http://redis.io/commands/hmset
获取hash调用HGETALL的所有内容student:1
您还可以使用 HGET
获取哈希的单个值
示例 HGET student:1 名称
如果您不需要查询存储在 redis 中的 java 对象(索引、分数...),那么您可以使用库(例如 Kryo)将它们序列化为字节数组并存储它们在 redis 中的一个字符串中。请注意,您可以在一个redis字符串中序列化一整套java对象,当您要反序列化时,只需记住它是哪个class(集合类型+对象类型),您可以定义一个巧妙的键例如为此目的命名。
JSON 只会使用更多的 space 并且会比其他二进制编组格式更加网络密集,如果您不需要查询或 redis 中的人类可读数据,那么它很好(和更高的性能)在redis中存储二进制数据。
请注意,如果您正在使用 jedis 库(正如您标记的那样),您在 Jedis 上有一些方法将字节数组作为参数而不是 Java 字符串,以便将数据作为 C 字符串发送到 Redis(没有过程中数据丢失)。
您可以使用 Redisson 轻松完成。它是 Java 的基于 Redis 的框架,支持许多流行的编解码器(Jackson JSON、Avro、Smile、CBOR、MsgPack、Kryo、FST、LZ4、Snappy
和 JDK 序列化)和 Redis 连接模式,如 Cluster、Sentinel、AWS Elasticache。
这是一个如何将 Java 对象存储到列表的示例:
RList<SomeObject> list = redisson.getList("anyList");
list.add(new SomeObject(1));
list.add(new SomeObject(2));
RList
接口也实现了 java.util.List
接口。很简单,对吧?
如果有人能建议我在 Redis 中存储 java 个对象列表的最佳方法,那就太好了。
目前,我正在将 java 对象转换为 json 字符串并将这些字符串存储在 Redis 中,我在 Redis 中有一个集合来跟踪所有这些。
例如:-
SET student:1 '{"name":"testOne","stream":computer science}'
SET student:2 '{"name":"testTwo","stream":electronics}'
SADD students 1
SADD students 2
因此,每当我想获取学生列表时,我首先获取集合 students
,然后对其进行迭代并在这些键处获取 json 字符串。
只是想知道是否有任何其他更好的方法来处理将 java 个对象列表存储到 Redis 的场景。
(我使用redis作为缓存)
Redis 不仅仅是一个简单的键值存储。可以使用哈希在redis中存储结构化数据
HMSET student:1 名称 "testOne" 流 "computer science" http://redis.io/commands/hmset
获取hash调用HGETALL的所有内容student:1
您还可以使用 HGET
获取哈希的单个值
示例 HGET student:1 名称
如果您不需要查询存储在 redis 中的 java 对象(索引、分数...),那么您可以使用库(例如 Kryo)将它们序列化为字节数组并存储它们在 redis 中的一个字符串中。请注意,您可以在一个redis字符串中序列化一整套java对象,当您要反序列化时,只需记住它是哪个class(集合类型+对象类型),您可以定义一个巧妙的键例如为此目的命名。
JSON 只会使用更多的 space 并且会比其他二进制编组格式更加网络密集,如果您不需要查询或 redis 中的人类可读数据,那么它很好(和更高的性能)在redis中存储二进制数据。
请注意,如果您正在使用 jedis 库(正如您标记的那样),您在 Jedis 上有一些方法将字节数组作为参数而不是 Java 字符串,以便将数据作为 C 字符串发送到 Redis(没有过程中数据丢失)。
您可以使用 Redisson 轻松完成。它是 Java 的基于 Redis 的框架,支持许多流行的编解码器(Jackson JSON、Avro、Smile、CBOR、MsgPack、Kryo、FST、LZ4、Snappy 和 JDK 序列化)和 Redis 连接模式,如 Cluster、Sentinel、AWS Elasticache。
这是一个如何将 Java 对象存储到列表的示例:
RList<SomeObject> list = redisson.getList("anyList");
list.add(new SomeObject(1));
list.add(new SomeObject(2));
RList
接口也实现了 java.util.List
接口。很简单,对吧?