Maven 项目集成 Elasticsearch 和 Redis

这篇具有很好参考价值的文章主要介绍了Maven 项目集成 Elasticsearch 和 Redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


这是一个普通 Maven 项目,不是 Spring 或 SpringBoot 项目。

下面都用到了这个工具类:

package com.gtcom.search.util;

import com.gtcom.search.exception.ExceptionEnum;
import com.gtcom.search.exception.SearchException;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.Properties;

/**
 * 配置文件加载工具类
 *
 * @author wangbo
 * @date 2022/2/28
 */
@Slf4j
public class LoadUtils {

    private LoadUtils() {
        throw new IllegalStateException("Utility class");
    }

    private static final String APPLICATION_PREFIX = "application-";

    /**
     * 获取运行时配置
     */
    public static Properties getProperties() {
        //只能读取到命令行的启动参数:-Dspring.profiles.active=xxx
        //读取不到配置文件中的配置项:spring.profiles.active=xxx
        String active = System.getProperty("spring.profiles.active");
        if (Objects.isNull(active)) {
            active = "dev";
        }
        log.info("current runtime environment active = [{}]", active);
        Properties props = new Properties();
        try {
        	//尝试加载properties文件
            InputStream resourceAsStream = LoadUtils.class.getClassLoader().getResourceAsStream(File.separator + APPLICATION_PREFIX + active + ".properties");
            if (Objects.nonNull(resourceAsStream)) {
                props.load(resourceAsStream);
                return props;
            }
            //尝试加载yml文件
            resourceAsStream = LoadUtils.class.getClassLoader().getResourceAsStream(File.separator + APPLICATION_PREFIX + active + ".yml");
            if (Objects.nonNull(resourceAsStream)) {
                props.load(new InputStreamReader(resourceAsStream, StandardCharsets.UTF_8));
                return props;
            }
        } catch (IOException e) {
            log.error("load application config file exception", e);
            throw new SearchException(ExceptionEnum.CONFIG_LOAD_EXCEPTION);
        }
        log.error("not loaded into the application config file");
        throw new SearchException(ExceptionEnum.CONFIG_LOAD_EXCEPTION);
    }
}

这个工具类能读取 properties 和 yml 格式的配置文件,环境指定必须使用命令行参数的形式,否则加载不到。

1. 集成 Elasticsearch

1.1. 依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

1.2. 配置

1.2.1. 配置文件

properties

#ES新闻集群
elasticsearch.news.hosts=10.1.2.11:9200,10.1.2.12:9200,10.1.2.13:9200
elasticsearch.news.username=admin
elasticsearch.news.password=test
#ES社交集群
elasticsearch.social.hosts=10.1.2.14:9200,10.1.2.15:9200,10.1.2.16:9200
elasticsearch.social.username=admin
elasticsearch.social.password=test

yml:

#ES新闻集群
elasticsearch.news.hosts: 10.1.2.11:9200,10.1.2.12:9200,10.1.2.13:9200
elasticsearch.news.username: admin
elasticsearch.news.password: test
#ES社交集群
elasticsearch.social.hosts: 10.1.2.14:9200,10.1.2.15:9200,10.1.2.16:9200
elasticsearch.social.username: admin
elasticsearch.social.password: test
1.2.2. 配置类
package com.gtcom.search.config;

import com.gtcom.search.constant.Separators;
import com.gtcom.search.util.LoadUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

import java.util.Properties;
import java.util.concurrent.TimeUnit;

/**
 * Elastic配置
 *
 * @author wangbo
 * @date 2021/12/7
 */
@Slf4j
public class ElasticConfig {

    private ElasticConfig() {
        throw new IllegalStateException("Utility class");
    }

    private static final RestHighLevelClient ES_NEWS_CLIENT;

    private static final RestHighLevelClient ES_SOCIAL_CLIENT;

    static {
        Properties properties = LoadUtils.getProperties();
        //初始化客户端
        String newsHosts = properties.getProperty("elasticsearch.news.hosts");
        String newsUserName = properties.getProperty("elasticsearch.news.username");
        String newsPassword = properties.getProperty("elasticsearch.news.password");
        ES_NEWS_CLIENT = init(newsHosts, newsUserName, newsPassword);

        String socialHosts = properties.getProperty("elasticsearch.social.hosts");
        String socialUserName = properties.getProperty("elasticsearch.social.username");
        String socialPassword = properties.getProperty("elasticsearch.social.password");
        ES_SOCIAL_CLIENT = init(socialHosts, socialUserName, socialPassword);
    }

    /**
     * 初始化ES集群客户端
     *
     * @param hosts    服务地址
     * @param username 用户名称
     * @param password 用户密码
     * @return ES集群客户端
     */
    private static RestHighLevelClient init(String hosts, String username, String password) {
        String[] hostArray = hosts.split(Separators.COMMA);
        HttpHost[] httpHosts = new HttpHost[hostArray.length];
        for (int i = 0; i < hostArray.length; i++) {
            httpHosts[i] = HttpHost.create(hostArray[i]);
        }
        RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);
        //设置超时时间
        restClientBuilder.setRequestConfigCallback(
                builder -> builder.setConnectTimeout(5000).setSocketTimeout(60000)
        );
        //配置身份验证和KeepAlive
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        restClientBuilder.setHttpClientConfigCallback(
                httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
                        .setKeepAliveStrategy((response, context) -> TimeUnit.MINUTES.toMillis(3))
        );
        return new RestHighLevelClient(restClientBuilder);
    }

    /**
     * 获取ES新闻客户端
     */
    public static RestHighLevelClient getEsNewsClient() {
        return ES_NEWS_CLIENT;
    }

    /**
     * 获取ES社交客户端
     */
    public static RestHighLevelClient getEsSocialClient() {
        return ES_SOCIAL_CLIENT;
    }
}

1.3. 使用

下面用新闻客户端示例,社交客户端使用一样:

//查询条数
CountResponse countResponse;
try {
    countResponse = ElasticConfig.getEsNewsClient().count(countRequest, RequestOptions.DEFAULT);
} catch (Exception e) {
    log.error("查询【新闻条数】发生异常", e);
    throw new SearchException(ExceptionEnum.ELASTIC_SEARCH_EXCEPTION);
}
//查询数据
SearchResponse searchResponse;
try {
    searchResponse = ElasticConfig.getEsNewsClient().search(searchRequest, RequestOptions.DEFAULT);
} catch (Exception e) {
    log.error("查询【新闻数据】发生异常", e);
    throw new SearchException(ExceptionEnum.ELASTIC_SEARCH_EXCEPTION);
}

2. 集成 Redis

2.1. 依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2.2. 配置

2.2.1. 配置文件

这里支持两种配置方式:单机和哨兵。

2.2.1.1. 单机配置

单机版 properties:

#Redis配置:单机stand-alone/哨兵sentinel
redis.config.mode=stand-alone
redis.stand-alone.hosts=192.168.10.11
redis.stand-alone.port=6379

单机版 yml:

#Redis配置:单机stand-alone/哨兵sentinel
redis.config.mode: stand-alone
redis.stand-alone.hosts: 192.168.10.11
redis.stand-alone.port: 6379
2.2.1.2. 哨兵配置

哨兵版 properties:

#Redis配置:单机stand-alone/哨兵sentinel
redis.config.mode=sentinel
redis.sentinel.password=12345
redis.sentinel.master=mymaster
redis.sentinel.nodes=10.6.22.14:26380,10.6.22.14:26381,10.6.22.14:26382

哨兵版 yml:

#Redis配置:单机stand-alone/哨兵sentinel
redis.config.mode: sentinel
redis.sentinel.password: 12345
redis.sentinel.master: mymaster
redis.sentinel.nodes: 10.6.10.11:26380,10.6.10.11:26381,10.6.10.11:26382
2.2.2. 配置类
package com.gtcom.search.config;

import com.gtcom.search.exception.ExceptionEnum;
import com.gtcom.search.exception.SearchException;
import com.gtcom.search.util.LoadUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;

/**
 * Redis配置
 *
 * @author wangbo
 * @date 2022/1/24
 */
@Slf4j
public class RedisConfig {

    private RedisConfig() {
        throw new IllegalStateException("Utility class");
    }

    private static final JedisPool JEDIS_POOL;

    private static final JedisSentinelPool JEDIS_SENTINEL_POOL;

    private static final String redisConfigMode;

    static {
        //临时变量
        JedisPool jedisPool = null;
        JedisSentinelPool jedisSentinelPool = null;

        Properties properties = LoadUtils.getProperties();
        //Redis配置模式:单机stand-alone/哨兵sentinel
        redisConfigMode = properties.getProperty("redis.config.mode");
        if ("stand-alone".equals(redisConfigMode)) {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setTestOnBorrow(true);
            String hosts = properties.getProperty("redis.stand-alone.hosts");
            int port = Integer.parseInt(properties.getProperty("redis.stand-alone.port"));
            //有密码和没密码不同
            String password = properties.getProperty("redis.stand-alone.password");
            if (StringUtils.isBlank(password)) {
                jedisPool = new JedisPool(jedisPoolConfig, hosts, port);
            } else {
                jedisPool = new JedisPool(jedisPoolConfig, hosts, port, 5000, password);
            }
        } else if ("sentinel".equals(redisConfigMode)) {
            String masterName = properties.getProperty("redis.sentinel.master");
            String nodes = properties.getProperty("redis.sentinel.nodes");
            String[] split = nodes.split(",");
            HashSet<String> sentinels = new HashSet<>(Arrays.asList(split));
            String password = properties.getProperty("redis.sentinel.password");
            jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, password);
        } else {
            log.error("redis config mode error, mode = {}", redisConfigMode);
            throw new SearchException(ExceptionEnum.CONFIG_LOAD_EXCEPTION);
        }

        JEDIS_POOL = jedisPool;
        JEDIS_SENTINEL_POOL = jedisSentinelPool;
    }

    /**
     * 获取Jedis连接池
     */
    public static Jedis getJedis() {
        if ("stand-alone".equals(redisConfigMode)) {
            return JEDIS_POOL.getResource();
        } else if ("sentinel".equals(redisConfigMode)) {
            return JEDIS_SENTINEL_POOL.getResource();
        }
        return null;
    }
}

2.3. 使用

就是 Jedis 的使用方法,下面简单示例:文章来源地址https://www.toymoban.com/news/detail-406917.html

/**
 * 从Redis获取索引列表
 *
 * @param redisKey redis key
 * @return 索引列表
 */
public static List<String> getIndexListFromRedis(String redisKey) {
    try (Jedis jedis = RedisConfig.getJedis()) {
        assert jedis != null;
        String indexListStr = jedis.get(redisKey);
        if (StringUtils.isBlank(indexListStr)) {
            log.warn("从Redis查询索引列表为空,redisKey = {}", redisKey);
            return Collections.emptyList();
        }
        return JSON.parseArray(indexListStr).toJavaList(String.class);
    } catch (Exception e) {
        log.error("从Redis查询索引列表异常,redisKey = {}", redisKey, e);
        return Collections.emptyList();
    }
}

到了这里,关于Maven 项目集成 Elasticsearch 和 Redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven下载及安装,集成eclipse中,配置环境变量,创建maven项目等

    解压 配置: 本地仓库的位置: 阿里云仓库位置: 配置Maven的jdk版本;我用的是jdk1.8版本 检测是否安装好: Finish后就好了。

    2024年01月23日
    浏览(53)
  • 构建一个最新版本 Maven 项目

    截止 2024 年 1 月 13 日,Apache 官网上 Maven 的 最新安全版本 为 3.9.6, 下载、安装及配置方法 见之前的博客:点此进入 注意 :官网提示 Maven 4.x 目前正在开发中,对于生产使用来说是不安全的。 IntelliJ IDEA 版本 :2022.1.3 JDK 版本 :17 和 21,下载和切换方法点此进入 Maven 版本

    2024年02月02日
    浏览(50)
  • SpringBoot项目集成ElasticSearch服务

    本文已收录于专栏 《中间件合集》   Spring boot的版本是: 2.3.12   ElasticSearch的版本是:7.6.2   在我们的项目中经常会遇到对于字符串的一些操作,例如对于字符串的分词,通过一个词去查找对应的原文(全文搜索)。那可能有人就会问了,使用mysql的模糊查询也可以根据

    2024年02月12日
    浏览(43)
  • redis实战-项目集成git及redis实现短信验证码登录

    目录     IDEA集成git 传统session存在的问题  redis方案 业务流程 选用的数据结构 整体访问流程 发送短信验证码  获取校验验证码 配置登录拦截器 拦截器注册配置类 拦截器 用户状态刷新问题 刷新问题解决方案   远程仓库采用码云,创建好仓库,复制仓库的url    在idea中点

    2024年02月11日
    浏览(44)
  • 在一个maven项目中使用maven命令进行junit单元测试

    如何在一个maven项目中使用maven命令进行junit单元测试? 首先确定一个maven项目的结构: 包含源代码目录src/main/java. 配置目录src/main/resources. 测试代码目录src/test. 目录结构可视化如下: 假定demo.java内容如下所示 我们要测试这个demo类, 可以在demoTest.java中写以下代码 然后就可以通过

    2023年04月21日
    浏览(55)
  • 【Maven】Maven的新建、使用、安装配置、集成配置到eclipse,Maven项目测试servlet,Maven容易出现的问题(看这一篇你大概就会了!别不信)

    目录 一、引言 --- maven的介绍 1、什么是 Maven? 2、Maven的作用 3、如何使用 Maven? 4、在什么环境下使用 Maven? 5、Maven的使用效果 二、maven安装及配置 1、下载解压安装 2、配置 ①环境变量配置 ②Maven插件安装与配置 三、集成配置eclipse 四、新建 Maven项目及细节配置 1、Maven项目

    2024年02月04日
    浏览(47)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖集成Redis(九)

    1.1 Redis的Java客户端 Redis 的 Java 客户端很多,常用的几种: Jedis Lettuce Spring Data Redis Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。 1.2 Spring Data Redis使用方式 1.2.1 介绍 Spring Data Redis 是 Spring 的一部分

    2024年02月05日
    浏览(54)
  • eclipse创建一个基于maven的web项目

    web程序运行,需要tomcat环境。提前安装好tomcat 点击 windows -preference ,在弹出窗口的左侧选中 server - Runtime enviroment 。 点击Add ,根据安装的tomcat版本选择 tomcat的类型后,点击finish 按钮      3.配置tomcat server 点击链接创建tomcat服务器     将web程序添加到右侧列表      1)点击

    2024年02月03日
    浏览(47)
  • 使用Jenkins构建发布一个简单的maven项目

    上一章,完成了jenkins在ubuntu上的安装,这一章将使用单个Jenkins服务完成一个maven项目的打包和发布。 用到的插件有:Maven Integration、Git、Publish Over SSH三个,在Dashboard - Manage Jenkins - Plugins -Available plugins里搜索并安装。 2.1、配置好JDK 在Dashboard - Manage Jenkins - Tools里将JAVA_HOME的目

    2024年02月16日
    浏览(42)
  • IDEA使用Maven快速创建一个Webapp项目(太细)

    环境:IDEA 2022.3.2 Maven项目的配置文件路径必须先设置好,否则一些依赖就不能成功引用(如果不是使用默认的本地仓库地址,而是新建的一个本地仓库地址),里面指向的是本地仓库的地址。(配置本地仓库和maven文件后期出 操作路径: Setting——搜索Maven——点击Maven——设

    2024年02月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包