java—如何在两个数据集选项(如db)之间使用类似的减法来设计redis搜索/扫描算法

3bygqnnd  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(262)

如何只在剩余密钥内设计redis搜索/扫描算法?

remaining keys = <All Keys> - <Set of Keys>

设计背景:我们的物联网java消费应用程序运行在kubernetes吊舱中,具有多个副本。应用程序的数量是巨大的(超过数百万),所以我们使用redis散列来存储设备的元数据。e、 g.redis中的数据结构是

sample Hash - DEVICE|APC2(i.e. for 2nd series appliance)
sample Key -  APC278ER89A1(i.e. Device_ID)
sample Value - Cooking|Claimed|Online(i.e. Device's metadata)

为了提高性能,我们还提供了内存中的jvm缓存(即hashmap),以减少redis中的查找时间
每当我们从任何设备接收到任何消息时,我们都会检查设备id,如果内存中的jvm缓存包含设备元数据,如果它不包含,那么我们就从redis获取它并将它放入内存缓存,为下次引用它。
内存缓存中的最大数据保持量有一个可确定的值(例如2000)。如果达到最大数据量,逐出线程将从内存jvm缓存中删除它。
问题:现在的问题是,每当我们需要在memoryjvm缓存中查找具有该特定设备id的数据集时,如果找不到,那么我们就需要在redis中再次扫描该哈希的所有数据(包括已经在内存jvm缓存中扫描的数据)。
在redis中只扫描那些没有扫描/存在于该pod的内存jvm缓存中的数据集有哪些选项?

xmakbtuz

xmakbtuz1#

问题:现在的问题是,每当我们需要在memoryjvm缓存中查找具有该特定设备id的数据集时,如果找不到,那么我们就需要在redis中再次扫描该哈希的所有数据(包括已经在内存jvm缓存中扫描的数据)。
如果没有正确地使用redis哈希,则不必使用 HGETALL 或类似操作。你能做到的 HGET 以查找附加到该设备id的元数据。
如果您想同时内省多个设备ID,那么应该使用 HMGET 命令。
所有著名的java驱动程序都支持这些命令。
编辑:

HashMap: id1, id2, id3
Redis Map: id1, id2, id3, id4, id5, id6 , id7

搜索 id1 =>已经在哈希Map中,不要在redis中搜索
搜索 id6 =>不在redis的hash-map搜索中使用 HGET 并更新hashmap
更新Map: HashMap: id1,id3,id3,id6 搜索 id1,id2,id3 =>所有都在hashmap中,所以不要搜索redis
搜索 id1,id2,id6,id7, id8 => id7, id8 不在hashmap中,所以使用 HMGET 更新Map:

HashMap: id1,id3,id3,id6, id7

在本例中,我只更新了获取的必需键,但是使用 HGETALL 我会拉钥匙。

相关问题