如何通过ServiceStack.Redis按字段值查询Redis中CompanyList类数据
嘿,我来帮你搞定这个问题!用ServiceStack.Redis查询CompanyList类里Expediente字段等于100037的数据,核心是要利用Redis的索引能力,或者借助ServiceStack自带的特性,下面给你几种可行的方案,从高效到简单逐一说明:
方案一:提前创建二级索引(推荐,高效查询)
Redis本身是键值存储,没有原生的字段查询能力,所以要高效定位特定字段值的数据,最好提前给Expediente字段建立索引。存储数据时同步维护索引,查询时就能快速定位。
存储数据时同步建索引
当你保存CompanyList对象到Redis时,额外把Expediente的值和对象ID关联起来,用Redis的Set结构来存储相同Expediente对应的所有对象ID:
using (var redis = new RedisClient("你的Redis地址")) { // 实例化要存储的CompanyList对象 var targetCompany = new CompanyList { Id = "company_001", Expediente = "100037", // 其他字段赋值... }; // 把对象存入Redis redis.As<CompanyList>().Store(targetCompany); // 建立Expediente到对象ID的索引:键名格式建议用`idx:类名:字段名:字段值` redis.AddItemToSet($"idx:CompanyList:Expediente:{targetCompany.Expediente}", targetCompany.Id); }
基于索引查询数据
查询时先通过索引获取匹配的对象ID,再根据ID拉取完整对象:
using (var redis = new RedisClient("你的Redis地址")) { // 从索引中获取Expediente=100037的所有CompanyList对象ID var matchingIds = redis.GetAllItemsFromSet($"idx:CompanyList:Expediente:100037"); // 根据ID批量获取完整对象 var matchingCompanies = redis.As<CompanyList>().GetByIds(matchingIds); // matchingCompanies就是你要的目标数据啦 }
方案二:用ServiceStack的Linq查询(简化操作)
ServiceStack.Redis支持Linq语法查询,底层会自动利用已有的索引(如果有的话),没有索引时会在客户端过滤(数据量大时不推荐)。
代码示例:
using (var redis = new RedisClient("你的Redis地址")) { var redisCompanyRepo = redis.As<CompanyList>(); // 直接用Linq过滤Expediente字段 var matchingCompanies = redisCompanyRepo.Where(c => c.Expediente == "100037").ToList(); }
注意:如果没提前建索引,这个查询会把所有CompanyList数据拉到本地再过滤,数据量大时速度会很慢,所以还是优先用方案一。
方案三:手动遍历所有数据(仅小数据量可用)
如果你的CompanyList数据量极小,也可以直接拉取所有数据后在本地过滤,但这种方法效率极低,数据多的时候千万别用:
using (var redis = new RedisClient("你的Redis地址")) { // 拉取所有CompanyList数据 var allCompanies = redis.As<CompanyList>().GetAll(); // 本地过滤出Expediente=100037的数据 var matchingCompanies = allCompanies.Where(c => c.Expediente == "100037").ToList(); }
额外注意事项
- 更新或删除CompanyList对象时,要同步更新对应的索引,比如删除对象时,要从对应的Expediente索引Set中移除该对象的ID,避免数据不一致。
- ServiceStack.Redis的
As<T>()方法会自动处理对象的序列化(默认JSON),对象的Id属性会作为Redis存储的键名(比如urn:companylist:company_001)。
内容的提问来源于stack exchange,提问作者Hector Hernandez
相关产品推荐
相关产品推荐

