使用Redis的应用程序的Datamodel设计

时间:2015-04-14 05:51:33

标签: redis data-modeling

  

我是redis的新手,我正在试图弄清楚如何使用redis。   如果这是构建应用程序的正确方法,请告诉我。

我正在构建一个只有一个数据源的应用程序。我打算每晚运行一份工作,将数据存入文件。

现在我有一个前端应用程序,需要以不同的格式呈现这些数据。

示例应用程序用例
每晚下载大学处理过的申请表 显示已批准或拒绝的申请数量 按州显示申请数量 让用户按应用程序ID搜索应用程序。

我没有使用像关系数据库这样的postgres / mysql,而是考虑使用redis。我打算以下列方式存储数据。

  1. 申请ID - >申请详情
  2. 州 - >申请ID列表
  3. 已批准 - >申请ID清单(按日期?)
  4. 拒绝 - >申请ID清单(按日期?)
  5. 这是将数据存储到redis的正确方法吗?

    如果有人在加利福尼亚查询特定日期的所有申请, 我可以在一次调用中提取应用程序ID但是为了获取每个应用程序的详细信息,我是否需要再提出请求?

2 个答案:

答案 0 :(得分:1)

提醒:

  

我没有使用像关系数据库那样的postgres / mysql,而是考虑使用redis。

为什么呢? Redis是一个了不起的数据库,但是不要使用正确的锤子来修错钉子。如果您需要大规模的实时性能,请使用Redis,但如果您需要,请不要尝试将其替换为RDBMS。

<强>答案:

从Redis有效地获取数据以回答您的查询取决于您将如何存储它。因此,要确定“正确”的数据模型,首先需要定义查询。您提出的数据模型只是对数据的描述 - 它并没有真正说明您计划如何将其存储在Redis中。如果没有关于查询的更多细节,我会将数据存储如下:

  1. 将应用程序详细信息存储在哈希(例如app:<id>
  2. 将应用程序ID存储在Set中的每个州(例如apps:<state>
  3. 将已批准/已拒绝的应用程序存储在两个已排序的集合中,ID为成员,日期为分数
  4.   

    如果有人在加利福尼亚查询特定日期的所有应用程序,我将能够在一次调用中提取应用程序ID但是为了获取每个应用程序的详细信息,我是否需要再提出请求?

    同样,这取决于数据模型,但您可以使用Lua脚本嵌入此逻辑并在一次调用数据库时执行它。

答案 1 :(得分:0)

首先,您可以使用哈希来存储结构化数据。使用Lists(ZSets)和Set,您可以为有序或无序访问创建索引。 (根据您的要求,列出您希望如何访问数据的列表。)

可以使用简单的redis脚本(使用无序集合的示例)一次性将所有数据作为索引的json获取:

local bulkToTable = function(bulk)
    local retTable = {};
    for index = 1, #bulk, 2 do
        local key = bulk[index];
        local value = bulk[index+1];
        retTable[key] = value;
    end
    return retTable;
end

local functionSet = redis.call("SMEMBERS", "app:functions")
local returnObj = {} ;
for index = 1, #functionSet, 1 do
    returnObj[index] = bulkToTable(redis.call("HGETALL", "app:function:" .. functionSet[index]));
    returnObj[index]["functionId"] = functionSet[index];
end
return cjson.encode(returnObj);

有关redis脚本的详细信息,请参阅此处:http://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/