我为 Tomcat 开发了一个插件,它允许 session 数据在 Cassandra 环上持久保存和分发。我希望 Cassandra 使用各个列上的 TTL 设置来处理 session 到期。我现在遇到的问题是 session 中的各种对象都在不同的时间过期,因此 session 会随着时间的推移丢失未使用的对象 - 即使持续访问 session (和其他 session 对象)也是如此。
有没有一种方法可以在 super 列上设置 TTL,并让存储在该 super 列中某个键下的所有数据在键过期时过期?
我不想在每次返回 HTTP 响应时遍历 Web session 中存储的所有数据,因为这会导致 tomcat 插件和 Cassandra 之间不必要的 I/O。我也不想在 Tomcat 插件中保留任何内存缓存,因为我希望 Tomcat 完全无状态并纯粹在 Cassandra 中维护所有用户 session 状态。
这个 Tomcat 插件非常漂亮,因为它允许以前分阶段的 Web 应用程序变为无状态 - 从而允许水平扩展。如果能解决这个 TTL 问题就太好了……
https://code.google.com/a/apache-extras.org/p/tomcat-cassandra/
最佳答案
我最近一直在思考这个问题,没有一个简单的解决方案可以使用内置列 ttl 而不会在每个请求上产生大量的 i/o。我建议不要完全依赖列 ttl。
- 在创建 session 时,创建一个额外的 expiration_timestamp 列,并将其设置为一个合理的值,比如 60 分钟后过期的时间戳。
session_key, value1, value2, expiration_timestamp=60minutes
插入列(值 1、值 2 等)时,将 ttl 设置为 60 分钟。 (列可能会在 http 请求期间动态添加,因此,最初它们会在不同时间过期)
当用户执行 http 请求时,读取 session 行(通过行缓存、键缓存等优化),但不要更新 ttl 或 expiration_timestamp。
- 当用户请求接近 expiration_timestamp 时,比如 50 分钟,更新 expiration_timestamp(再增加 60 分钟),并使用新的 ttl 重新插入整个 session 行。(所有列 ttl 将同时更新并在同步)。
该解决方案确保我们大部分时间执行读取(希望从缓存中读取),并且仅在 session 过期之前执行写入 i/o(以保持 session Activity ,更新 ttl)。而“何时”执行更新 ttl 是任意的,您可以将其设置为 30 分钟、50 分钟,但不是每次访问都如此。
关于java - Cassandra:在 super 列上设置 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24693905/