使用管道pipe,从mysql同步数据到redis中去的两种方式(转载)

这篇博文是借鉴别人的,主要怕以后找不着了,自己只是照抄,转载自http://www.pianshen.com/article/264026969/

项目组的后台数据库出了些问题,导致Mysql和Redis缓存之间出现了数据不一致,因此需要同步一下他俩。于是乎我从网上找了这篇文章,这种方法只是短期同步,并不是实时地进行同步的方式。

首先,熟悉下管道的格式

 1 *4 #表示有4个参数
 2 $4 #表示“参数”有三个字节("HSET"字符串为4个字节)
 3 hset #redis的设置命令
 4 $8 # key有 8个字节
 5 myTopic #key对应的值
 6 $6 #field对应的长度
 7 client.id #field对应的值
 8 $12 # value的长度
 9 hkid #value的值
10   # 一条语句结束
11 每行默认以 \r\n 结尾

然后,编写Sql语句拼成要执行的Redis命令

1 select
2  'HSET' AS redis_cmd,  CONCAT('topic:',topic_name) AS redis_key,
3  'client.id' AS hkey1, client_id  AS hval1
4 FROM topic
5 union
6 SELECT
7  'HSET' AS redis_cmd,  CONCAT('topic:',topic_name) AS redis_key,
8  'zk.host' AS hkey1,  zk_host AS hval1
9 FROM topic

每一行就是一个完整的redis命令;

接着,编写mysql_to_redis.sql文件

 1 SELECT CONCAT(
 2   "*4\r\n",
 3   '$', LENGTH(t.redis_cmd), '\r\n',
 4   t.redis_cmd, '\r\n',
 5   '$', LENGTH(t.redis_key), '\r\n',
 6    t.redis_key, '\r\n',
 7   '$', LENGTH(t.hkey1), '\r\n',
 8    t.hkey1, '\r\n',
 9   '$', LENGTH(t.hval1), '\r\n',
10    t.hval1, '\r'
11 ) as redissql
12 FROM (
13 select
14  'HSET' AS redis_cmd,  CONCAT('topic:',topic_name) AS redis_key,
15  'client.id' AS hkey1, client_id  AS hval1
16 FROM topic
17 union
18 SELECT
19  'HSET' AS redis_cmd,  CONCAT('topic:',topic_name) AS redis_key,
20  'zk.host' AS hkey1,  zk_host AS hval1
21 FROM topic
22 ) AS  t

 最后,执行命令

1 mysql –h127.0.0.1 -uroot -pzhy123456 -Drui --skip-column-names --raw </usr/local/rui/shell/mysql_to_redis.sql |redis-cli -h 127.0.0.1 -p 6379 --pipe

-D 后面跟上Mysql数据库名称,redis-cli加-n,后边可以跟Redis库。

猜你喜欢

转载自www.cnblogs.com/lcmichelle/p/10989184.html