MySQL到Redis-导入和建模
我正在考虑使用缓存一些用户数据快照,以加快对该数据的访问(原因之一是我的MySQL表存在锁争用),我正在寻找一种最好的方法,一步导入这样一个表(可能包含从几条记录到数百万条记录): 进入Redis键值存储 我可以将许多“快照”加载到Redis中,基本访问模式是(类似SQL的语法)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
从快照=?和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}))