Клиент Enyim Memcached не работает с переданным параметром срока действия - PullRequest
3 голосов
/ 28 июля 2011

при использовании клиента 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 ]

3 голосов
/ 08 декабря 2011

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

2 голосов
/ 06 октября 2012

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

1.Использование MemCacheD Manager

Или

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

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

Это покажет вашу статистику.

См. Пункт "время".

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

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

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

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

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

2 голосов
/ 03 октября 2012

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

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

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

EDIT: Я также нашел это на 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 голос
/ 16 июня 2017

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

0 голосов
/ 14 октября 2013

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

например:

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; } }
    }
}
0 голосов
/ 28 июля 2011

Создание объекта клиента 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);
    }

}
...