servicestack redis,当使用SetEntry时,它将在redis db中自动生成一个带有键“ids:+ objectName”的集合,如何禁用它?

时间:2013-11-19 04:35:25

标签: redis servicestack

使用SetEntry时,它会在redis db中自动生成一个带有“ids:+ objectName”键的集合。

例如:    typedClient.SetEntry(“famyly:username:jhon”,new Family {FatherName =“Jhon”,...});

密钥名称为“ids:Family”的集合和类似“2343443”的成员将在redis db中自动创建, 每次我使用SetEntry更新或修改相同的密钥时,“ids:Family”的集合将以新的自动生成成员递增。如果我经常更新密钥,这个集合将会变得非常大。

如何禁用自动生成的设置?对于目前的情况,这一套似乎毫无用处。

感谢

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题 - 我发现我们的数据库中包含了几十个“ids:XXX”集,每个集包含数千万个项目,这些项目消耗了大量内存。

解决方案是切换到无类型客户端。您仍然可以在客户端上使用键入的方法,因此您根本不会放弃任何类型安全或自动序列化。有几种方法可以创建客户;我们倾向于使用Exec上的get-in-get-out RedisClientsManager快捷方式。您应该能够根据自己的方式进行调整。

键入的客户端 - 创建“ids”集:

// set:
redis.ExecAs<T>(c => c.SetEntry(key, value));

// get:
T value = redis.ExecAs<T>(c => c.GetValue(key));

无类型客户端 - 未创建“ids”集:

// set:
redis.Exec(c => c.Set(key, value));

// get:
using (var cli = _redis.GetClient())
{
    T value = cli.Get<T>(key);
}

答案 1 :(得分:1)

推断自动生成的ID是您使用高级Redis类型客户端的时候。请改用基于字符串的RedisClient API上的IRedisClient.SetEntry