当使用Enyim memcached客户端来存储具有过期时间跨度的数据时,我发现它不起作用。 有人可以帮忙吗?
在我的测试代码中,我将日期存储在10分钟的到期时间内,并且我尝试立即从缓存中获取它,但得到了一个空对象。
Enyim.Caching.MemcachedClient client = new Enyim.Caching.MemcachedClient();
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "one", 1, new TimeSpan(0, 10, 0));
object obj;
client.TryGet("one", out obj); // obj == null
Assert.AreNotEqual(null, obj); // this will fail
答案 0 :(得分:3)
我不确定你的例子是否模糊,或者你是否真的使用了对象类型,但我使用自定义对象时遇到了同样的问题。整数,字符串等可以正常工作但我的自定义对象一旦放入缓存就总是NULL。事实证明我的对象上没有Serializable属性。一旦我把它放在那里,一切都按预期工作。
答案 1 :(得分:2)
Hyacinthus对他的问题非常准确,答案有点无关紧要。我在设置过期时遇到同样的问题,无论是作为Timespan还是作为DateTime。
Enyim的github https://github.com/enyim/EnyimMemcached/issues/110
也存在一个问题我们公司的代码库有一个调整版本,但它已经过时了。我将尝试找到修复程序并返回到此处,并在找到时间时向Enyim发送拉取请求。
编辑: 我还在github上找到了this。
我可以确认这与memcached服务器的其他版本没有发生。我认为这是一个特殊构建的错误: 构建此问题: http://www.urielkatz.com/archive/detail/memcached-64-bit-windows 构建没有这个问题: http://blog.elijaa.org/index.php?post/2010/08/25/Memcached-1.4.5-for-Windows
注意检查您使用的服务器版本? 我的初步评论仍然有效,因为我使用两个不同的dll进行测试,并且调整的一个可以使用CouchBase附带的那个失败
答案 2 :(得分:2)
请检查您的服务器。
或者
2.使用telnet 127.0.0.1 11211(更改为服务器设置)
并输入:stats
它会显示您的统计数据。
请参阅“时间”项目统计信息。
这是你必须转换它的第二种格式,
您只需与“1262517674”比较,
如果小于“1262517674”,则memcached服务器太旧了。
请升级或更改您的memcached版本。
否则只需更改您的memcached版本
答案 3 :(得分:1)
答案是memcached(windows)1.4.4 64位版本有这个bug。如果它符合您的需求,您可以尝试1.4.4 32位版本的Windows,或者您可以尝试找到另一个64位编译版本。这个问题也花了我一整天,我终于安装了“1.4.4 32位版本”和中提琴,一切都与1.4.4完美配合。 32位。
答案 4 :(得分:0)
创建memcached客户端对象是一项代价高昂的操作,因此请尝试在应用程序启动时创建它并重用该对象。
这是我如何启动MemcachedClient对象并使用Enyim客户端访问Membese Build。
public class MemcachedManager
{
protected static MemcachedClient mc = null;
public MemcachedManager()
{
if (mc == null) initMemCached();
}
private void initMemCached()
{
MemcachedClientConfiguration config = new MemcachedClientConfiguration();
string ipstr = "192.168.1.1;192.168.1.2"; // List of Memcaced nodes
string[] ips = ipstr.Split(';');
foreach (string ip in ips)
{
config.Servers.Add(new IPEndPoint(IPAddress.Parse(ip), 11211));
}
config.Protocol = MemcachedProtocol.Binary;
mc = new MemcachedClient(config);
}
public void setWithTimeOut(string key, string value, int minutes)
{
mc.Store(Enyim.Caching.Memcached.StoreMode.Set, key, value, TimeSpan.FromMinutes(minutes));
}
public string getString(string key)
{
return (string)mc.Get(key);
}
public void setString(string key, string value)
{
mc.Store(Enyim.Caching.Memcached.StoreMode.Set, key, value);
}
}
答案 5 :(得分:0)
你需要先获得一个sington。
例如:
using System;
using Enyim.Caching;
using Enyim.Caching.Memcached;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
MemcachedClient client = MemcachedManager.Instance;//new MemcachedClient();
client.Store(StoreMode.Set, "b", "bb", new TimeSpan(1, 1, 300));
var x = client.Get("b");
client.Store(StoreMode.Set, "a", "aa");
var y = client.Get("a");
client.Store(StoreMode.Set, "c", "cc", DateTime.Now.AddSeconds(300));
var z = client.Get("c");
client.Store(StoreMode.Set, "c", "ccc");
var t = client.Get("c");
Console.WriteLine("{0},{1},{2}",x,y,z);
}
}
public static class MemcachedManager
{
private readonly static MemcachedClient _instance;
static MemcachedManager()
{
_instance = new MemcachedClient();
}
public static MemcachedClient Instance { get { return _instance; } }
}
}