mysql->redis同步

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

mysql->redis同步_第1张图片

 

代码量很少,大家自行阅读,不同的,可以留言,一起交流学习一下。

6.同步自动化

代码中没有实现自动化同步redis和mysql之间的数据,我们需要用工具进行同步,这个就是crontab定时,可以定时对数据进行刷入。

关于crontab定时相关知识,我们下次一起学习,加油。

mysql->redis同步_第2张图片

 

更多精彩文章交流学习,请关注公众号:CPP后台服务器开发

你可能感兴趣的:(后台开发,Linux,C\C++,redis)