如何使用Redis with Booksleeve中的数值/整数值

时间:2014-02-05 17:29:03

标签: c# redis booksleeve

我目前正在使用内存缓存,并希望使用Redis切换到分布式缓存机制。我查看了ServiceStack的客户端,但速率限制许可对我不起作用,因此建议使用Booksleeve。

我已经设置了一个测试程序来设置并从Booksleeve获得相同的值,但似乎我得到的结果不是我预期的格式,我不知道是什么处理这个问题的正确方法是(我可以看到文档的方式并不多)。这是我的简单测试程序:

            RedisConnection conn = new RedisConnection("localhost", 6379);
            conn.Open();
            conn.Strings.Set(1, "test", 100);
            var task = conn.Strings.Get(1, "test");
            task.Wait();
            var x = task.Result; // byte[] result = {49, 48, 48};
            var str = BitConverter.ToString(x); // string result = "31-30-30";
            var l = BitConverter.ToInt64(x, 0); // Destination array is not long enough to copy all the items in the collection. Check array index and length.

正如您所看到的,我在任何时候都没有获得与我使用原始“Set”语句缓存的“100”相同的值。有趣的是,我似乎无法通过数值缓存(因为Get和Set是conn.Strings的成员)。推荐的方法只是.ToString()所有数字键值吗?

对于为什么我无法取回原始缓存值(以及执行此操作的最佳做​​法)的任何解释将非常感激。

1 个答案:

答案 0 :(得分:2)

我的回答分为两部分:

  1. 即使您设置了数字,Redis也会始终保存字符串。但它内部知道对表示数字的字符串执行某些特定操作。 例如,如果您在第一次.Set()作业后立即添加:

    conn.Strings.Increment(1, "test", 1);

    test 键的值为“101”,这是一个字符串,但是由Redis的算术计算得出。

  2. 您需要修复转换功能。而不是使用BitConverter,这是正确的转换方式:

    var str = System.Text.Encoding.UTF8.GetString(x);
    var value = int.Parse(str);
    

    当然,此代码段不包含任何类型的错误检查,这很容易应用(例如,如果值为空或包含非数字的内容,则会发生什么情况。)

  3. 至于你的上一个问题,是使用.ToString()推荐的方法 - 是的。这是与Redis合作的方式。但是,当然,您可以创建自己的实用程序包装器来处理将contian数字转换为数字的值。类似于GetIntValue(string key)左右的东西。