我需要为部署在多个服务器上的Web应用程序存储会话状态。我想避免粘性会话或进行会话复制,因为我希望应用程序是自包含的,而不是依赖于servlet容器特定的配置。逻辑方向是所有服务器共享的数据库。但这将成为瓶颈(和单点故障),再加上关系数据库的设计并非真正用于存储会话数据。分布式NoSQL解决方案将是一个更好的选择,但仍然将是另一个要管理的组件。客户端到达哪个服务器可以访问最新状态的问题。

Hazelcast似乎是一个不错的选择,但我只需要一个没有Hazelcast的任何其他功能的地图,因此对于仅分布键值对的容器来说,这似乎有点过多。 />
但是除此之外,我似乎找不到任何其他满足需要的库。理想情况下,它应该是一个开放源码库,可以在商业产品中自由使用。

有什么想法吗?

评论

我曾经使用过EHCache,但我想它并不比Hazelcast轻...

@Nicolas Raoul:感谢您的建议,但是我正在寻找一个开源库(我已经更新了我的问题)。据我所知,分布式EHCache表示经许可的Terracotta和BigMemory Max。

“ Terracotta积极开发,维护和支持Ehcache,它是根据Apache 2许可提供的专业开源项目。” ehcache.org

@Nicolas Raoul:那不是我的意思。据我了解,EHCache的分布式功能在开源发行版中不可用,例如ehcache.org/documentation/get-started/about-distributed-cache。我错了吗?

EHCache嵌入在开源产品Alfresco中,提供分布式缓存功能。因此,我很确定EHCache的分布式功能在开源发行版中也可用。我想说,该页面具有很大的误导性,他们正努力销售非开源版本。

#1 楼

Ehcache和Guava缓存是非常流行且有用的进程内缓存。如果可以使用外部进程进行缓存,则Memcached和Redis非常适合此目的。

评论


据我所知,Guava Cache未分发。 Redis是用C语言编写的NoSQL解决方案,无法嵌入Java应用程序中(您可以嵌入Java客户端,但不能嵌入Redis安装),而Memcached不能按我想要的方式工作(即在所有数据上都具有相同的数据)节点,即复制)。

–JohnDoDo
2014年7月23日14:29

#2 楼

完全公开:我为Alachisoft工作。

您可以检查NCache的.Net或TayzGrid的Java分布式缓存。这两个项目都是开源的。

您的要求是获取;



快速且分布式的Java可嵌入缓存库,可跨所有节点复制数据。这样,无论客户端
到达哪个服务器都可以访问最新状态。将其用于所需的功能,而忽略其他功能。

链接博客的简要代码概述



import com.alachisoft.TayzGrid.web.caching.Cache;
    import com.alachisoft.TayzGrid.runtime.*;

    public class MyCachingSample {
        private String url = "dbc:msql://20.200.20.1:1114/MyDatabase";


        public Employee GetEmployee(String empId) throws Exception {
            Employee emp = null;
            try {
                Cache cache = TayzGrid.initializeCache("MyDistributedCache");
                emp = (Employee) cache.get(empId);
                //If key not found in cache, Load from the database
                if (emp == null) {
                    //Your logic goes here
                    ResultSet rs = stmt.executeQuery("SELECT * FROM Employee WHERE EmpId ='" + empId + "'");
                    if (rs.next()) {
                        emp = new Employee();
                        emp.EmpId = rs.getString("EmpId");

                        //Cache key for future use
                        cache.insert(empId, emp, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default);
                    }
                }
            } catch (Exception exp) {
                throw exp;
            }
            //return the required object
            return emp;
        }
    }


您必须编写一个简单的会话提供程序让您自己支持粘性会话,或者您可以购买NCache或TayzGrid以获得这些功能。 TayzGrid或NCache也可以并且正像分布式缓存或内存数据网格一样使用,有时也用作内存键值存储。这完全取决于您的需求。

如果您需要支持或计划将其用于企业,则始终可以获取付费许可证。它是功能更丰富的版本,并提供支持。我们拥有超过10年的行业经验,因此对于完整的生产环境稳定。