hello,大家好,今天看到一篇redis相关的文章,我自己专门把代码搞到跑了一下,还是不错的,对于我们平时使用redis和mysql同步还是很不错的,工作中也是可以去使用的,因为这个确实会比我们去使用代码的方式去读取数据库再次插入到redis中,效率会高的多。
1.开发环境
开发环境:linxu
开发语言:C/C++ mysql
使用的库:hiredis
2.redis通信协议
(1).网络层:
客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。
客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。
(2).协议形式
*<参数数量> CR LF
$<参数 1 的字节数量> CR LF
<参数 1 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF
译注:命令本身也作为协议的其中一个参数来发送。
比如:
*3
$3
SET
$5
mykey
$7
myvalue
协议值:
"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"
3.脚本
别的我会面会介绍,我们先看看我们的数据库脚本,因为这个才是本次的重点。
SELECT CONCAT(
"*4\r\n",
'$', LENGTH(redis_cmd), '\r\n',
redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n',
redis_key, '\r\n',
'$', LENGTH(hkey), '\r\n',
hkey, '\r\n',
'$', LENGTH(hval), '\r\n',
hval, '\r'
)
FROM (
SELECT
'HSET' as redis_cmd,
'events_all_time' AS redis_key,
action AS hkey,
count AS hval
FROM events_all_time
) AS t
也许,有些人看到这个东西的时候是一脸不知所措的样子,没关系,接下来,我们一条条的来说。
(1).语句就是拼接数据库中的字段
select CONCAT(...) from (子查询) as t;
这个语句返回的值是拼接好的结果,也就是我们上面看到的协议参数。
(2)字段的意义参考通信协议。
例子:
|
| *4
$4
HSET
$15
events_all_time
$3
aaa
$4
这个就是执行完后的结果中的一条。
4.mysql->redis同步脚本
mysql_to_redis.sh
#!/bin/bash
MYSQL_DB="redis"
FLAG="-N -r"
SQLSHELL="events_to_redis.sql"
REDISAUTH="66666"
mysql -uroot -p ${MYSQL_DB} ${FLAG} < ${SQLSHELL} | redis-cli --pipe -a ${REDISAUTH}
来,一句一句看:
MYSQL_DB="redis" 代表数据库名称
FLAG="-N -r":参数
-N, –skip-column-names //不显示列信息
-r, –raw //写列的值而不转义转换
redis-cli –pipe:导入需要的redis Protocol数据格式
-a 是redis指定登陆密码的选项
5.代码
路径:https://github.com/IreanLau/redis-mysql
代码量很少,大家自行阅读,不同的,可以留言,一起交流学习一下。
6.同步自动化
代码中没有实现自动化同步redis和mysql之间的数据,我们需要用工具进行同步,这个就是crontab定时,可以定时对数据进行刷入。
关于crontab定时相关知识,我们下次一起学习,加油。
更多精彩文章交流学习,请关注公众号:CPP后台服务器开发