数据高效交互丨DolphinDB Redis 插件使用指南

DolphinDB 是一个高性能的分布式数据库。通过 Redis 插件,DolphinDB 用户可以轻松地与 Redis 数据库进行交互。用户不仅可以从 DolphinDB 向 Redis 发送数据,实现高速的数据写入操作;还可以从 Redis 读取数据,将实时数据流集成到 DolphinDB 中进行分析和处理。这种集成提供了一种强大的工具,用于构建高效且可扩展的实时数据处理和分析应用程序,以满足当今数据驱动决策环境中对速度和灵活性的严格要求。

本文主要介绍如何使用 DolphinDB 的 Redis 插件进行 Redis 数据库的数据写入和读取,并提供实际使用案例。本文中的代码需要运行在 DolphinDB Server 2.00.10 或更高版本以及对应插件上,且支持 Linux 和 Windows 系统。

1. Redis 数据库介绍

Redis 是一个开源的高性能键值数据库,以其快速的数据操作和丰富的数据结构支持而广受欢迎。基于内存运行的 Redis 具有极高的读写速度。Redis 通过持久化存储功能确保数据的安全性和可靠性。其灵活的数据结构支持包括字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)、哈希表(Hash)等,使其能够应用于从简单的缓存系统到复杂的实时数据处理系统的各种应用场景。

Redis 中的字符串可以被视为最简单的数据类型,是其他所有类型的基础。String 类型是二进制安全的,即 Redis 的字符串可以包含任何数据,比如图像或序列化对象的二进制数据。例如整数和浮点数在 Redis 内部以字符串形式存储,当使用命令如SET key 100时,虽然存储的是一个数值,实际上是将数值100转换成等效的字符串 "100" 并存储它。

2. 基本使用说明

2.1 安装与加载

Redis 插件目前可以在 2.00.10 版本及以后的 DolphinDB Server 通过插件市场进行安装。节点启动后,连接节点并在 GUI(或 VS Code、Web UI)等 DolphinDB 客户端中执行installPlugin函数,则可以下载与当前 server 版本适配的 Redis 插件文件,插件文件包括插件描述文件及插件的二进制文件。

installPlugin("redis")

在脚本中调用插件相关的接口前,需要先加载插件,在 GUI(或 VS Code、Web UI)等客户端中执行loadPlugin("Redis")即可完成加载。

2.2 基础接口使用说明

Redis 插件提供的主要功能包括:建立与 Redis 服务器的连接、对 Redis 数据库进行读取和写入操作、连接状态监控、操作结束后关闭连接,具体示例如下:

通过connect接口建立连接,得到连接句柄。

conn = redis::connect("<IPAddr>", 6379)

通过run接口执行 Redis 命令,如 "AUTH", "GET", "SET" 等。

// 使用 "GET" 命令读取键 "key" 的值
val = redis::run(conn, "GET", "key")

// 使用 "HGET" 命令从名称为 "id" 的哈希表中读取键 "key" 的值
val = redis::run(conn, "HGET", "id", "key")

此外,对于批量写入操作,Redis 插件还提供了batchSet、batchHashSet等高性能的批量写入接口进行优化。

通过getHandleStatus接口可以获得连接状态表。

status = redis::getHandleStatus()

返回结果如下,可以看到表中有 token、address、createdTime 三列。其中 token 是连接的标识,getHandle接口可以通过该 token 获取连接句柄;address 连接的 Redis server 的 "ip:port" 网络地址;createdTime 是该连接创建的时间,如下图:

操作结束后通过release接口关闭特定的连接。

redis::release(conn)

或者通过releaseAll接口关闭全部已建立的连接。

redis::releaseAll()

此外 Redis 插件还提供了getHandle接口用于获取特定连接句柄,因为通过redis::connect接口建立的连接并不会随着 DolphinDB 的会话结束而自动释放。

redis::getHandle(token)

其中参数 token 是通过getHandleStatus接口获取的连接的 id。

插件使用的详细内容请参考 Redis 插件文档。

2.3 数据类型转换

因为在 Redis 中存储的键和值实际上都是以字符串的形式保存的,所以 Redis 插件提供的run、batchSet、batchHashSet接口传入的键和值都是 DolphinDB 的 STRING 类型。如果使用其他类型的数据,需要调用 DolphinDB 的string函数先将其转为字符串类型再使用。

3. 案例演示

3.1 案例1

本小节以将行情插件实时订阅的行情数据实时写入 Redis 数据库为例,对 Redis 插件的使用进行说明,整体流程如下图:

通过 DolphinDB 的众多行情插件,您可以非常方便高效地将实时行情数据写入 DolphinDB 分布式数据库。本文不关注如何订阅实时行情到 DolphinDB 数据库,该部分可参考 MDL 行情插件 和 amdQuote 行情插件 等行情类插件教程。

通过submitJob提交一个 Redis 写入作业,每 500ms 执行一次redisjob自定义函数,将订阅的最新行情数据更新到 Redis 数据库。

def submitByHalfSecond(){
    do {
        redisjob()
        sleep(500)
    } while(true)
}
submitJob("submitByHalfSecond", "submitByHalfSecond", submitByHalfSecond)

函数redisjob中首先通过connect接口建立起到 Redis 数据库的连接,然后通过run接口执行 Redis AUTH 命令来登录。数据表 CFFEX_PRICE 和 CZCE_PRICE 由行情插件实时订阅写入,数据内容类似下图:

然后通过 SQL 语句context by id order by time_stamp limit -1过滤,获取行情数据表中每个 id 的最新一条行情数据,如下图:

获取到要更新的数据后,用saveHashDataToRedis自定义函数将最新数据写入 Redis 数据库,完成后调用release释放连接。

def redisjob(){
    conn=redis::connect(host, port)
    redis::run(conn, "AUTH", "password")
    go

    // 获取每个 id 对应的最新时间的行情数据
    cffex_data = select * from loadTable("dfs://CFFEX", "CFFEX_PRICE") context by id order by time_stamp limit -1
    czce_data = select * from loadTable("dfs://CZCE", "CZCE_PRICE") context by id order by time_stamp limit -1

    saveHashDataToRedis(conn, cffex_data)
    saveHashDataToRedis(conn, czce_data)

    redis::release(conn)
}

函数saveHashDataToRedis中使用了batchHashSet接口,批量高效地执行 Redis 的 HSET 操作。

接口batchHashSet的第二个参数是一个 String 类型数组,每一个元素作为 HSET 中的一个 key 对应 fieldData 表中的一行数据;第三个参数是一个每列都是 String 类型的表,每列列名作为 Redis HSET 中的 field,值作为 HSET 中的 value。

def saveHashDataToRedis(conn, tb){
    id = exec id from tb
    // 通过 string 函数将数据转为 string 类型
    data = select string(time_stamp) as time_stamp, exchange, string(last_price) as last_price,
        string(volume) as volume, string(bid_price1) as bid_price1, string(bid_volume1) as bid_volume1,
        string(bid_price2) as bid_price2, string(bid_volume2) as bid_volume2, string(bid_price3) as bid_price3,
        string(bid_volume3) as bid_volume3, string(bid_price4) as bid_price4, string(bid_volume4) as bid_volume4,
        string(bid_price5) as bid_price5, string(bid_volume5) as bid_volume5, string(ask_price1) as ask_price1,
        string(ask_volume1) as ask_volume1, string(ask_price2) as ask_price2, string(ask_volume2) as ask_volume2,
        string(ask_price3) as ask_price3, string(ask_volume3) as ask_volume3, string(ask_price4) as ask_price4,
        string(ask_volume4) as ask_volume4, string(ask_price5) as ask_price5, string(ask_volume5) as ask_volume5
        from tb

    redis::batchHashSet(conn, id, data)
}

之后可以通过 HGET 查看已写入的数据,例如查看 id 为 “id01” 哈希表的 ”time_stamp“ 字段的值:

redis::run(conn, "HGET", "id01", "time_stamp")

至此,已经成功将实时订阅的行情数据写入到 Redis 数据库中。

3.2 案例2

该案例展示了如何结合 DolphinDB 的流订阅功能,将流数据表订阅的数据实时写入 Redis 服务器中。

  1. 通过 DolphinDB 的streamTable函数创建流数据表,然后使用enableTableShareAndPersistence函数将该流数据表共享并持久化到磁盘上。
colName=["key", "value"]
colType=["string", "string"]
enableTableShareAndPersistence(table=streamTable(100:0, colName, colType), 
  tableName=`table1, cacheSize=10000, asynWrite=false)

2. 调用subscribeTable函数订阅流数据表,并通过自定义的myHandle函数来处理订阅数据,该函数调用batchSet接口将订阅的数据实时写入 Redis 数据库中。

def myHandle(conn, msg) {
	redis::batchSet(conn, msg[0], msg[1])
}
conn = redis::connect(host, port)
subscribeTable(tableName="table1", handler=myHandle{conn})

3. 插入数据到流数据表中,流数据表订阅到数据后会调用myHandle自定义函数。

n = 1000000
for(x in 0:n){
	insert into table1 values("key" + x, "value" + x)
}

4. 通过run接口执行 GET 命令将刚才写入 Redis 数据库的数据插入到内存表中,查看表中数据说明之前已经成功写入数据到 Redis 数据库中。

t = table(n:0, [`id, `val], [`string, `string])
for(x in 0:n){
	insert into t values("key" + x, redis::run(conn, "GET", "key" + x))
}

4. 总结

本文介绍了 DolphinDB Redis 插件,并通过具体的将订阅的实时行情数据写入 Redis 数据库的例子说明了插件的使用方法,为 DolphinDB 与 Redis 数据库数据交互提供了演示案例。

附录

常见问题

  • 如果重复执行loadPlugin加载插件,会抛出模块已经被使用的错误提示"The module [Redis] is already in use.",因为节点启动后,只允许加载一次 Redis 插件,即可在任意会话中调用该插件提供的函数。可以通过try-catch语句捕获这个错误,避免因为插件已加载而中断后续脚本代码的执行。
try{
    loadPlugin("./plugins/Redis/PluginRedis.txt")
} catch(ex) {
    print ex
}
  • 如果一个连接句柄在使用中报错,那么该连接不能再被使用,应该使用redis::release接口释放掉该出错的句柄,并使用redis::connect接口建立一个新的连接。如果继续使用之前的连接,会一直报同样的报错,这是使用的 hiredis 第三方库的限制:"Once an error is returned the context cannot be reused and you should set up a new connection."
  • 如果遇到"[Plugin::Redis] Redis reply error: NOAUTH Authentication required."报错,说明 Redis 服务器设置了密码,需要通过 AUTH 命令认证,脚本如下:
conn = redis::connect(host, port)
redis::run(conn, "AUTH", "password")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/788304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android13 设置左右分屏修改为单屏幕,应用分屏改为单屏

1.前言 android13中,系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去才是二级菜单这种。 效果如下 2.系统设置实现分析 它这里使用的是google新出的embedding activity, 相关的知识这里…

【福利】代码公开!咸鱼之王自动答题脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 微信或QQ打开咸鱼之王小程序&#xff0c;进入答题界面&#xff0c;运行main.py。期间不要动鼠标。 可自行更改代码来适配自己的需求~ 可以按照示例图片…

欧拉部署nginx

1.下载nginx 下载地址&#xff1a;https://nginx.org/en/download.html 选择稳定版本 下的镜像文件进行下载 2.解压Nginx包 cd /root/nginx tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.03.安装nginx相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl o…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

浏览器中js外挂脚本的执行方式

1、开发工具控制台交互执行 网页中按F12打开开发者工具&#xff0c;选择“控制台”&#xff0c;键入js脚本命令回车执行&#xff0c;适用于临时使用脚本逻辑简单的场景&#xff0c;实例如下&#xff1a; // 获取网页元素的文本脚本 var elem document.getElementById("…

开发个人Go-ChatGPT–6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由&#xff0c;OpenAI 的接口需要密钥才…

Zabbix Sia Zabbix 逻辑漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一个中等严重度的漏洞&#xff0c;影响Zabbix Web前端。这个漏洞允许未经身份验证的用户访问setup.php文件的某些步骤&#xff0c;这些步骤通常只对超级管理员开放。利用这个漏洞&#xff0c;攻击者可以通过跳过某些步骤来重新配置Zabbix前端&#xff0c…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…

Java面试八股之MySQL中int(10)和bigint(10)能存储读的数据大小一样吗

MySQL中int(10)和bigint(10)能存储读的数据大小一样吗 在MySQL中&#xff0c;int(10)和bigint(10)的数据存储能力并不相同&#xff0c;尽管括号内的数字&#xff08;如10&#xff09;看起来似乎暗示着某种关联&#xff0c;但实际上这个数字代表的是显示宽度&#xff0c;而不是…

基于信号量的生产者消费者模型

文章目录 信号量认识概念基于线程分析信号量信号量操作 循环队列下的生产者消费者模型理论认识代码部分 信号量 认识概念 信号量本质: 计数器 它也叫做公共资源 为了线程之间,进程间通信------>多个执行流看到的同一份资源---->多个资源都会并发访问这个资源(此时易出现…

Python OpenCV 教学取得视频资讯

这篇教学会介绍使用OpenCV&#xff0c;取得影像的长宽尺寸、以及读取影像中某些像素的颜色数值。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#xff1a;使用Anaco…

关于.NETCORE站点程序部署到nginx上无法访问静态文件和无法正确生成文件的问题解决过程。

我的netcore6项目&#xff0c;部署到IIS的时候&#xff0c;生成报告时&#xff0c;需要获取公司LOGO图片放到PDF报告文件中&#xff0c;这时候访问静态图片没有问题。 然后还有生成邀请二维码图片&#xff0c;这时候动态创建图片路径和图片也没有问题&#xff0c;可以在站点的…

14-58 剑和诗人32 - 使用矢量数据库增强 LLM 应用程序

GPT-4、Bloom、LaMDA 等大型语言模型 (LLM) 在生成类似人类的文本方面表现出了令人印象深刻的能力。然而,它们在事实准确性和推理能力等方面仍然面临限制。这是因为,虽然它们的基础是从大量文本数据中提取统计模式,但它们缺乏结构化的知识源来为其输出提供依据。 最近,我们…

Python:安装/Mac

之前一直陆陆续续有学python&#xff01;今天开始&#xff01;正式开肝&#xff01;&#xff01;&#xff01; 进入网站&#xff1a;可能会有点慢&#xff0c;多开几个网页 https://www.python.org 点击下载&#xff0c;然后进入新的页面&#xff0c;往下滑 来到File&#xff0…

成为编程大佬!!——数据结构与算法(1)——算法复杂度!!

前言&#xff1a;解决同一个程序问题可以通过多个算法解决&#xff0c;那么要怎样判断一个算法的优劣呢&#xff1f;&#x1f914; 算法复杂度 算法复杂度是对某个程序运行时的时空效率的粗略估算&#xff0c;常用来判断一个算法的好坏。 我们通过两个维度来看算法复杂度——…

c++ 多边形 xyz 数据 获取 中心点方法

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

leetcode--从中序与后序遍历序列构造二叉树

leeocode地址&#xff1a;从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder …

Oracle基础以及一些‘方言’(二)

1、Oracle的查询语法结构 Oracle 的单表查询的语法结构&#xff1a; SELECT 1 FROM 2 WHERE 3 GROUP BY 4 HAVING 5 ORDER BY 6 其每个关键词的功能与MySQL中的功能已知&#xff0c;不过分页查询的关键词 limit 并不在Oracle的语法结构中。伪列&#xff1a; 在 Oracle 的表的使…

资料分析笔记整理

提升技巧多做题、少动笔、多分析 资料分析认识 国考一般20题(24~28分钟) 统计材料的类型包括单纯的文字、表格、图形以及由这些元素组成的复合类型材料 文字性材料:(30~60秒) 多段落型文字材料(时间、关键词、结构) 孤立段落文字材料(时间、关键词、标点[。;]) 表…

Linux 利用命名空间创建一个自己的“容器“

Linux 利用命名空间创建一个自己的"容器" 前置条件 创建一个目录存放容器mkdir /myapp准备静态编译busybox&#xff0c;操作系统自带的往往是依赖动态库的(本文使用的debian apt install busybox-static) 开始 使用unshare起一个独立命名空间.# 进入后/myapp目录…