Клиент 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);
}
}