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后台服务器开发

``` <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>priv.jesse</groupId> <artifactId>MusicMall</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>MusicMall</name> <description>shopping mall project</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--log4j 2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!--spring data jpa 数据持久化组件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--druid连接池 mybatis--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.3</version> </dependency> <!--aop 切面--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!--web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--html模板引擎 类似jsp--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!--热加载代码方便调试用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--测试框架--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!--打包插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>```如果代码的maven配置文件跟我的不太一致,我应该怎么修改
最新发布
03-20
从您提供的 Maven 配置文件来看,这是一份典型的 Spring Boot 项目的 `pom.xml` 文件。如果您需要调整配置以适应您的项目需求,可以参考以下几个步骤: --- ### **1. 修改依赖版本** - 如果某些依赖库的版本不符合您的项目要求,可以直接修改 `<version>` 标签的内容。 例如: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> <!-- 更改为最新稳定版 --> </dependency> ``` **注意**: 版本升级可能会导致兼容性问题,请确保新版本与现有依赖兼容。 --- ### **2. 添加缺失的依赖** 如果缺少某个功能模块的依赖(如 Redis、MongoDB 等),可以在 `<dependencies>` 中添加对应的 Maven 坐标。例如: ```xml <!-- 引入Redis支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 您可以根据实际需求查找并引入其他依赖项。 --- ### **3. 删除不必要的依赖** 如果有不需要的功能模块,可以从 `<dependencies>` 中移除相应的依赖块。例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 若不使用 AOP 功能,则直接删除该段即可。 --- ### **4. 调整 Parent 的版本信息** 当前使用的 Spring Boot 版本是 `1.5.8.RELEASE`,这是一个较旧的版本。建议升级到更高版本以获得更好的性能和支持。将 `<parent>` 区域更新为最新的 Spring Boot 版本号,例如: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> <!-- 使用更稳定的版本 --> <relativePath/> </parent> ``` **提示:** 升级父 POM 后,部分子依赖可能也需要同步更新版本或排除冲突。 --- ### **5. 插件配置优化** Spring Boot 提供了默认的插件管理工具 (`spring-boot-maven-plugin`)。若您有特殊构建需求,可以自定义插件设置。例如启用调试模式或指定目标路径等: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <!-- 允许单独运行进程 --> <mainClass>${start-class}</mainClass> </configuration> </plugin> </plugins> </build> ``` --- ### **6. 检查编码一致性** 确保所有相关的属性值统一设定,避免因字符集差异引发异常: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> ``` --- ### 总结 通过对以上几个方面的修改,可以让您的 `pom.xml` 更贴合自身业务场景的需求。当然,在更改前务必备份原始文件,并通过本地验证确认改动是否正确无误! --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值