这篇博文是借鉴别人的,主要怕以后找不着了,自己只是照抄,转载自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库。