使用ServiceStack使用Redis管理/更新ASP.NET中的记录

时间:2013-05-28 20:41:23

标签: c# redis servicestack

我来自SQL Server背景,并使用ServiceStack在.NET中试验Redis。我并不是说Redis是SQL Server的完全替代品,但我只是想了解如何使用它,以便我可以看到我们可以在哪里充分利用它。

我正在努力解决我认为非常基本的问题。我们有一个在几个不同数据存储中维护的项目列表。为简单起见,假设项目的定义是基本的:整数id和字符串名称。我正在尝试执行以下操作:

  • 存储商品
  • 如果我们只知道其ID
  • ,则检索一个项目
  • 如果我们只知道其ID
  • ,则覆盖现有项目
  • 显示该特定类型的所有项目

以下是我放在一起的一些代码:

    public class DocumentRepositoryRedis
    {
        private static string DOCUMENT_ID_KEY_BASE = "document::id::";

        public IQueryable<Document> GetAllDocuments()
        {
            IEnumerable<Document> documentsFromRedis;
            using (var documents = new RedisClient("localhost").As<Document>())
            {
                documentsFromRedis = documents.GetAll();
            }
            return documentsFromRedis.AsQueryable();
        }

        public Document GetDocument(int id)
        {
            Document document = null;
            using (var redisDocuments = new RedisClient("localhost").As<Document>())
            {
                var documentKey = GetKeyByID(document.ID);
                if (documentKey != null)
                    document = redisDocuments.GetValue(documentKey);        
            }
            return document;
        }

        public void SaveDocument(Document document)
        {
            using (var redisDocuments = new RedisClient("localhost").As<Document>())
            {
                var documentKey = GetKeyByID(document.ID);
                redisDocuments.SetEntry(documentKey, document);
            }
        }

        private string GetKeyByID(int id)
        {
            return DOCUMENT_ID_KEY_BASE + id.ToString();
        }
    }

这一切似乎都有效 - 除了GetAllDocuments。无论我存储了多少文档,都会返回0个文档。我做错了什么?

1 个答案:

答案 0 :(得分:2)

键入的Redis客户端还允许您访问非类型化方法 - 因为Redis最终不了解或关心您的对象类型。因此,当您使用client.SetEntry()方法时,它会绕过某些类型化客户端的功能,并仅通过密钥存储对象。您将需要使用client.Store方法,因为它继续并在Redis中创建一个SET,其中包含与您的类型相关的所有对象ID。这个SET非常重要,因为这是GetAll方法依赖的所有对象的服务。 client.Store方法会自动推断ID,因此您可以使用它。

您要更改GetDocument(int id)和SaveDocument(文档文档)方法以使用client.GetById(string id)方法,并且您将使用client.Store(T value)方法。您将不再需要GetKeyByID()方法。我相信你的Document对象需要一个“Id”属性,以便键入的客户端推断你的对象ID。