后写、直写和直读缓存
Redis 和其他数据库(SQL 或 NoSQL)之间的后写、直写和直读缓存。
rghibernate 配方使用 RedisGears 函数和 Hibernate 框架来实现后写、直写和直读缓存。
这些缓存策略允许应用程序简单地连接到 Redis 缓存层而不是底层数据库。每当应用程序更新缓存中的数据时,Redis 也会同步后端数据库中的数据。
底层数据库可以是像 MySQL 这样的 SQL 数据库,因此你需要提供一个 XML 文件,告诉 rghibernate 如何映射 Redis 和其他数据库之间的数据。
与 RGSync 的区别
- 基于 Python 的配方
- 可编程
- 基于 Java 的配方
- 使用 Hibernate 框架
- 可配置而非可编程
设置后写和直读
要设置后写缓存,首先构建一个 rghibernate JAR 并将其注册到 RedisGears。
然后,注册以下配置文件
-
连接器 XML:告诉 Redis 如何连接到底层数据库。
-
映射 XML:显示如何映射两个数据库之间的数据,例如将 Redis 哈希映射到 MySQL 表。
注册 rghibernate JAR
-
从下载中心下载 rghibernate JAR。
-
将 JAR 上传到 Redis 节点。
-
使用 RedisGears 注册 rghibernate
$ redis-cli -x RG.JEXECUTE com.redislabs.WriteBehind < {filepath}/rghibernate-0.1.1-jar-with-dependencies.jar
配置数据库连接
-
创建一个包含配置的连接器 XML 文件,用于将 Redis 连接到底层数据库。
-
将文件上传到 Redis 节点。
-
注册连接器配置
> redis-cli -x RG.TRIGGER SYNC.REGISTERCONNECTOR mysql 1000 10 5 < src/test/resources/mysql_hibernate.cfg.xml 1) "OK"
配置数据映射
-
创建一个映射 XML 文件,用于定义 Redis 如何将数据映射到底层数据库。
-
将文件上传到 Redis 节点。
-
注册后写的映射配置
> redis-cli -x RG.TRIGGER SYNC.REGISTERSOURCE StudentWrite mysql WriteBehind < src/test/resources/Student.hbm.xml 1) "OK"
-
为直读注册相同的映射配置
> redis-cli -x RG.TRIGGER SYNC.REGISTERSOURCE StudentRead mysql ReadThrough 0 < src/test/resources/Student.hbm.xml 1) "OK"
示例配置
以下是一些用于连接到数据库和映射数据的示例配置文件。
连接器 XML
此配置文件包含底层 MySQL 数据库的连接详细信息
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">org.mariadb.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?allowPublicKeyRetrieval=true&useSSL=false</property>
<property name="connection.username">user</property>
<property name="connection.password">pass</property>
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">1</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">false</property>
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- dbcp connection pool configuration -->
<property name="hibernate.dbcp.initialSize">5</property>
<property name="hibernate.dbcp.maxTotal">20</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.dbcp.minIdle">5</property>
<property name="hibernate.dbcp.maxWaitMillis">-1</property>
</session-factory>
</hibernate-configuration>
映射 XML
以下 XML 将表示学生的 Redis 哈希映射到 MySQL 表
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-mapping
http://www.hibernate.org/xsd/hibernate-mapping/hibernate-mapping-4.0.xsd">
<class entity-name="Student" table="student">
<tuplizer entity-mode="dynamic-map" class="org.hibernate.tuple.entity.DynamicMapEntityTuplizer"/>
<id name="id" type="integer" length="50" column="id"/>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="email" column="email" type="string" not-null="true"/>
<property name="age" column="age" type="integer"/>
</class>
</hibernate-mapping>
命令
使用 RG.TRIGGER
运行 rghibernate 命令
redis-cli RG.TRIGGER SYNC.<COMMAND>
要将文件传递给像 SYNC.REGISTERCONNECTOR
或 SYNC.REGISTERSOURCE
这样的命令,请使用redis-cli -x
redis-cli -x RG.TRIGGER SYNC.{COMMAND} {arg1 arg2 ...} < {file}
命令列表
命令 | 描述 |
---|---|
SYNC.REGISTERCONNECTOR | 注册一个新的连接器 |
SYNC.UNREGISTERCONNECTOR | 注销一个连接器(不能附加源) |
SYNC.REGISTERSOURCE | 基于策略的额外配置 |
SYNC.UNREGISTERSOURCE | 注销一个源 |
SYNC.INFO SOURCES | 转储所有源 |
SYNC.INFO CONNECTORS | 转储所有连接器 |
SYNC.REGISTERCONNECTOR
$ redis-cli -x RG.TRIGGER SYNC.REGISTERCONNECTOR \
{connector name} {batch size} {timeout} {retry interval} \
< {connector xml}
名称 | 描述 |
---|---|
连接器名称 | 给你的连接器命名 |
批量大小 | 批量发送到后端的数据大小 |
超时 | 在此超时之后,即使未达到批量大小,也会将数据发送到后端 |
重试间隔 | 出错时的重试间隔 |
连接器 xml | 连接器的 Hibernate XML 定义 |
SYNC.REGISTERSOURCE
redis-cli -x RG.TRIGGER SYNC.REGISTERSOURCE \
{source name} {connector name} {policy} \
< {mapping xml}
名称 | 描述 |
---|---|
源名称 | 给你的源命名 |
连接器名称 | 将数据发送到的连接器 |
策略 | 后写/直写/直读 • 对于直写,额外参数是 WriteTimeout • 对于直读,额外参数是过期时间(0 表示永不过期) |
映射 xml | 映射的 Hibernate XML 定义 |