在Redis中存储java对象列表的最佳方法

在Redis中存储java对象列表的最佳方法,java,redis,key-value,jedis,Java,Redis,Key Value,Jedis,如果有人能向我推荐在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 stud

如果有人能向我推荐在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学生:1名“testOne”流“计算机科学”

要获取散列的所有内容,请调用HGETALL student:1
您还可以使用HGET获取散列的单个值

示例HGET student:1 name

如果您不需要查询存储在redis中的java对象(索引化、分数…),那么您可以使用库(例如Kryo)将它们序列化为bytearray,并将它们存储在redis中的字符串中。请注意,您可以在一个redis字符串中序列化整个java对象集合,只要记住它是哪个类(集合类型+对象类型)当您想要反序列化时,您可以为此定义一个智能键名,例如

与其他二进制编组格式相比,JSON只会占用更多的空间,并且会更加密集地使用网络。如果您不需要redis中的查询或人类可读数据,那么在redis中存储二进制数据就可以了(而且性能更高)

请注意,如果您使用的是jedis library(正如您标记的那样),您在jedis上有一些方法,这些方法将ByteArray作为参数而不是Java字符串,以便将数据作为C字符串发送到Redis(过程中不会丢失数据)。

您可以轻松地使用。它是一个基于Redis的Java框架,支持许多流行的编解码器(Jackson JSON、Avro、Smile、CBOR、MsgPack、Kryo、FST、LZ4、Snappy) 和JDK序列化)和Redis连接模式,如群集、Sentinel、AWS Elasticache

下面是一个如何将Java对象存储到列表的示例:

RList<SomeObject> list = redisson.getList("anyList");
list.add(new SomeObject(1));
list.add(new SomeObject(2));
RList list=redisson.getList(“anyList”);
添加(新的SomeObject(1));
添加(新的SomeObject(2));

RList
接口还实现了
java.util.List
接口。非常简单,对吗?

我实际上在寻找存储java对象列表并在需要时检索它们的方法。此外,我还希望尽量减少检索列表的查询数量,因此我选择使用json字符串来存储对象,这样我就可以使用MGET一次性获取所有键。如果我使用散列来存储java对象,我无法一次获得java对象列表中的所有元素。如果您想不按顺序存储它们,可以使用集合来存储散列的键。您可以使用LUA脚本一次检索它们—解决方法中的问题:-更新和删除仅在客户端可能。->糟糕的多用户支持如果我想用分数查询存储在Redis中的Java对象呢?如果键有元素,所有元素都将存储在内存中。