【问题标题】:How to work with numeric/integer values in Redis with Booksleeve如何使用 Booksleeve 在 Redis 中处理数字/整数值
【发布时间】:2014-02-06 11:47:19
【问题描述】:

我目前正在使用内存缓存,并希望通过 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() 所有数字键值吗?

任何关于为什么我无法取回原始缓存值的解释(以及这样做的最佳实践)将不胜感激。

【问题讨论】:

    标签: c# redis booksleeve


    【解决方案1】:

    我的回答分为两部分:

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

      当然,这个 sn-p 不包括任何类型的错误检查,这很容易应用(例如,如果值为空或包含不是数字的内容怎么办)。

    至于你的最后一个问题,是使用.ToString() 推荐的方法 - 是的。这就是使用 Redis 的方式。但是,当然,您可以制作自己的实用程序包装器,负责将假定为连续数字的值转换为数字。 GetIntValue(string key) 之类的东西。

    【讨论】:

    • 太棒了,感谢您的彻底回答。我认为 redis 将所有内容都视为字符串,但有点被数字操作推迟了。感谢您清除它
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2013-03-29
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多