Tag: memcached

Spymemcache客户端如何使用UDP?

可以看出,Spymemcache客户端默认使用TCP连接与Memcached服务器连接。 我想使用UDP而不是TCP。 我认为Facebook使用UDP来获取来自Memcached的请求。 任何人都知道如何在SpyMemcache中使用UDP?

将Memcached客户端从Memcached-Java-Client迁移到Xmemcached

我有一个旧的memcached客户端实现,它基于danga客户端,但稍作修改。 我认为这个客户端现在称为Memcached-Java-Client 。 我手边的实现是陈旧的,没有维护,似乎是虚假的。 我需要将客户端迁移到具有以下约束的较新客户端: 我需要新的客户端散列算法与旧的兼容。 如果不满足此约束,我们将不得不使网站(至少部分)不可用几个小时。 支持各种序列化方法,并允许序列化方法的可扩展性。 改进了现有客户端的性能。 与Moxi兼容 当前实现使用一致的散列算法,该算法似乎与Xmemcached使用的一致散列兼容,除了我无法获得旧客户端存储的密钥的缓存命中并使用Xmemcached客户端获取。 我调试了代码,并得到了相同的哈希码,但我认为服务器环是不同的,因此整体哈希方法是不同的。 这是我用于初始化xmemcached客户端的代码: final MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(“server:11211 server:11212 server:11213 server:11214”)); builder.setCommandFactory(new BinaryCommandFactory()); builder.setSessionLocator(new KetamaMemcachedSessionLocator()); builder.setTranscoder(new WhalinTranscoder()); memcachedClient = builder.build(); 如果我不能让xmemcached工作,我也愿意尝试使用spymemcached,但我更喜欢后者。 编辑:我也尝试过spymemcached,并且无法让它与我当前的客户端兼容。 这是我的spymemcached客户端初始化代码: final ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder(); builder.setProtocol(Protocol.BINARY); builder.setTranscoder(WhalinTranscoder()); builder.setHashAlg(HashAlgorithm.KETAMA_HASH); builder.setLocatorType(Locator.CONSISTENT); final MemcachedClient client = MemcachedClient(builder.build(), AddrUtil.getAddresses(“server:11211 server:11212 server:11213 server:11214”));

简单的Java缓存库或设计模式?

我需要经常访问耗时计算的结果。 结果不经常更改,因此我不得不不时重新计算数据,但可以暂时使用过时的结果。 最简单的方法是什么?现有的库方法或设计模式是什么? 我在想类似的东西 private static List myCachedList = null; … // refresh list once in 3600 seconds if (needsRefresh(myCachedList, 3600)) { // run the calculation myCachedList = … } // use either updated or previous value from here on 一个正确的实现可能不是微不足道的,它可能必须处理线程安全,竞争条件等,所以我宁愿使用一个经过validation的实现,而不是在我自己。

应用程序缓存vs hibernate二级缓存,使用哪个?

我可以选择使用应用程序缓存, 手动将对象缓存到分发的memcached / redis集群 或者让hibernate二级缓存来执行缓存工作(对于那些应用程序对象)。 使用哪个更好?

用于Google App Engine的Memcache(Java)是全局缓存吗?

我是Google App Engine的新用户,过去几天我花了很多时间使用GAE的Memcache来存储数据。 根据我的初步调查结果,似乎GAE的Memcache不是全球性的? 让我进一步解释。 我知道GAE的不同请求可能由不同的实例提供(实际上这似乎经常发生)。 正是出于这个原因,我使用Memcache来存储一些共享数据,而不是静态Map。 我想(也许是错误的)这是使用分布式缓存的重点,以便任何节点都可以访问数据。 另一个明确的可能性是我做错了什么。 我已经尝试了JCache和低级Memcache API(我正在编写Java,而不是Python)。 这是我正在做的检索缓存: MemcacheService cache = MemcacheServiceFactory.getMemcacheService(); 部署之后,这是我检查的内容(通过我的应用程序日志): 初始请求由特定节点提供,并且数据存储在上面检索的高速缓存中。 新的几个请求检索相同的缓存,数据就在那里。 当一个新节点被生成来提供请求时(从日志中我知道发生这种情况是因为GAE记录了“此请求导致为您的应用程序启动了一个新进程……”),将检索缓存并且是EMPTY ! 现在我也知道无法保证Memcache中的数据有多长,但从我的发现来看,当diff实例尝试访问缓存时,数据就会消失。 这似乎违背了分布式全局缓存的整个概念吗? 希望有人能够确切地澄清这应该如何表现。 如果Memcache不是全局的并且每个服务器实例都有自己的副本,那么为什么甚至使用Memcache? 我可以简单地使用静态HashMap(我最初做过,直到我意识到由于不同的实例服务于我的请求它不会是全局的)。 帮帮我?

在tomcat实例之间共享会话(不使用粘滞会话)

我将有3个Tomcat服务器和一个负载均衡器,可以在不使用“ 粘性会话 ”的情况下调度请求。 我想在服务器之间共享会话数据,我正在考虑将它们保存在数据库中。 我想在我的数据库前面使用memcached作为一个层来更快地提供请求,并且不要让我的数据库负载很重 。 我正在考虑提供我的自定义tomcat管理器,它在获取/持久化会话数据到DB之前使用memcached,因为我没有看到这样做的透明方式(这意味着我将不得不再次管理它)我切换到另一个应用程序服务器)。 这是一个很好的解决方案还是你看到了更好的方法?

AppEngine Memcache过期策略

我期待以下AppEngine代码: MemcacheService memcache = MemcacheServiceFactory.getMemcacheService(); memcache.put(“Foo”, “Bar”, Expiration.onDate(new Date(1))); System.out.println(memcache.get(“Foo”)); System.out.println(memcache.put(“Foo”, “Baz”, null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)); 产生以下输出: null true 即,通过在1970年将条目放入缓存时设置过期日期,我预计它会立即被删除并可供重用。 相反,我得到: Bar false 即进入仍然存在。 现在,奇怪的是,如果我将我的代码更改为Expiration.onDate(new Date()) (没有1 ),即在执行put操作之前将expiration设置为右,我确实得到了预期的“null,true”。 Memcache是​​否以某种方式解释了过去相对于现在而不是绝对的过期日期? 但是,即使这样也不符合结果,因为距离看跌期权的1ms在到期时仍应该到期?!? 我可以将Expiration设置为什么值,以保证put条目的立即到期(和删除!)? 请记住,简单地使用当前时间戳可能无法可靠地工作,因为AppEngine不提供跨服务器的任何时钟同步保证! 我知道想要做到这一点听起来毫无意义乍一看(为什么不删除呢?),但我想在这里使用它: AppEngine Memcacheprimefaces获取和删除 (句子在“结论”上方)。

Memcached通过python为String设置为null,然后从Java获取

当我尝试从我在python中设置的memcached中读取一个String时: import memcache MC_SERVER = “192.168.1.100” MC_PORT = “11211” mc = memcache.Client([‘%s:%s’ % (MC_SERVER, MC_PORT)], debug=0) mc.set(“test_string”, “true”) print mc.get(“test_string”) Java告诉我它不存在,当我尝试获取它时显然会返回null: import com.danga.MemCached.*; public class Tester { // create a static client as most installs only need // a single instance protected static MemCachedClient mcc = new MemCachedClient(true, false); // set up connection pool once […]

使用Java查找AWS ElastiCache端点

我正在尝试使用最新的Java AWS SDK以编程方式从我的Java应用程序中获取ElastiCache端点列表。 事情似乎没有用 – 我可以找到一个有效的CacheCluster,但是当我列出它的节点时,它是空的。 这是我的代码: CacheCluster cc = it.next(); System.out.println(“Cache node type: ” + cc.getCacheNodeType()); System.out.println(“Number cache nodes: ” + cc.getNumCacheNodes()); List listCache = cc.getCacheNodes(); System.out.println(“List size: ” + listCache.size()); 当我运行它时,我得到以下输出: Cache node type: cache.m1.small Number cache nodes: 1 List size: 0 这似乎很简单,但似乎不起作用。 我已经启动了一个带有单个节点的ElastiCache集群,但是当我调用getCacheNodes()时列表显示为空。 我试图在本地和EC2实例上运行此代码,我两次都得到同样的东西。 关于我可能做错的任何想法?

如何在PHP和Java程序之间进行通信?

我正在开发一个Web应用程序,它经常需要运行计算密集型查询,其结果存储在一个单独的表中。 使用MySQL,此查询大约需要500毫秒 (尽可能优化,相信我)。 为了消除这个瓶颈,我创建了一个Java程序,它将相关的DB数据加载到内存中并执行查询本身; 它需要大约8 毫秒 (我有点自豪)。 我想使用这个Java程序来获取结果,如果它失败或不可用,则故障转移到PHP运行MySQL查询。 由于将数据加载到Java应用程序需要一些时间,因此它将加载一次并继续作为后台进程运行。 现在,问题是我如何通过PHP与这个Java应用程序进行通信? 记住: 多个PHP实例可能需要同时与此Java进程通信。 如果找不到Java实例(例如:由于某种原因它崩溃),PHP应该通过使用较旧和较慢的MySQL方法来进行。 可以接受诸如Memcache之类的中间过程。 理想情况下,该解决方案可以承受竞争条件。 我最好不要使用MySQL作为中介。 我打算使用Memcache,其中PHP将写入已知密钥并轮询,直到该密钥更改为“已完成”,同时Java将轮询该密钥,并且一旦发现某些内容执行该作业并将其设置为“已完成”。 但是,由于两个原因,这不起作用。 首先,PHP和Java都使用序列化对象读/写Memcache,并且没有办法改变它,我不希望Java反序列化PHP对象,反之亦然 – 它太乱了。 其次,这不符合ACID – 如果在那里建立的队列会有竞争条件。 就目前而言,我坚持轮询MySQL“选择”以查看作业是否已脱离队列,这远非最佳解决方案,因为轮询时间需要较慢,因此MySQL不会过于频繁。 我需要更好的解决方案! 谢谢。 编辑:Duh。 看起来我将在Java中使用某种SocketServer,我对此并不熟悉。 一个例子可能有帮助:)