繁体   English   中英

Cassandra:在超级列上设置TTL

[英]Cassandra: Setting TTL on super-column

我已经为Tomcat开发了一个插件,该插件可以将会话数据持久化并分布在Cassandra环上。 我希望Cassandra在各个列上使用TTL设置来处理会话到期。 我现在遇到的问题是,会话中的各种对象都在不同的时间到期,因此会话会随着时间的流逝而丢失未使用的对象-即使连续访问会话(和其他会话对象)也是如此。

有没有一种方法可以在超级列上设置TTL,并在密钥过期时使存储在此超级列中的密钥下的所有数据都失效?

我不想每次返回HTTP响应时都遍历Web会话中存储的所有数据,因为这会在tomcat插件和Cassandra之间引起不必要的I / O。 我也不想在Tomcat插件中保留任何内存缓存,因为我希望Tomcat完全无状态,并仅在Cassandra中维护所有用户会话状态。

这个Tomcat插件非常漂亮,因为它允许以前有阶段的Web应用程序变为无状态-从而允许水平扩展。 克服这个TTL问题真是太棒了...

https://code.google.com/a/apache-extras.org/p/tomcat-cassandra/

我最近一直在考虑这个问题,并且没有使用内置列ttl的简单解决方案,而不会在每个请求上引起明显的I / O。 我建议不要完全依赖列ttl。

  1. 创建会话时,请创建一个额外的expiration_timestamp列,并将其设置为一个合理的值,例如时间戳记在60分钟内到期。

session_key,value1,value2, expiration_timestamp = 60分钟

  1. 插入列(值1,值2等)时,将ttl设置为60分钟。 (列可以在http请求期间动态添加,因此,它们最初在不同的时间到期)

  2. 当用户执行http请求时,读取会话行(通过行缓存,键缓存等进行了优化),但尚未更新ttl或expiration_timestamp。

  3. 当用户请求接近expiration_timestamp时(例如50分钟),更新expiration_timestamp(再增加60分钟),然后使用新的ttl重新插入整个会话行(所有ttl列将同时更新并同步)。

该解决方案可确保我们大部分时间(希望从缓存中)执行读取操作,并且仅在会话即将到期之前执行写I / O(以保持会话有效,更新ttl)。 而且,“何时”执行更新ttl是任意的,您可以将其设置为30分钟,50分钟,但不能每次访问都设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM