【问题标题】:How to do range query search in Redis on value part of a Key?如何在 Redis 中对键的值部分进行范围查询搜索?
【发布时间】:2019-06-11 17:28:13
【问题描述】:

如何对 Redis 的 value 部分进行基于范围查询的检索?

我是 Redis 新手。我打算用它来缓存。我在 C# 中使用 StackExchage.Redis 库。

例如我有实体Employee:

public class Employee
{
    public int EmployeeId;
    public string Name;
    public float Age;
    public DateTime JoiningDate;
    public DateTime LeavingDate;
    public List<Department> Departments;
    public List<Address> Addresses;
}

EmployeeId 是我的密钥,Employee 对象是我的值。 我的 Redis 数据库中有 100 万条此类记录。

我想找出某些问题,例如 Range Queries 或 Sorting by some or combination property of value part (Employee object) 或者 Entity 是否包含另一个实体(例如 Employee 包含 DepartmentDepartment 有它的自己的属性)

  1. 获取Employee,其加入日期在2017年到2019年之间?
  2. Employee 5 年前加入的是谁?
  3. 在存储记录时,按某些属性的排序顺序存储(不想在 C# 中排序)

我使用此处描述的示例将数据存储在数据库中:Redis for .NET Developer – Redis Hash Datatype

【问题讨论】:

标签: c# redis stackexchange.redis


【解决方案1】:

你不能只使用 Redis Hash 来达到目标​​,但你可以组合多个 Redis 数据结构。

  • 使用哈希存储你的所有数据(你不可避免)
  • 当您按员工日期排序时:
    • 你可以使用Redis Sorted Set
    • Sorted-Set 成员是您的 EmployeeId,Sorted-Set 分数是 Employee 加入日期
    • 您可以使用 ZADD 存储您的排序数据,并使用 ZRANGEBYSCORE 获取您想要的排序结果

如果您有其他排序要求,则必须将 sorted 属性转换为数字。

【讨论】:

  • 你的意思是当我存储值时它会像(键:EmployeeId 和值:SortedSet(Employee object with sorted by Id, JoiningDate and etc...))?
  • 您应该使用哈希来存储您的数据:key-EmployeeId,value-Employee 对象。然后你使用 sorted set 来存储按 joindate 排序的: - key: SortedJoinDate - member: EmployeeId - score: EmployeeJoinDate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2013-09-03
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2019-06-22
相关资源
最近更新 更多