我想在 Cassandra 中存储键值对,并在达到固定存储大小时以 LRU 方式自动删除条目。
是否可以使用 Cassandra 来做到这一点,如果可以的话,最好的方法是什么。如果没有,是否有任何其他分布式存储系统可以支持此用例,而不必将所有数据保存在内存中。
我想在 Cassandra 中存储键值对,并在达到固定存储大小时以 LRU 方式自动删除条目。
是否可以使用 Cassandra 来做到这一点,如果可以的话,最好的方法是什么。如果没有,是否有任何其他分布式存储系统可以支持此用例,而不必将所有数据保存在内存中。
简短的回答是,不,Cassandra 不支持开箱即用的 LRU。
如果你真的想的话,你可以在 Cassandra 上的应用程序中构建一个 LRU 层来实现相同的效果。这可以通过多种方式完成,但通常您希望维护缓存对象的单独索引以及统计信息/时间戳,并让您的应用程序根据需要清除对象。即使这样,由于 Cassandra 存储数据和管理更新、删除等的性质,磁盘空间也不是一个好的上限。Cassandra 不会在删除时立即释放存储空间,而是设置一个墓碑和旧的数据稍后被删除(关于删除)。
构建自定义缓存层(即在 Cassandra 中)的一个优点是,您可以超越简单的 LRU 驱逐,并确保更昂贵的对象和/或更频繁(但不是最近)使用的对象的权重更重,以便它们保留在即使它们可能被 LRU 清除,缓存也会更长。这是否有用将完全取决于您的特定用例。但同样,Cassandra 可能会因大量数据流失而变得臃肿,因此需要确保对集群进行适当调整并进行日常维护。
实际上,大多数人会部署 Memcache(或类似的)来支持这个用例。
Cassandra 可以用作 LRU,您只需要使用 TTL 或自己管理删除即可。
总是附加新数据。删除的数据仅被标记为已删除,并在压缩期间被物理删除。您可能需要调整压缩。
Cassandra 的优点是数据在它进来的那一刻就被持久化了,你不必将所有数据都放入内存中,除了极端用例,你可以使用复制不丢失数据,并且可以从多种语言访问它。请注意,新数据可能不会立即可用。
更轻量级的方法是 Redis。