2011-07-28 43 views
3

的過期參數,我發現它不起作用。 任何人都可以幫忙嗎?當使用Enyim memcached客戶端存儲具有過期時間跨度的數據時,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

嗨,你是否找到了解決這個問題的方法?感謝您的分享。 – VdesmedT

回答

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

} 
+0

謝謝,但我不認爲這是我想要的。我想知道爲什麼它不緩存我的項目。我使用的是memcached 1.4.6 – Hippasus

+0

如果你打算在windows上使用memcached,我建議你使用[memcached](http://www.couchbase.com/products-and-services/memcached)的northscale構建 – Dasun

3

我不知道,如果你是模糊的瓦特/你的榜樣,或者如果你真的是使用對象類型,但我不得不使用自定義對象相同的問題。整數,字符串等工作正常,但我的自定義對象總是空的,只要我把它放入緩存。原來我的對象上沒有Seri​​alizable屬性。一旦我把它放在那裏,一切都按預期工作。

+0

這就是正確! –

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

請檢查您的服務器。

1.使用MemCacheD Manager

或者

2.使用的telnet 127.0.0.1 11211(改變您的服務器設置)

和類型:統計

這將顯示您的統計信息。

請參閱「時間」項統計。

這是第二格式,你必須把它轉換,

簡單的,你可以用「1262517674」進行比較,

如果小於「1262517674」,您的memcached服務器太舊。

請升級或更改您的memcached版本。

否則只需更改您的memcached版本

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

答案是memcached的(Windows)中1.4.4的64位版本有這個bug。如果它適合您的需求,您可以嘗試1.4.4 32位版本的Windows,或者您可以嘗試找到另一個64位編譯版本。這個問題也花了我整整一天的時間,我終於安裝了「1.4.4 32位版本」和中提琴,所有東西都與1.4.4完美配合。 32位。

相關問題