3

Enyim memcached クライアントを使用して期限切れのタイムスパンでデータを保存すると、機能しないことがわかりました。誰でも助けてもらえますか?

私のテスト コードでは、有効期限が 10 分の日付を保存し、すぐにキャッシュから取得しようとしましたが、null オブジェクトを取得しました。

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
4

6 に答える 6

3

あなたの例が漠然としているのか、それとも本当にオブジェクトタイプを使用しているのかはわかりませんが、カスタムオブジェクトを使用しても同じ問題がありました。整数、文字列などは正常に機能しますが、カスタム オブジェクトをキャッシュに入れるとすぐに常に NULL になりました。オブジェクトに Serializable 属性がなかったことがわかりました。それをそこに置くと、すべてが期待どおりに機能しました。

于 2011-12-08T19:39:28.353 に答える
2

サーバーを確認してください。

1.MemCacheDマネージャーを利用する

または

2. telnet 127.0.0.1 11211 を使用します (サーバー設定に変更します)。

およびタイプ:統計

それはあなたの統計を表示します。

「時間」アイテム統計を参照してください。

これは、変換する必要がある 2 番目の形式です。

単に「1262517674」と比較すると、

「1262517674」より小さい場合は、memcached サーバーが古すぎます。

memcached のバージョンをアップグレードまたは変更してください。

それ以外の場合は、memcached のバージョンを変更してください

于 2012-10-06T08:59:00.660 に答える
2

Hyacinthus は彼の質問に対してかなり正確ですが、答えはやや無関係です。Timespan または DateTime として有効期限を設定する場合にのみ、同じ問題が発生します。

Enyim の github 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

使用しているサーバーのバージョンを確認しますか? 2 つの異なる dll を使用してテストを実行すると、私の最初のコメントはそのまま残ります。

于 2012-10-03T16:19:01.657 に答える
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);
    }

}
于 2011-07-28T08:09:27.040 に答える
0

最初にシングトンを取得する必要があります。

例えば:

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; } }
    }
}
于 2013-10-14T08:00:01.437 に答える