大数据项目离线数仓(全 )一(数据采集平台)

article/2025/9/20 8:14:09

搭建用户行为数据采集平台搭建业务数据采集平台搭建数据仓库系统制作可视化报表

本篇博客包括搭建用户行为数据采集平台、搭建业务数据采集平台

搭建数据仓库系统在大数据项目离线数仓(全 )二

制作可视化报表在大数据项目离线数仓(全 )三

目录

一、用户行为数据采集平台

1.1软件工具的安装配置

1.1.1工具

1.1.2软件

1.2平台搭建

1.2.1模拟数据生成

1.2.2消息通道

1.2.3测试

二、业务数据采集平台

2.1软件工具的安装配置

2.2平台搭建

2.2.1数据库搭建

2.2.2同步数据到hdfs

2.3测试

2.3.1生成数据

2.3.2执行数据生成jar包

2.3.3同步数据

2.3.4查看


一、用户行为数据采集平台

1.1软件工具的安装配置

1.1.1工具

1)虚拟机:VMware

2)系统:CentOS 7

3)连接工具:MobaXterm_Portable

MobaXterm_Portable的简单使用_一个人的牛牛的博客-CSDN博客_mobaxterm portable和installer区别

4)编码工具:IDEA

1.1.2软件

1)JDK:jdk-8u171-linux-x64

Linux系统CentOS7安装jdk_一个人的牛牛的博客-CSDN博客

2)hadoop:hadoop-3.1.3

hadoop3X HA安装部署_一个人的牛牛的博客-CSDN博客

hadoop配置LZO压缩_一个人的牛牛的博客-CSDN博客

3)zookeeper:zookeeper-3.4.5

zookeeper单机和集群(全分布)的安装过程_一个人的牛牛的博客-CSDN博客

4)kafka:kafka_2.11-2.4.1

kafka单机和集群(全分布)的安装部署过程_一个人的牛牛的博客-CSDN博客_kafka单机安装部署

5)flume:apache-flume-1.9.0-bin

​​​​​​Flume的安装与Flume监控端口数据官方案例_一个人的牛牛的博客-CSDN博客

1.2平台搭建

1.2.1模拟数据生成

模拟行为日志数据的生成-Java文档类资源-CSDN下载

注:jar包来源于尚硅谷,免费下载

1.修改application.properties

可以根据需求生成对应日期的用户行为日志,更改mock.date=

2.修改logback的生成路劲

#/applog/log是路劲
<property name="LOG_HOME" value="/root/project/offlineDW/applog/applog/log" />

 3.path.json

该文件用来配置访问路径,默认就可以了

1.2.2消息通道

1.通道搭建

 2.flume生产者配置

#主件命名
a1.sources = r1
a1.channels = c1#配置source
#1固定配置
a1.sources.r1.type = TAILDIR  
#2监控的文件夹
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /root/project/offlineDW/applog/applog/log/app.*
#3成功监控的信息
a1.sources.r1.positionFile = /root/project/offlineDW/flume/taildir_position.json
#4拦截器配置
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.zj.flume.interceptor.ETLInterceptor$Builder#配置channel
#1固定配置
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
#2kafka节点
a1.channels.c1.kafka.bootstrap.servers = hadoop03:9092
#3kafka的topic
a1.channels.c1.kafka.topic = topic_log
#4是否传输header
a1.channels.c1.parseAsFlumeEvent = false#绑定sink与channel和source与channel的关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

3.flume消费者配置

#组件
a1.sources=r1
a1.channels=c1
a1.sinks=k1#source
#固定配置
a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.r1.batchSize = 5000
a1.sources.r1.batchDurationMillis = 2000
#消费者机器
a1.sources.r1.kafka.bootstrap.servers = hadoop04:9092
#kafka的topic
a1.sources.r1.kafka.topics=topic_log
#flume拦截器
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type
a1.sources.r1.interceptors.i1.type = com.zj.flume.interceptor.TimeStampInterceptor$Builder#channe
#配置channe类型
a1.channels.c1.type = file
#配置checkpoint地址
a1.channels.c1.checkpointDir = /root/project/offlineDW/flume/checkpoint/behavior1
#data地址
a1.channels.c1.dataDirs = /root/project/offlineDW/flume/data/behavior1/
#最大文件大小
a1.channels.c1.maxFileSize = 2146435071
a1.channels.c1.capacity = 1000000
#控制回滚时间
a1.channels.c1.keep-alive = 6#sink
#sink类型:hdfs
a1.sinks.k1.type = hdfs
#地址
a1.sinks.k1.hdfs.path =/data/log/topic_log/%Y-%m-%d
#文件开头命名
a1.sinks.k1.hdfs.filePrefix = log-
#计算时间设置(一天)
a1.sinks.k1.hdfs.round = false
#生成新文件策略,10s,128M
a1.sinks.k1.hdfs.rollInterval = 10
a1.sinks.k1.hdfs.rollSize = 134217728
a1.sinks.k1.hdfs.rollCount = 0#控制输出文件是原生文件
#压缩格式
a1.sinks.k1.hdfs.fileType = CompressedStream
a1.sinks.k1.hdfs.codeC = lzop#拼接
a1.sources.r1.channels = c1
a1.sinks.k1.channels = c1

1.2.3测试

1.打开flume消费者

bin/flume-ng agent --conf-file conf/kafka-flume-hdfs.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/training/apache-flume-1.9.0-bin/log2.txt   2>&1 &

2.打开flume生产者

bin/flume-ng agent --conf-file conf/file-flume-kafka.conf -n a1 -Dflume.root.logger=INFO,LOGFILE >/training/apache-flume-1.9.0-bin/flume-log.txt 2>&1 &

3.生成日志

java -jar xxxx.jar

4.查看hdfs数据

http://hadoop02:9870/

有/data/log/topic_log这些内容说明通道打通了。

二、业务数据采集平台

2.1软件工具的安装配置

1)MySQL

Linux安装MySQL5.7(CentOS7)_一个人的牛牛的博客-CSDN博客

2)sqoop

sqoop的安装(sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz)_一个人的牛牛的博客-CSDN博客

#6.测试sqoop连接数据库
bin/sqoop list-databases --connect jdbc:mysql://hadoop01:3306/ --username root --password 123456

测试连接成功! 

3)hive

安装hive配置同步数据到MySQL(apache-hive-3.1.2-bin)_一个人的牛牛的博客-CSDN博客

 4)SQLyog

下载SQLyog安装(在Windows上),安装很简单!不做示范了。

链接:https://pan.baidu.com/s/1fQIIRr4hL7f6Jcjwx6ZVMw 
提取码:tdnb

2.2平台搭建

2.2.1数据库搭建

MySQL项目--电商平台--数据库搭建_一个人的牛牛的博客-CSDN博客

 1.下载模拟数据生成jar包

模拟数据生成写入到mysql-Java文档类资源-CSDN下载

2.把压缩包里的文件上传到Linux的相关目录(我的:/root/project/offlineDW/applog/dblog/)

3.根据需求修改application.properties相关配置

 4.运行jar包

java -jar gmall-mock-db.jar

5.启动SQLyog,连接到offgmall数据库

 6.查看offgmall数据库下的activity_order表内容,看create_time数据的日期是不是设置的日期

2.2.2同步数据到hdfs

1.同步工具

sqoop

2.同步类型

数据同步策略的类型包括:全量同步、增量同步、新增及变化同步、特殊情况

全量表:存储完整的数据。

增量表:存储新增加的数据。

新增及变化表:存储新增加的数据和变化的数据。

特殊表:只需要存储一次。

3.编写脚本同步数据到hdfs

注:

1)Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string。

2)APP=offgmall        :数据库名称

3)sqoop=/training/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/bin/sqoop        :sqoop地址

4)do_date=`date -d '-1 day' +%F`        :日期格式

5)hadoop jar /training/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar

com.hadoop.compression.lzo.DistributedLzoIndexer        :lzo压缩

6)/data/$APP/db/$1/$do_date        :hdfs文件存储位置

7)--username        :mysql用户名

8)--password        :mysql密码

9)--connect jdbc:mysql://hadoop01:3306/$APP        :连接mysql

脚本编写:

vi mysql_to_hdfs.sh

#! /bin/bashAPP=offgmall
sqoop=/training/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/bin/sqoopif [ -n "$2" ] ;thendo_date=$2
elsedo_date=`date -d '-1 day' +%F`
fiimport_data(){
$sqoop import \
--connect jdbc:mysql://hadoop01:3306/$APP \
--username offdb \
--password Zj_123456 \
--target-dir /data/$APP/db/$1/$do_date \
--delete-target-dir \
--query "$2 and  \$CONDITIONS" \
--num-mappers 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'hadoop jar /training/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /data/$APP/db/$1/$do_date
}import_order_info(){import_data order_info "selectid,final_total_amount,order_status,user_id,out_trade_no,create_time,operate_time,province_id,benefit_reduce_amount,original_total_amount,feight_feefrom order_infowhere (date_format(create_time,'%Y-%m-%d')='$do_date'or date_format(operate_time,'%Y-%m-%d')='$do_date')"
}import_coupon_use(){import_data coupon_use "selectid,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_timefrom coupon_usewhere (date_format(get_time,'%Y-%m-%d')='$do_date'or date_format(using_time,'%Y-%m-%d')='$do_date'or date_format(used_time,'%Y-%m-%d')='$do_date')"
}import_order_status_log(){import_data order_status_log "selectid,order_id,order_status,operate_timefrom order_status_logwhere date_format(operate_time,'%Y-%m-%d')='$do_date'"
}import_activity_order(){import_data activity_order "selectid,activity_id,order_id,create_timefrom activity_orderwhere date_format(create_time,'%Y-%m-%d')='$do_date'"
}import_user_info(){import_data "user_info" "selectid,name,birthday,gender,email,user_level,create_time,operate_timefrom user_infowhere (DATE_FORMAT(create_time,'%Y-%m-%d')='$do_date'or DATE_FORMAT(operate_time,'%Y-%m-%d')='$do_date')"
}import_order_detail(){import_data order_detail "selectod.id,order_id,user_id,sku_id,sku_name,order_price,sku_num,od.create_time,source_type,source_idfrom order_detail odjoin order_info oion od.order_id=oi.idwhere DATE_FORMAT(od.create_time,'%Y-%m-%d')='$do_date'"
}import_payment_info(){import_data "payment_info"  "selectid,out_trade_no,order_id,user_id,alipay_trade_no,total_amount,subject,payment_type,payment_timefrom payment_infowhere DATE_FORMAT(payment_time,'%Y-%m-%d')='$do_date'"
}import_comment_info(){import_data comment_info "selectid,user_id,sku_id,spu_id,order_id,appraise,comment_txt,create_timefrom comment_infowhere date_format(create_time,'%Y-%m-%d')='$do_date'"
}import_order_refund_info(){import_data order_refund_info "selectid,user_id,order_id,sku_id,refund_type,refund_num,refund_amount,refund_reason_type,create_timefrom order_refund_infowhere date_format(create_time,'%Y-%m-%d')='$do_date'"
}import_sku_info(){import_data sku_info "selectid,spu_id,price,sku_name,sku_desc,weight,tm_id,category3_id,create_timefrom sku_info where 1=1"
}import_base_category1(){import_data "base_category1" "selectid,namefrom base_category1 where 1=1"
}import_base_category2(){import_data "base_category2" "selectid,name,category1_idfrom base_category2 where 1=1"
}import_base_category3(){import_data "base_category3" "selectid,name,category2_idfrom base_category3 where 1=1"
}import_base_province(){import_data base_province "selectid,name,region_id,area_code,iso_codefrom base_provincewhere 1=1"
}import_base_region(){import_data base_region "selectid,region_namefrom base_regionwhere 1=1"
}import_base_trademark(){import_data base_trademark "selecttm_id,tm_namefrom base_trademarkwhere 1=1"
}import_spu_info(){import_data spu_info "selectid,spu_name,category3_id,tm_idfrom spu_infowhere 1=1"
}import_favor_info(){import_data favor_info "selectid,user_id,sku_id,spu_id,is_cancel,create_time,cancel_timefrom favor_infowhere 1=1"
}import_cart_info(){import_data cart_info "selectid,user_id,sku_id,cart_price,sku_num,sku_name,create_time,operate_time,is_ordered,order_time,source_type,source_idfrom cart_infowhere 1=1"
}import_coupon_info(){import_data coupon_info "selectid,coupon_name,coupon_type,condition_amount,condition_num,activity_id,benefit_amount,benefit_discount,create_time,range_type,spu_id,tm_id,category3_id,limit_num,operate_time,expire_timefrom coupon_infowhere 1=1"
}import_activity_info(){import_data activity_info "selectid,activity_name,activity_type,start_time,end_time,create_timefrom activity_infowhere 1=1"
}import_activity_rule(){import_data activity_rule "selectid,activity_id,condition_amount,condition_num,benefit_amount,benefit_discount,benefit_levelfrom activity_rulewhere 1=1"
}import_base_dic(){import_data base_dic "selectdic_code,dic_name,parent_code,create_time,operate_timefrom base_dicwhere 1=1"
}case $1 in"order_info")import_order_info
;;"base_category1")import_base_category1
;;"base_category2")import_base_category2
;;"base_category3")import_base_category3
;;"order_detail")import_order_detail
;;"sku_info")import_sku_info
;;"user_info")import_user_info
;;"payment_info")import_payment_info
;;"base_province")import_base_province
;;"base_region")import_base_region
;;"base_trademark")import_base_trademark
;;"activity_info")import_activity_info
;;"activity_order")import_activity_order
;;"cart_info")import_cart_info
;;"comment_info")import_comment_info
;;"coupon_info")import_coupon_info
;;"coupon_use")import_coupon_use
;;"favor_info")import_favor_info
;;"order_refund_info")import_order_refund_info
;;"order_status_log")import_order_status_log
;;"spu_info")import_spu_info
;;"activity_rule")import_activity_rule
;;"base_dic")import_base_dic
;;"first")import_base_category1import_base_category2import_base_category3import_order_infoimport_order_detailimport_sku_infoimport_user_infoimport_payment_infoimport_base_provinceimport_base_regionimport_base_trademarkimport_activity_infoimport_activity_orderimport_cart_infoimport_comment_infoimport_coupon_useimport_coupon_infoimport_favor_infoimport_order_refund_infoimport_order_status_logimport_spu_infoimport_activity_ruleimport_base_dic
;;
"all")import_base_category1import_base_category2import_base_category3import_order_infoimport_order_detailimport_sku_infoimport_user_infoimport_payment_infoimport_base_trademarkimport_activity_infoimport_activity_orderimport_cart_infoimport_comment_infoimport_coupon_useimport_coupon_infoimport_favor_infoimport_order_refund_infoimport_order_status_logimport_spu_infoimport_activity_ruleimport_base_dic
;;
esac

脚本的使用:

1)第一次同步数据:mysql_to_hdfs.sh first 2020-05-10        (同步2022-05-10的数据)

2)以后每天同步数据:mysql_to_hdfs.sh all 2022-05-10        (同步2022-05-10的数据)

2.3测试

2.3.1生成数据

(时间:2022-05-10)

vi application.properties

2.3.2执行数据生成jar包

java -jar gmall-mock-db.jar

2.3.3同步数据

1)mysql_to_hdfs.sh all

2)mysql_to_hdfs.sh first 2022-05-10

2.3.4查看

1)启动脚本同步成功后Linux的样式

 2)启动脚本同步成功8088样式

 3)启动脚本同步成功9870样式        (9870:hadoop3x        50070:hadoop2x)

 4)同步到hdfs的数据位置

 显示出2022-05-10有数据,有数据才有索引。

xxxx.lzo        lzo压缩文件

xxxx.index        索引文件

 显示出2022-05-12没有数据

MySQL 到 hdfs同步数据成功!!!

业务数据采集平台搭建完成!!!

本文参考于:

尚硅谷大数据项目

星形和雪花模型_维度建模的三种模型——星型模型、雪花模型、星座模型_浅野千奈美的博客-CSDN博客

若兰幽竹的博客_CSDN博客-Kettle,Spark,Hadoop领域博主


http://chatgpt.dhexx.cn/article/nDyHqUfd.shtml

相关文章

采集平台-大数据平台数据采集系统

随着社会的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的采集平台&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动态网页数…

4. 业务数据采集平台搭建

4. 业务数据采集平台搭建 业务数据采集模块Hive安装部署业务数据同步概述数据同步策略概述数据同步策略选择数据同步工具概述 DataX 数据同步工具Maxwell 数据同步工具全量表数据同步数据通道DataX 配置文件DataX 配置文件生成脚本生成文件生成全部配置文件脚本测试生成的 Data…

奇点云数据中台技术汇(二)| DataSimba系列之数据采集平台

继上期数据中台技术汇栏目发布DataSimba——企业级一站式大数据智能服务平台&#xff0c;本期介绍DataSimba的数据采集平台。 DataSimba采集平台属于DataSimba的数据计算及服务平台的一部分&#xff0c; 负责数据的导入&#xff0c; 从而支持上层的数据处理。 DataSimba的定…

六大主流大数据采集平台架构分析

日志收集的场景 DT时代&#xff0c;数以亿万计的服务器、移动终端、网络设备每天产生海量的日志。 中心化的日志处理方案有效地解决了在完整生命周期内对日志的消费需求&#xff0c;而日志从设备采集上云是始于足下的第一步。 随着大数据越来越被重视&#xff0c;数据采集的挑战…

简单谈谈Redis中的几种java客户端以及优缺点!

一、摘要 相对于其他的分布式中间件&#xff0c;Redis 支持的客户端种类非常繁多&#xff0c;涵盖更加全面&#xff0c;除了支持比较流行的 c、c、java、C#、php、Python 等语言以外&#xff0c;还支持 Objective-C、Swift、Node.js 等等&#xff0c;以下是来自于 Redis 支持的…

Redis介绍、安装、客户端

1. Redis介绍 1.1 什么是NoSql 为了解决高并发、高可用、高可扩展&#xff0c;大数据存储等一系列问题而产生的数据库解决方案&#xff0c;就是NoSql。NoSql&#xff0c;叫非关系型数据库&#xff0c;它的全名Not only sql。它不能替代关系型数据库&#xff0c;只能作为关…

redis安装+客户端

redis安装客户端 1.安装redi2.安装redis客户端 1.安装redi 1&#xff09;资源下载地址 Redis安装包&#xff1a;https://github.com/MicrosoftArchive/redis/releases 2&#xff09; 下载&#xff0c;解压安装包到相应的文件夹&#xff0c;任一盘符都可以。 接下来对文件夹中的…

Redisson--最好用的Redis客户端--介绍

原文网址&#xff1a;Redisson--最好用的Redis客户端--介绍_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Redisson这款最好用的Redis客户端。 官网 官网&#xff1a;Redisson: Redis Java client with features of In-Memory Data Grid git&#xff1a;https://github.co…

redis的客户端

关系型数据库存储在磁盘当中&#xff0c;非关系型数据库存储在内存中 Jedis 第一步&#xff1a;导入依赖包 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</vers…

【Redis】客户端RedisClient

0. 目录 1. 下载2. 运行 RedisClient3.1. 链接服务器 1. 下载 官网下载&#xff1a;https://github.com/caoxinyu/RedisClient 因为我已经安装了jdk或者jre&#xff0c;所以我只用jar包版本。 我用迅雷下载&#xff0c;比较快。当然你可以用我下载好的。 百度云盘&#xff1a;…

redis:客户端管理

机制 redis提供了一些操作客户端的命令&#xff0c;比如查询所有已连接到服务端的客户端数量&#xff0c;控制客户端的连接状态&#xff08;关闭或者挂起&#xff09;等。通过客户命令我们可以轻松实现对客户端的管理、控制。 redis服务器通过监听TCP端口的方式来接收客户端连…

windows下redis可视化客户端

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 redis的可视化客户端目前较流行的有三个&#xff1a;Redis Client ; Redis Desktop Manager ; Redis Studio. Redis Desktop Ma…

Redis(四) - Redis的Java客户端

文章目录 一、Redis的Java客户端二、Jedis客户端1. 快速入门&#xff08;1&#xff09;引入依赖&#xff08;2&#xff09;创建jedis对象&#xff0c;建立连接&#xff08;3&#xff09;测试&#xff0c;方法名与Redis命令一致&#xff08;4&#xff09;释放资源 2. Jedis连接池…

Redis可视化客户端汇总

因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli&#xff0c;以至于我们在使用的时候会比较麻烦&#xff0c;通常要输入一堆命令&#xff0c;而且命令行版的客户端看起来也不够直观&#xff0c;基于以上两个原因我们需要找一个可视化的 Redis 客户端&#xff0c;下面…

redis客户端连接工具RedisDesktop安装

redis客户端连接工具RedisDesktop安装手册: RedisDesktop官方下载地址&#xff1a; https://redisdesktop.com/download 但是需要付费 这里提供一个可以免费下载的地址&#xff1a;https://pan.baidu.com/s/1ExBlD79pfypnqAeP1sXybg 下载后解压如下&#xff1a; 安装此文件&…

Redis客户端 - RedisSerializer

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - RedisSerializer | CoderMast编程桅杆https://www.codermast.com/database/redis/redistemplate-redis-serializer.html 前景回顾 在上一篇中&#xff0c;我们实现了一个简单的案例&#xff0c;操作一个 St…

Redis(11)----Redis客户端

1&#xff0c;前言 Redis服务器是典型的一对多服务器&#xff1a;一个服务器可以与多个客户端建立网络连接&#xff0c;每个客户端可以向服务器发送命令请求&#xff0c;而服务器则接收并处理客户端发送的命令请求&#xff0c;并向客户端返回命令回复 通过使用由I/O多路复用技…

redis-客户端

redis-客户端 1、客户端属性 redis> CLIENT listaddr127.0.0.1:53428 fd6 name age1242 idle0 ... addr127.0.0.1:53469 fd7 name age4 idle4 ...typedef struct redisClient {// ...int fd;robj *name;int flags;sds querybuf;robj **argv;int argc;struct redisCommand …

Mac上好用的redis客户端推荐

推荐mac一个开源免费、好用的redis客户端&#xff1a;QuickRedis 它支持直连、哨兵、集群模式&#xff0c;并且UI是可以的&#xff0c;并且支持树形展示,同时支持json格式展示&#xff0c; 最基本的命令行模式也支持&#xff0c;总体来说界面简洁、功能完善&#xff0c;值得推…

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 Redis管理客户端&#xff0c;兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…