如何只在剩余密钥内设计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缓存中的数据集有哪些选项?
1条答案
按热度按时间xmakbtuz1#
问题:现在的问题是,每当我们需要在memoryjvm缓存中查找具有该特定设备id的数据集时,如果找不到,那么我们就需要在redis中再次扫描该哈希的所有数据(包括已经在内存jvm缓存中扫描的数据)。
如果没有正确地使用redis哈希,则不必使用
HGETALL
或类似操作。你能做到的HGET
以查找附加到该设备id的元数据。如果您想同时内省多个设备ID,那么应该使用
HMGET
命令。所有著名的java驱动程序都支持这些命令。
编辑:
搜索
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:在本例中,我只更新了获取的必需键,但是使用
HGETALL
我会拉钥匙。