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
即可,结果如下图: