Oracle向redis数据迁移

将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

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

猜你喜欢

转载自blog.csdn.net/it_freshman/article/details/82852887