MySQL到Redis-导入和建模

MySQL到Redis-导入和建模,mysql,nosql,redis,key-value-store,Mysql,Nosql,Redis,Key Value Store,我正在考虑使用缓存一些用户数据快照,以加快对该数据的访问(原因之一是我的MySQL表存在锁争用),我正在寻找一种最好的方法,一步导入这样一个表(可能包含从几条记录到数百万条记录): 进入Redis键值存储 我可以将许多“快照”加载到Redis中,基本访问模式是(类似SQL的语法) 从快照=?和id=? 这些快照也可以来自其他表,因此“每个快照的全局唯一ID”是列快照,例如: mysql> select * from my_other_table where snapshot = 113

我正在考虑使用缓存一些用户数据快照,以加快对该数据的访问(原因之一是我的MySQL表存在锁争用),我正在寻找一种最好的方法,一步导入这样一个表(可能包含从几条记录到数百万条记录):

进入Redis键值存储

我可以将许多“快照”加载到Redis中,基本访问模式是(类似SQL的语法)

  • 从快照=?和id=?
这些快照也可以来自其他表,因此“每个快照的全局唯一ID”是列
快照
,例如:

mysql> select * from my_other_table where snapshot = 1134;
+------+--------------------------+----------------+-------------------+-----------+-----------+
| id   | email                    | name           | surname           | operation | snapshot  |
+------+--------------------------+----------------+-------------------+-----------+-----------+
| 2989 | example-2989@example.com | fake-name-2989 | fake-surname-2989 |         1 |      1134 |
| 2990 | example-2990@example.com | fake-name-2990 | fake-surname-2990 |         8 |      1134 |
| 2552 | example-2552@example.com | fake-name-2552 | fake-surname-2552 |         5 |      1134 |
+------+--------------------------+----------------+-------------------+-----------+-----------+
加载到redis中的快照从未更改,它们仅通过TTL提供一周

  • 有一种方法可以通过一步将此类数据(行和列)加载到redis中,并结合
    redis cli--pipe
    HMSET

  • 在redis中存储/获取这些数据的最佳模型是什么(考虑访问模式)

我已经找到了
rediscli--pipe
(还有),但我无法找到使用

提前谢谢

克里斯蒂安。

型号 要能够以与以下相同的方式从Redis查询数据:

从快照=?
从mytable中选择*,其中id=?
你需要下面的模型

注意:
select*from mytable where snapshot=?id=?
在这里没有太多意义,因为它与id=?所在的mytable中的
select*相同

密钥类型和命名 注意:我使用了
d:
作为名称空间,但您可能希望使用域模型的名称对其进行重命名

数据插入 将Mysql中的新行插入Redis:

hmset d:2989 id 2989 email example-2989@example.com name fake-name-2989 ... snapshot 1134
zadd d:ByInsertionDate {current_timestamp} d:2989
sadd d:BySnapshot:1134 d:2989
另一个例子:

hmset d:2990 id 2990 email example-2990@example.com name fake-name-2990 ... snapshot 1134
zadd d:ByInsertionDate {current_timestamp} d:2990
sadd d:BySnapshot:1134 d:2990
克朗 以下是根据您的要求每天或每周必须运行的算法:

for key_name in redis(ZREVRANGEBYSCORE d:ByInsertionDate -inf {timestamp_one_week_ago})

 // retrieve the snapshot id from d:{id}
 val snapshot_id = redis(hget {key_name} snapshot)

 // remove the hash (d:{id})
 redis(del key_name)

 // remove the hash entry from the set
 redis(srem d:BySnapshot:{snapshot_id} {key_name})

// clean the zset from expired keys
redis(zremrangebyscore d:ByInsertionDate -inf {timestamp_one_week_ago})
用法
从my_other_表中选择*,其中snapshot=1134将为:

{snapshot_id} = 1134
for key_name in redis(smembers d:BySnapshot:{snapshot_id})
  print(redis(hgetall {keyname}))
或者编写一个lua脚本,直接在redis端执行此操作。最后:

从my_other_表中选择*,其中id=2989将是:

{id} = 2989
print(redis(hgetall d:{id}))
进口
这部分很简单,只需阅读表格并遵循上面的模型即可。根据您的要求,您可能希望使用每小时/每天/每周的cron导入所有(或部分)数据。

快照是否随附而添加,旧快照是否永不更改,或者更新模式是什么?@JoachimIsaksson快照从不更改,只需一个TTL(如1周),之后数据就可以丢弃。然后(在任何方面我都不是专家,只是一个用户),我会使用
id
作为键为每个快照添加一个哈希。如果其余的数据从未被查询过,你可以简单地使用数据的JSON编码作为值。@CristianPorta我建议了一个数据模型,告诉我你的想法!
{snapshot_id} = 1134
for key_name in redis(smembers d:BySnapshot:{snapshot_id})
  print(redis(hgetall {keyname}))
{id} = 2989
print(redis(hgetall d:{id}))