官方文档:https://prestodb.io/docs/current/connector/redis.html
说明:
版本Redis 2.8.0+
不支持redis cluster
只支持Redis string 和 hash类型的 value,不支持 sets 和 zsets 类型的value
1.安装redis
mkdir /data/redis
cd /data/redis
mkdir conf pidfiles log data script
解压
cd /opt/redis
tar -xzvf redis-4.0.11.tar.gz
cd redis-4.0.11
make
make test
安装
make install PREFIX=/data/redis
配置
cd /data/redis/conf
vi redis.conf
文件内容如下:
# 后台运行服务
daemonize yes
# 服务pid保存位置
pidfile /data/redis/pidfiles/redis.pid
# 绑定服务ip (注意修改)
bind 192.168.6.12
# 服务端口
port 6379
# 开启防护模式
protected-mode yes
# 当前节点最大内存(根据数据量进行估算)
maxmemory 10gb
# 过期策略 (根据业务进行修改,如果数据能能丢就采用当前模式。详情参考下面含义)
maxmemory-policy noeviction
# TCP监听的最大连接数
tcp-backlog 32768
# 连接空闲超时时间(如果是长链接保持不变,如果短连接建议修改)
timeout 0
# tcp 心跳间隔
tcp-keepalive 30
# 日志级别
loglevel notice
# 日志位置
logfile /data/redis/log/redis.log
# 配置持久化目录
dir /data/redis/data
# 持久化rdb文件名称
dbfilename redis.rdb
# 持久化失败后,不允许执行写入操作
stop-writes-on-bgsave-error no
# 持久化条件(是否生成rdb持久化文件,一般采用自动备份和定时备份,save "" 表示关闭自动备份,定时备份通过定时任务触发bgsave完成)
# 下面不进行自动备份
#save ""
# 下面表示打开自动备份
save 900 1
save 300 10
save 60 3000
# aof持久化(aof持久化比较及时,但恢复慢,文件大。一般跟rdb一样都打开,除非定时任务触发备份)
appendonly yes
# 开启慢查询记录
slowlog-log-slower-than 10000
slowlog-max-len 128
# 配置客户端最大连接数
maxclients 15000
# 配置lua脚本最大执行时长
lua-time-limit 5000
# 优化存储编码
hash-max-ziplist-entries 512
hash-max-ziplist-value 2048
zset-max-ziplist-entries 512
zset-max-ziplist-value 512
set-max-intset-entries 512
启动
/data/redis/bin/redis-server /data/redis/conf/redis.conf 1>> /data/redis/log/redis.log 2>&1
测试
/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379
set foo bar
get foo
关闭
./redis-cli -h 192.168.6.12 -p 6379 shutdown 关闭
2.在presto中配置redis相关参数
vi etc/catalog/redis.properties
connector.name=redis redis.table-names=default.test,default.simple
redis.nodes=192.168.6.12:6379
# 需要查询的表要都要写在这里,而且需要在etc/redis目录下定义对应表的json文件,
#每次修改后需要重启presto生效
3.在presto中配置redis的table信息
表test
vi etc/redis/test.json
{
"tableName": "test",
"schemaName": "default",
"key": {
"dataFormat": "raw",
"fields": [
{
"name":"redis_key",
"type":"VARCHAR",
"hidden":"false"
}
]
},
"value": {
"dataFormat": "json",
"fields": [
{
"name":"row_number",
"mapping":"rowNumber",
"type":"BIGINT"
},
{
"name":"customer_key",
"mapping":"customerKey",
"type":"BIGINT"
},
{
"name":"name",
"mapping":"name",
"type":"VARCHAR"
}
]
}
}
表simple
vi etc/redis/simple.json
{
"tableName": "simple",
"schemaName": "default",
"key": {
"dataFormat": "raw",
"fields": [
{
"name":"redis_key",
"type":"VARCHAR",
"hidden":"false"
}
]
},
"value": {
"dataFormat": "raw",
"fields": [
{
"name":"redis_value",
"type":"VARCHAR"
}
]
}
}
4.写数据到redis中
/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379
在redis命令行下执行:
set key1 "{\"rowNumber\":1,\"customerKey\":1,\"name\":\"Customer#000000001\"}"
set key2 "{\"rowNumber\":3,\"customerKey\":3,\"name\":\"Customer#000000003\"}"
set key3 "{\"rowNumber\":5,\"customerKey\":5,\"name\":\"Customer#000000005\"}"
set key4 "{\"rowNumber\":7,\"customerKey\":7,\"name\":\"Customer#000000007\"}"
set key5 "{\"rowNumber\":9,\"customerKey\":9,\"name\":\"Customer#000000009\"}"
set key6 "{\"rowNumber\":9,\"customerKey\":19,\"name\":\"Customer#0000000019\"}"
5.查询数据
bin/launcher restart
bin/presto --server 192.168.6.12:8080 --catalog redis --schema default
6.遇到问题
定义了两张表,simple表两个字段,分别对应key和value;test表四个字段,需要把redis的value的json值解析成相应的字段值。查询simple表正常,查test表报错了,后来发现是有一条数据foo/bar,value值不是json,删掉这条数据后正常。
7、生成批量测试数据
用redis自带的debug命令生成测试数据
在redis-cli客户端下执行,生成1千万测试数据
debug populate 10000000
#debug创建的测试数据内容为:key:#->value:#,比如key:123->value:123
查看当前数据量:
/data/redis/bin/redis-cli -c -h 192.168.6.12 -p 6379
dbsize
8、在presto中查询
/opt/presto/presto-server-0.215/bin/presto --server 192.168.6.12:8080 --catalog redis --schema default
查看表
show tables;
不支持删表
drop table test;
统计表数据量,1千万的数据量,统计用时3分钟多
select count(*) from simple;
查询全部数据
select * from simple;
控制台会直接输出一部分数据,按回车会显示更多数据,在web页面可以看到查询进度;过了一段时间发现报错了
com.facebook.presto.spi.PrestoException: Query 20190118_094926_00012_4dxq5 has not been accessed since 2019-01-18T17:49:26.869+08:00: currentTime 2019-01-18T17:54:27.170+08:00
带where条件查询,应该遍历所有的数据,速度很慢
select * from simple where redis_key='key:6019788';
总结:
Presto和Redis结合使用效果并不理想,所以不建议这样使用。