我为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/
答案 0 :(得分:0)
我最近一直在考虑这个问题,并且没有使用内置列ttl的简单解决方案,而不会在每个请求上产生明显的i / o。我建议不要完全依赖列ttl。
session_key,value1,value2, expiration_timestamp = 60分钟
插入列(value1,value2等..)时,将ttl设置为60分钟。 (可以在http请求期间动态添加列,因此,最初它们将在不同时间到期)
当用户执行http请求时,请读取会话行(通过行缓存,密钥缓存等进行优化),但不要更新ttl或expiration_timestamp。
该解决方案确保我们在大多数时间(希望来自缓存)执行读取,并且仅在会话到期之前执行写入i / o(以保持会话活动,更新ttl)。并且"当"执行更新ttl是任意的,您可以将其设置为30分钟,50分钟,但不是每次访问。