后写、直写和直读缓存

Redis 和其他数据库(SQL 或 NoSQL)之间的后写、直写和直读缓存。

rghibernate 配方使用 RedisGears 函数和 Hibernate 框架来实现后写、直写和直读缓存。

这些缓存策略允许应用程序简单地连接到 Redis 缓存层而不是底层数据库。每当应用程序更新缓存中的数据时,Redis 也会同步后端数据库中的数据。

底层数据库可以是像 MySQL 这样的 SQL 数据库,因此你需要提供一个 XML 文件,告诉 rghibernate 如何映射 Redis 和其他数据库之间的数据。

与 RGSync 的区别

RGSync:

  • 基于 Python 的配方
  • 可编程

rghibernate:

  • 基于 Java 的配方
  • 使用 Hibernate 框架
  • 可配置而非可编程

设置后写和直读

要设置后写缓存,首先构建一个 rghibernate JAR 并将其注册到 RedisGears。

然后,注册以下配置文件

  • 连接器 XML:告诉 Redis 如何连接到底层数据库。

  • 映射 XML:显示如何映射两个数据库之间的数据,例如将 Redis 哈希映射到 MySQL 表。

注册 rghibernate JAR

  1. 下载中心下载 rghibernate JAR。

  2. 将 JAR 上传到 Redis 节点。

  3. 使用 RedisGears 注册 rghibernate

    $ redis-cli -x RG.JEXECUTE com.redislabs.WriteBehind < {filepath}/rghibernate-0.1.1-jar-with-dependencies.jar
    

配置数据库连接

  1. 创建一个包含配置的连接器 XML 文件,用于将 Redis 连接到底层数据库。

  2. 将文件上传到 Redis 节点。

  3. 注册连接器配置

    > redis-cli -x RG.TRIGGER SYNC.REGISTERCONNECTOR mysql 1000 10 5 < src/test/resources/mysql_hibernate.cfg.xml 
    1) "OK"
    

配置数据映射

  1. 创建一个映射 XML 文件,用于定义 Redis 如何将数据映射到底层数据库。

  2. 将文件上传到 Redis 节点。

  3. 注册后写的映射配置

    > redis-cli -x RG.TRIGGER SYNC.REGISTERSOURCE StudentWrite mysql WriteBehind < src/test/resources/Student.hbm.xml 
    1) "OK"
    
  4. 为直读注册相同的映射配置

    > 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&amp;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.REGISTERCONNECTORSYNC.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 定义
评价此页面
返回顶部 ↑