Oracle向redis数据迁移-RESP

将Oracle一张配置表数据迁移至redis,来减少频繁的数据库查询带来的开销。


RESP协议
Redis的协议规范(Redis Protocol specification)
在Redis 2.0中后,新的统一请求协议的通用格式如下:

*<number of arguments> CR LF
$<number of bytes of argument 1> CR LF
<argument data> CR LF
...
$<number of bytes of argument N> CR LF
<argument data> CR LF

例:

*3
$3
SET
$5
mykey
$7
myvalue
  • *3表示有3个参数;
  • $3表示第一个参数长度为3
  • $5表示第二个参数长度为5
  • $7表示第三个参数长度为7

这个命令看起来就像字符串:"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"

Redis 大量数据插入
Redis大量数据插入
从Redis 2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。
它的命令格式如下:cat data.txt | redis-cli --pipe


实战
这里以oracle系统自带的表emp为例。

create table EMP
(
  empno    NUMBER(4),
  ename    VARCHAR2(10),
  job      VARCHAR2(9),
  mgr      NUMBER(4),
  hiredate DATE,
  sal      NUMBER(7,2),
  comm     NUMBER(7,2),
  deptno   NUMBER(2)
)

这里将所有emp的empno+ename+job信息迁移存放至redis,命令格式输入下:

hset emp $empno $empno:$ename:$job

根据resp协议,构造请求报文,sql如下:

SELECT 
 '*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\n'

FROM (
 SELECT
 'HSET' as redis_cmd,
 'emp' AS redis_key,
 empno AS hkey,
 empno || ':' || ename || ':'||job AS hval
 FROM emp
);

然后将查询出的结果导出,并上传至服务器db.txt.
在服务器执行命令:

cat data.txt | ./redis-cli  --pipe

会出现报错,报错内容如下:

All data transferred. Waiting for the last reply...
ERR Protocol error: invalid multibulk length
No replies for 30 seconds: exiting.
errors: 2, replies: 1

最终查阅资料,执行命令更改为:

echo -e "$(cat data.txt)" | redis-cli --pipe

即可,结果如下图:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值