如何使用Redis跟踪短期和长期的移动用户历史记录

时间:2015-12-15 15:09:03

标签: java mobile redis persistence bigdata

我们的移动应用跟踪用户历史记录(历史事件已预先定义,包含操作和日期)

报告用户历史记录的每个移动设备都可以检索它。

我使用Redis上的最新历史记录(让我们说100条记录)来快速检索,并在100条记录之后将旧数据移动到某些数据源。

  1. 您认为Redis是否适合短期历史检索?
  2. 您将使用哪个数据源来保留最早的历史记录以供检索?
  3. 您的经历中的其他想法?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,Redis非常适合短期历史行为。 LIST具有良好的数据结构:

  1. 快速插入有序数据( O(1)LPUSH
  2. 快速选择(LRANGE O(S + N)
  3. 内存消耗低(Redis实际上最低 - 每个列表项只需21个字节)
  4. 此外,您可以使用某种类型的cron作业来获取和插入旧数据,如数据库。使用LUA scrpting获取日志尾部:

    local ret = {}
    while tonumber(redis.call('llen', KEYS[1])) > tonumber(ARGV[1]) do
       table.insert(ret, redis.call('rpop', KEYS[1]))
    end
    return ret
    

    其中KEY是您的LIST键,第一个参数是要处理的尾部大小。此LUA脚本以原子方式切断(并返回)所有日志条目,而不是ARGV 1。下一步是按列表简单foreach并插入SQL数据库。

    虽然用户想要获取他的所有历史记录(在伪代码中,require个变量是用户查询的总记录数):

    ret = redis.call('LRANGE', 'myKey', 0, require)
    require = require - length(ret)
    if (require > 0) {
        ret += db.query('SELECT ... LIMIT ' + require)
    }