Клиент Enyim Memcached не работает с переданным параметром срока действия

При использовании клиента Memyached для Enyim для хранения данных с истекшим временным интервалом я обнаружил, что он не работает. Кто-нибудь может помочь?

В моем тестовом коде я сохраняю дату с 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 ответов

Я не уверен, что вы расплывчаты с вашим примером или действительно используете тип объекта, но у меня была та же проблема с использованием пользовательских объектов. Целые числа, строки и т. Д. Работали бы нормально, но мой пользовательский объект всегда был пустым, как только я помещал его в кэш. Оказывается, у меня не было атрибута Serializable на моем объекте. Как только я положил это там, все работало как ожидалось

Гиацинт довольно точен в своем вопросе, ответы несколько не имеют значения. У меня такая же проблема ТОЛЬКО при установке срока действия, как Timespan или DateTime.

Существует также проблема для этого в github Enyim https://github.com/enyim/EnyimMemcached/issues/110

У нас есть измененная версия на базе кода моей компании, но она устарела. Я постараюсь найти исправление и вернуться к этому, и отправлю запрос на извлечение Enyim, когда найду время.

РЕДАКТИРОВАТЬ: Я также нашел это на GitHub.

Я могу подтвердить, что это не происходило с другими сборками сервера 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

Хотите проверить версию сервера, которую вы используете? Мой первоначальный комментарий остается в силе, так как я запускаю тесты с использованием двух разных библиотек, и измененный работает, пока тот, который поставляется с CouchBase, терпит неудачу

Пожалуйста, проверьте ваш сервер.

1. Используйте MemCacheD Manager

Или же

2. Используйте telnet 127.0.0.1 11211(измените настройки сервера)

и введите: статистика

Было бы показать вашу статистику.

См. "Время" пункт статистика.

Это второй формат, который вы должны конвертировать,

Просто вы можете сравнить с "1262517674",

Если значение меньше, чем "1262517674", ваш сервер memcached слишком старый.

Пожалуйста, обновите или измените свою версию memcached.

В противном случае просто измените свою версию memcached

Ответ в том, что в 64-битной версии memcached (windows) 1.4.4 есть эта ошибка. Если это соответствует вашим потребностям, вы можете попробовать 1.4.4 32-битную версию для Windows, или вы можете попробовать найти другую 64-битную скомпилированную версию. Эта проблема также заняла весь мой день, и я, наконец, установил "1.4.4 32-битную версию" и альт, все отлично работает с 1.4.4. 32-битный.

Вам нужно сначала получить сингтон.

например:

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

Создание клиентского объекта memcached является дорогостоящей операцией, поэтому попробуйте создать его при запуске приложения и повторно использовать этот объект.

Таким образом, я запускаю MemcachedClient Object и получаю доступ к Membese Build с помощью клиента Enyim.

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

}
Другие вопросы по тегам