Enyim Memcached客户端无法使用传递的expiration参数

时间:2011-07-28 04:02:24

标签: memcached enyim

当使用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

6 个答案:

答案 0 :(得分:3)

我不确定你的例子是否模糊,或者你是否真的使用了对象类型,但我使用自定义对象时遇到了同样的问题。整数,字符串等可以正常工作但我的自定义对象一旦放入缓存就总是NULL。事实证明我的对象上没有Seri​​alizable属性。一旦我把它放在那里,一切都按预期工作。

答案 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)

请检查您的服务器。

1.使用MemCacheD Manager

或者

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; } }
    }
}