写回缓存
Redis 与其他数据库(SQL 或 NoSQL)之间的写回和写穿缓存。
写回是一种缓存策略,其中缓存层本身连接到后端数据库。这意味着您的应用程序只需要连接到缓存层,然后缓存会根据需要从后端数据库读取或更新数据。Redis 当前在Redis Enterprise 版软件中支持写回缓存。
这些缓存模式的工作原理如下
- 您的应用程序使用缓存进行读写操作。
- 缓存将任何更改的数据异步同步到后端数据库。
安装写回范例
写回范例包含两种类型的依赖项
- 连接后端数据库的驱动程序
- 用于 RedisGears 函数的 Python 库
在大多数情况下,这些依赖项都可以在函数上传到 RedisGears 之前进行配置。但是,在某些情况下,例如使用 Oracle 驱动程序时,需要在主机上具有驱动程序的 root 访问权限。
安装 Oracle 驱动程序(可选)
如果您想使用 Oracle 数据库进行写回操作
- 下载 Oracle 驱动程序.
- 在集群中的每个 RS 节点上,按照 Oracle 驱动程序下载页面上的安装说明进行操作。
导入依赖项
-
安装 Python 3。
-
要安装 gears-cli,请运行
pip install gears-cli
-
下载 rgsync 离线包。
-
导入依赖项
# gears-cli import-requirements \ --host HOST [ --port PORT ] --password PASSWORD \ --requirements-path rgsync-99.99.99.linux-bionic-x64.zip
注意您可以更高效地只导入您需要的依赖项,但始终需要 rgsync,并且可以根据您的后端数据库将其与这些包中的一个或多个结合使用
- redisgears-requirement-v1-snowflake-sqlalchemy-linux-<os>-x64.zip
- redisgears-requirement-v1-PyMySQL-linux-<os>-x64.zip
- redisgears-requirement-v1-cx-Oracle-linux-<os>-x64.zip
- redisgears-requirement-v1-cassandra-driver-linux-<os>-x64.zip
此列表在较新版本中可能有所不同或更广泛。模块包中的
module.json
文件列出了模块的依赖项。 -
从连接到数据库的节点或客户端的 CLI 中,使用以下命令检查依赖项是否成功导入
redis-cli RG.PYDUMPREQS
要从客户端连接到数据库,请运行
redis-cli -h <FQDN_of_node> -p <host> [-a <password>]
此命令返回所有可用依赖项的列表。
注册函数
以下是一个 RedisGears 范例,展示了如何使用写回模式将数据从 Redis 哈希映射到 MySQL 表。
此范例将所有具有以下前缀的 Redis 哈希映射到person:<id>
persons
,其中 <id>
是主键并映射到 person_id
列。类似地,它将所有具有以下前缀的哈希映射到car:<id>
cars
表。
from rgsync import RGWriteBehind
from rgsync.Connectors import MySqlConnector, MySqlConnection
'''
Create MySQL connection object
'''
connection = MySqlConnection('demouser', 'Password123!', 'localhost:3306/test')
'''
Create MySQL persons connector
persons - MySQL table to put the data
person_id - primary key
'''
personConnector = MySqlConnector(connection, 'persons', 'person_id')
personsMappings = {
'first_name':'first',
'last_name':'last',
'age':'age'
}
RGWriteBehind(GB, keysPrefix='person', mappings=personsMappings, connector=personConnector, name='PersonsWriteBehind', version='99.99.99')
'''
Create MySQL car connector
cars - MySQL table to put the data
car_id - primary key
'''
carConnector = MySqlConnector(connection, 'cars', 'car_id')
carsMappings = {
'id':'id',
'color':'color'
}
RGWriteBehind(GB, keysPrefix='cars', mappings=carsMappings, connector=carConnector, name='CarsWriteBehind', version='99.99.99')
访问 rgsync 网站以获取数据库和映射的复制选项和配置选项。
-
根据您的具体需求创建一个包含配置映射的 Python 文件。
-
使用您的自定义文件运行
gears-cli
gears-cli run --host <host> --port <post> --password <password> <yourfile>.py
使用 RedisGears 进行写回缓存
RGSync 是一个 RedisGears 范例,它使用写回模式将 Redis 数据结构同步到后端数据存储(目前支持 Oracle、MySQL、Cassandra 和 Snowflake)。
以下是如何使用 RGSync
范例针对 MySQL 创建一个写回函数。此函数将同步 Redis 哈希中的一组字段到 MySQL 行中的列。Redis 哈希的键名必须采用 {name}:{id}
的形式,其中 id
是我们希望保持同步的行的主键。例如,假设我们的哈希如下所示
redis.cloud:6379> HSET person:5 first_name Marek last_name Michalski age 27
(integer) 2
此哈希中的数据将对应于 ID 为 5 的行。但我们需要定义从哈希字段到列的映射。在我们的函数中,我们使用 Python 字典来完成此操作
personsMappings = {
'first_name':'first',
'last_name':'last',
'age':'age'
}
这意味着我们的哈希中的 last_name
字段应与我们行中的 'last' 字段同步。现在,我们可以编写 RedisGears 函数了。
首先,加载必要的库并连接到 MySQL
from rgsync import RGWriteBehind
from rgsync.Connectors import MySqlConnector, MySqlConnection
connection = MySqlConnection('myapplication', 'Password123!', 'localhost:3306/test')
接下来,创建一个连接器对象,指定表名和存储主键的列名
personConnector = MySqlConnector(mySqlConnection, 'persons', 'id')
之后,定义您的字段-列映射
personsMappings = {
'first_name':'first',
'last_name':'last',
'age':'age'
}
最后,使用这些已初始化的对象创建一个 RGWRiteBehind
对象
RGWriteBehind(GB,
name='PersonsWriteBehind',
version='1',
connector=personsConnector,
keysPrefix='person',
mappings=personsMappings)
请注意,您可以使用 version
参数对函数注册进行版本控制,因为具有相同 name
的较新版本将替换旧版本。
如果您已将所有这些代码放入一个文件 (example.py
) 中,那么您可以使用 gears-cli
工具将其加载到您的 Redis 部署中
gears-cli --host <host>
--port <post>
--password <password>
example.py
REQUIREMENTS rgsync
密钥管理
您可能不希望将数据库凭据存储在 RedisGears 函数中。为避免这种情况,您可以将这些凭据作为模块参数传递,然后在函数中引用它们。
以下代码显示了在创建后端数据库连接时如何引用这些凭据。
def User():
return configGet('MySqlUser')
def Password():
return configGet('MySqlPassword')
def DB():
return configGet('MySqlDB')
connection = MySqlConnection(User, Password, DB)
请注意,对于每个凭据,我们定义一个返回指定模块参数的 Python 函数。然后在实例化 MySqlConnection
时提供每个函数引用。
此代码引用了三个参数:MySqlUser
、MySqlPassword
和 MySqlDB
。在 Redis Enterprise 中,您可以使用 rladmin
工具设置这些参数。设置这些参数的命令格式如下
rladmin tune db [DB-NAME] module_name rg module_config_params "[PARAM-NAME] [PARAM-VALUE]"
要在名为 "user-api" 的数据库上将 MySqlPassword
参数设置为 "Password123!",您可以运行以下 rladmin
命令
rladmin tune db user-api module_name rg module_config_params "MySqlPassword Password123!"
连接成功建立后,RedisGears 将不会尝试重新连接,直到发生断开连接。这意味着存储密钥的参数更新不会立即生效,但会在所有后续连接尝试中使用。