java - Cassandra:在 super 列上设置 TTL

标签 java session tomcat cassandra ttl

我为 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。

  1. 在创建 session 时,创建一个额外的 expiration_timestamp 列,并将其设置为一个合理的值,比如 60 分钟后过期的时间戳。

session_key, value1, value2, expiration_timestamp=60minutes

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

  2. 当用户执行 http 请求时,读取 session 行(通过行缓存、键缓存等优化),但不要更新 ttl 或 expiration_timestamp。

  3. 当用户请求接近 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/

相关文章:

java - 是否可以将引用类型动态传递给需要引用类型的对象实例?

java - 仅搜索 map 中的特定值

java - 在 JavaFX 中更改 IP 地址

session - $argv 在 Centos 和 RHEL 系统之间的行为是否相同

apache - 错误 403 Forbidden -- apache2、tomcat6、mod_proxy 的权限

java - RxJava - 获取 2 个组合请求的结果数据列表

php - 为什么 Chrome 和 FireFox 中的 php session 值不同?

输出后未写入 PHP session (外部 ajax 调用上的 echo 或 print_r)

apache - 如何在 Apache HTTP 服务器上安装 Tomcat

java - Spring 启动 : WebServerException: Unable to start embedded Tomcat