我是redis的新手,我正在试图弄清楚如何使用redis。 如果这是构建应用程序的正确方法,请告诉我。
我正在构建一个只有一个数据源的应用程序。我打算每晚运行一份工作,将数据存入文件。
现在我有一个前端应用程序,需要以不同的格式呈现这些数据。
示例应用程序用例
每晚下载大学处理过的申请表
显示已批准或拒绝的申请数量
按州显示申请数量
让用户按应用程序ID搜索应用程序。
我没有使用像关系数据库这样的postgres / mysql,而是考虑使用redis。我打算以下列方式存储数据。
这是将数据存储到redis的正确方法吗?
如果有人在加利福尼亚查询特定日期的所有申请, 我可以在一次调用中提取应用程序ID但是为了获取每个应用程序的详细信息,我是否需要再提出请求?
答案 0 :(得分:1)
提醒:
我没有使用像关系数据库那样的postgres / mysql,而是考虑使用redis。
为什么呢? Redis是一个了不起的数据库,但是不要使用正确的锤子来修错钉子。如果您需要大规模的实时性能,请使用Redis,但如果您需要,请不要尝试将其替换为RDBMS。
<强>答案:强>
从Redis有效地获取数据以回答您的查询取决于您将如何存储它。因此,要确定“正确”的数据模型,首先需要定义查询。您提出的数据模型只是对数据的描述 - 它并没有真正说明您计划如何将其存储在Redis中。如果没有关于查询的更多细节,我会将数据存储如下:
app:<id>
)apps:<state>
)如果有人在加利福尼亚查询特定日期的所有应用程序,我将能够在一次调用中提取应用程序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/