批量插入缓存数据到redis

批量插入缓存数据到redis

缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

如果数据量不大,在系统启动前直接灌入。比如写个php脚本或者shell脚本来完成。

我们这里看看redis有没有什么好办法?
redis有个pipe mode,可以根据redis协议的格式生成一个文件,然后导入。

假如mysql里有一张新闻表,其中有2个字段:news_idnews_title

我们根据redis协议构建字符串,比如这句话:set news101 news_title1 EX 200
拆分成redis格式就是(注意换行是\r\n):

*5 按空格拆分有几段
$3 代表set字符的长度
set
$7 代表"news101"的字符长度
news101
$11
news_title1
$2
EX
$3
200

我们把新闻表按照上面的格式组装一下:

SELECT CONCAT('*5','\r\n','$3','\r\n','set','\r\n','$',LENGTH(id)+4,'\r\n','news','id','\r\n','$',LENGTH(title),'\r\n',title,'\r\n','$2','\r\n','EX','\r\n','$3','\r\n','200','\r') from news
order by id

此查询结果,每一行就是一条符合redis协议的字符串,其中我们新闻id 拼接成”news”+id作为key,新闻标题作为value。
把查询结果导出为一个文件,比如all_news

然后利用在redis服务端执行:

cat all_news | redis-cli --pipe

这就是利用redis的pipe 执行了 set的操作。

另外的方法:
1、把上面的sql保存为news.sql
2、然后登录mysql客户端

mysql -h 192.168.88.88 -uroot -p123456 -D dbname --skip-column-names --raw < news.sql | redis-cli --pipe

猜你喜欢

转载自blog.csdn.net/github_26672553/article/details/81868960