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

 

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

6.同步自动化

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

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

 

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

graph TD subgraph "互联网" User[用户终端] end subgraph "核心网络层" CoreSwitch[核心交换机<br/>VLAN隔离+1Gbps带宽] end subgraph "高可用代理层" HAProxy1[HAProxy主节点<br/>192.168.1.10<br/>Keepalived MASTER] HAProxy2[HAProxy备节点<br/>192.168.1.11<br/>Keepalived BACKUP] VIP1[VIP: 192.168.1.100] end subgraph "Web服务层" Nginx1[Nginx节点1<br/>192.168.1.12] Nginx2[Nginx节点2<br/>192.168.1.13] end subgraph "高可用缓存层" RedisMaster[Redis主节点<br/>192.168.1.21] RedisSlave[Redis从节点<br/>192.168.1.22] Sentinel[Sentinel哨兵<br/>192.168.1.23] end subgraph "数据库存储层" MySQLMaster[MySQL主节点<br/>192.168.1.31] MySQLSlave[MySQL从节点<br/>192.168.1.32] VIP2[VIP: 192.168.1.200] end subgraph "附属服务层" BackupServer[备份服务器<br/>192.168.1.40<br/>rsync+crontab] MonitorServer[监控&Ansible服务器<br/>192.168.1.41<br/>Prometheus+Grafana+Ansible] LogServer[日志分析服务器<br/>192.168.1.42<br/>ELK Stack] end subgraph "管理网段(192.168.2.0/24)" AdminTerminal[运维管理终端<br/>192.168.2.100] end # 网络连接关系 User --> CoreSwitch AdminTerminal --> CoreSwitch # 代理层与核心交换机连接 CoreSwitch --> HAProxy1 CoreSwitch --> HAProxy2 HAProxy1 <--> HAProxy2 # Keepalived主备通信 HAProxy1 --> VIP1 HAProxy2 --> VIP1 # 代理层与Web层连接 VIP1 --> Nginx1 VIP1 --> Nginx2 # Web层与缓存层连接 Nginx1 --> RedisMaster Nginx1 --> RedisSlave Nginx2 --> RedisMaster Nginx2 --> RedisSlave Sentinel --> RedisMaster # 哨兵监控主从 Sentinel --> RedisSlave # 缓存层与数据库层连接 RedisMaster --> VIP2 RedisSlave --> VIP2 Nginx1 --> VIP2 Nginx2 --> VIP2 # 数据库层内部连接 MySQLMaster <--> MySQLSlave # 主从复制 MySQLMaster --> VIP2 MySQLSlave --> VIP2 # 附属服务与各层连接 BackupServer --> Nginx1 # 备份Web数据 BackupServer --> Nginx2 BackupServer --> RedisMaster # 备份缓存配置 BackupServer --> MySQLMaster # 备份数据库数据 MonitorServer --> CoreSwitch # 监控全架构 LogServer --> Nginx1 # 收集Web日志 LogServer --> Nginx2 LogServer --> RedisMaster # 收集缓存日志 LogServer --> MySQLMaster # 收集数据库日志 LogServer --> HAProxy1 # 收集代理层日志
最新发布
11-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值