当前位置: 首页 > 面试题库 >

这是ServiceStack Redis的有效用法吗?

范麒
2023-03-14
问题内容

我是Redis的新手(在托管服务中使用它),并希望将其用作列表的演示/沙箱数据存储

我使用以下代码。这个对我有用。但是,对于具有几个(最多100个)并发用户(用于少量数据-最多1000个列表项)的小型网站,这是否有效(并非完全不作弊)?

我正在使用静态连接和像这样的静态redisclient类型列表:

public class MyApp
{   
    private static ServiceStack.Redis.RedisClient redisClient;

    public static IList<Person> Persons;
    public static IRedisTypedClient<Person> PersonClient;

    static MyApp()
    {
        redisClient = new RedisClient("nnn.redistogo.com", nnn) { Password = "nnn" };
        PersonClient = redisClient.GetTypedClient<Person>();
        Persons = PersonClient.Lists["urn:names:current"];
    }
}

这样做,我有一个非常容易使用的持久性数据列表,这正是我在构建/演示应用程序基本块时想要的。

foreach (var person in MyApp.Persons) ...

添加新人:

MyApp.Persons.Add(new Person { Id = MyApp.PersonClient.GetNextSequence(), Name = "My Name" });

我当前的担心不是(不是)我在appstart时将完整列表加载到内存中,而是我与redis主机的连接未遵循良好标准的可能性-
或存在其他一些我不了解的问题意识到。

谢谢


问题答案:

实际上,当您使用时PersonClient.Lists["urn:names:current"],实际上是在存储对不是线程安全的RedisClient连接的引用。可以在GUI或控制台应用程序中使用,但在多线程Web应用程序中则不理想。在大多数情况下,您想使用线程安全连接工厂,即

var redisManager = new PooledRedisClientManager("localhost:6379");

这非常像数据库连接池。因此,每当您要访问RedisClient时,其工作方式如下:

using (var redis = redisManager.GetClient())
{
    var allItems = redis.As<Person>().Lists["urn:names:current"].GetAll();
}

注意:这.As<T>是别名的.GetTypedClient<T> 缩写。另一个从redisManager执行类型化客户端的便捷快捷方式是:

var allItems = redisManager.ExecAs<Person>(r => r.Lists["urn:names:current"].GetAll());

我通常更喜欢IRedisClientsManager在代码中传递,这样它就不会保留RedisClient连接,但可以在需要时访问它。



 类似资料:
  • ServiceStack.Redis 是一个 Redis 的 C# 客户端。是 Service Stack 的一部分。 using (var redisManager = new PooledRedisClientManager())using (var redis = redisManager.GetClient()){    var redisTodos = redis.As<Todo>();

  • 使用Wireshark,我看到iOS飞利浦远程电视应用程序与我的飞利浦电视交谈,运行他们的新os Saphi发送一些HTTP请求,授权标题如下: 授权:基本1:ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCA9SRYSLVLCFMNNE4C4C4PxZTOOWVHVA== 我相信“1”是用户ID,它与带有“:”的长密码分开。 在维基百

  • 这是我的echelleetserpent.hpp: 还有我的蛇。cpp 我得到以下错误: 错误继续: 在/usr/include/c/7/bits/stl_algobase中包含的文件中。h:71:0,来自/usr/include/c/7/vector:60,来自echelleetserpent。hpp:1,来自echelleetserpent。cpp:1:/usr/include/c/7/bit

  • 我已经提出了几个解决方案,但我认为它们的效率不高,而且我很难计算它们的复杂性。 计划A)对于我随机选择的[1,N]范围内的每一个整数,我检查它是否被占用。如果是,我重新滚动直到我得到一个未被占用的整数。这对于N的高阶数来说变得低效,因为碰撞非常高。 计划B)每次迭代时,我遍历数组的所有值,那些我没有占用的我会写在一个列表中。之后,我洗牌列表(例如通过Fisher-Yates shuffle?)并任

  • 那是什么绳子?它看起来像ASCII,但我缺乏关于编码的深刻知识。我需要任何类型的转换/解码吗? 我写了一个小程序来打开一个文件并解密它。但是PyCrypto抛出了一个错误,我花了5个小时反复试验,没有任何进展: 所以我两个都试了: null 问候AFX

  • 下面的代码是用Clang编译和运行的(在13、14和当前git头上进行了测试),但不是用GCC。 但我不明白它在宣告什么:这个领域是什么? 我可以在