我可以想到使用redis检查存在的两种方法:
SET
一个密钥并通过GET
检查存在(或使用EXISTS
中提到的评论@Sergio Tulentsev)SADD
将所有成员添加到密钥并按SISMEMBER
哪一个更好?如果我选择第一种方法并且数据库中的键数变得更大,那么与单个组中的相同数量的键相比,这是一个问题吗?
答案 0 :(得分:1)
实际上,除了这两种方法之外,您还可以将HASH
数据结构与HEXISTS
命令一起使用(我将此方法称为第三种解决方案)。
所有这些解决方案都足够快,如果你有一个很大的SET
,HASH
或密钥空间,这不是问题。
那么,我们应该使用哪一个? 这取决于很多事情......
密钥有价值吗?
第一个和第三个解决方案的键都可以有值,而第二个解决方案不能。
因此,如果每个密钥没有值,我更喜欢第二个解决方案,即SET
解决方案。否则,您必须使用第一个或第三个解决方案。
该值是否具有结构?
如果值不是原始字符串,而是数据结构,例如LIST
,SET
。你必须使用第一个解决方案,因为HASH
的值只能是原始字符串。
您需要进行设定操作吗?
如果需要对多个数据集执行交集,并集或差异操作,则应使用第二个解决方案。 Redis具有用于这些操作的内置命令,尽管它们可能是慢速命令。
内存效率考虑
Redis为小SET
和HASH
采用更高内存效率的编码。因此,当您拥有大量小数据集时,采用第二种和第三种解决方案可以节省大量内存。有关详细信息,请参阅this。
<强>更新强>
您需要为这些键设置TTL吗?
正如@dizzyf在评论中指出的那样,如果您需要为这些密钥设置TTL
,则必须使用第一个解决方案。因为HASH
和SET
的项目没有过期属性。您只能为整个TTL
或HASH
设置SET
,而不是其元素。