jedispool 连接池_redis-cli连接redis数据库

jedispool 连接池_redis-cli连接redis数据库一、连接前的准备1.确保windows能够ping通linux,linux能够ping通windows。2.开放CentOS7的端口6379。firewall-cmd–add-port=6379/tcp–permanent3.注释掉redis.conf文件中的bind。#bind127.0.0.14….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

一、连接前的准备

二、使用JedisPool连接池创建连接

ThreadLocal为多线程保证一个线程始终同一个连接

多线程测试

三、配置多数据源 


一、连接前的准备

        1 . 确保windows能够ping通linux,linux能够ping通windows。

        2. 开放CentOS7的端口6379 。

      firewall-cmd –add-port=6379/tcp –permanent

        3. 将redis.conf文件中的bind 改为 0.0.0.0

      bind 0.0.0.0

        4. 需要给redis设置密码才能访问,要不然会提醒没有设置密码, 修改redis.conf配置文件,指定永久密码:  

     # requirepass foobared
       requirepass 123456   

        5. 将protecetd-mode 设置为no 

protected-mode no

        6. 启动服务器。

./redis-server ../redis.conf

        windows:

cd D:\Program Files\redis-server-5.0.9

d:

redis-server.exe redis.windows-service.conf

     jedispool 连接池_redis-cli连接redis数据库

二、使用JedisPool连接池创建连接

        添加pom依赖:

  <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.4.2</version>
</dependency>

        注:访问的地址为ping通linux的地址,可以先通过redis桌面程序RedisDesktopManager测试是否可以通,再进行如下的工作。

ThreadLocal为多线程保证一个线程始终同一个连接

定义RedisConstants常量

package com.bing.sh.redis;

public class RedisConstants {


    public static final String DEFAULT_REDIS_HOST = "localhost";
    //端口
    public static final int DEFAULT_REDIS_PORT = 6379;
    //密码
    public static final String DEFAULT_REDIS_PWD = "123456";

    public static final int DEFAULT_REDIS_MAX_ACTIVE = 1024;
    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    public static final int DEFAULT_REDIS_MAX_IDLE = 200;
    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
    public static final int DEFAULT_REDIS_MAX_WAIT = 10000;
    //连接超时的时间  
    public static final int DEFAULT_REDIS_TIMEOUT = 10000;
    // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    public static final boolean DEFAULT_REDIS_TEST_ON_BORROW = true;
    // 默认数据库
    public static final int DEFAULT_REDIS_DATABASE = 0;


}

定义RedisProperty类:

package com.bing.sh.redis;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class RedisProperty {

    //服务器IP地址
    private String host = RedisConstants.DEFAULT_REDIS_HOST;
    //端口
    private int port = RedisConstants.DEFAULT_REDIS_PORT;
    //密码
    private String pwd = RedisConstants.DEFAULT_REDIS_PWD;
    //连接实例的最大连接数
    private int maxActive = RedisConstants.DEFAULT_REDIS_MAX_ACTIVE;
    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    private int maxIdle = RedisConstants.DEFAULT_REDIS_MAX_IDLE;
    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
    private int maxWait = RedisConstants.DEFAULT_REDIS_MAX_WAIT;
    //连接超时的时间  
    private int timeout = RedisConstants.DEFAULT_REDIS_TIMEOUT;
    // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private boolean testOnBorrow = RedisConstants.DEFAULT_REDIS_TEST_ON_BORROW;
    //数据库模式是16个数据库 0~15
    public int defaultDatabase = RedisConstants.DEFAULT_REDIS_DATABASE;


}

         使用ThreadLocal存放Jedis实例,保证一个线程使用的连接始终是同一个, 获取连接的时候直接从ThreadLocal里拿

package com.bing.sh.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisTemplate {
    private static Logger logger = LoggerFactory.getLogger(JedisTemplate.class);


    private static ThreadLocal<Jedis> jedisThreadLocal = new ThreadLocal<>();


    private static JedisTemplate jedisTemplate = new JedisTemplate();

    private static JedisPoolConfig config;

    private static JedisPool jedisPool;


    public static JedisTemplate getJedisTemplate(RedisProperty prop) {
        if (jedisPool == null) {
            initJedisPool(prop.getHost(), prop.getPort(), prop.getPwd(), prop.getTimeout(), prop.getDefaultDatabase());
        }
        return jedisTemplate;
    }

    public static JedisTemplate getJedisTemplate() {
        RedisProperty prop = new RedisProperty();
        if (jedisPool == null) {
            initJedisPool(prop.getHost(), prop.getPort(), prop.getPwd(), prop.getTimeout(), prop.getDefaultDatabase());
        }
        return jedisTemplate;
    }


    static {
        config = new JedisPoolConfig();
        config.setMaxTotal(RedisConstants.DEFAULT_REDIS_MAX_ACTIVE);
        config.setMaxIdle(RedisConstants.DEFAULT_REDIS_MAX_IDLE);
        config.setMaxWaitMillis(RedisConstants.DEFAULT_REDIS_MAX_WAIT);
        config.setTestOnBorrow(RedisConstants.DEFAULT_REDIS_TEST_ON_BORROW);
    }


    public static JedisPool initJedisPool(String host, int port, String pwd, int timeout, int db) {
        jedisPool = new JedisPool(config, host, port, timeout, pwd, db);
        logger.info("init jedis pool success >>>" + jedisPool.hashCode());
        return jedisPool;
    }




    public Jedis getJedisConnection() {
        Jedis jedis = jedisThreadLocal.get();
        if (ObjectUtils.isEmpty(jedis)) {
            jedis = jedisPool.getResource();
            jedisThreadLocal.set(jedis);
        }
        return jedis;

    }

    public void releaseConnection() {
        Jedis jedis = jedisThreadLocal.get();
        if (!ObjectUtils.isEmpty(jedis)) {
            jedisPool.returnResource(jedis);
            System.out.println("线程 ID " + Thread.currentThread().getId() + " 释放连接, jedis code=" + jedis.hashCode() + " release success !");
        }
        jedisThreadLocal.remove();
    }


}

多线程测试

    public static void main(String[] args) {
        RedisProperty property = new RedisProperty();
        // 将自定义属性注入
        property.setPwd("mypassword");
        JedisTemplate jedisTemplate = JedisTemplate.getJedisTemplate(property);
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                System.out.println("线程 ID " + Thread.currentThread().getId() + " 获取连接, jedis code=" + jedisTemplate.getJedisConnection().hashCode());
                jedisTemplate.releaseConnection();
            }).start();
        }
    }

jedispool 连接池_redis-cli连接redis数据库

三、配置多数据源 

       也可以采用如下的方式配置redis的多数据源,只要从jedisPoolsMap根据host取出连接池列表即可。

package com.bing.sh.redis;

import com.bing.sh.exception.custom.RedisInitException;
import com.bing.sh.utils.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MultipleJedisTemplate extends RedisConn {
    private static Logger logger = LoggerFactory.getLogger(MultipleJedisTemplate.class);

    private static MultipleJedisTemplate multipleJedisTemplate = new MultipleJedisTemplate();


    private static Map<String/**host**/, List<JedisPool>> jedisPoolsMap = new ConcurrentHashMap<>();


    public static Map<String, List<JedisPool>> getJedisPoolsMap() {
        return jedisPoolsMap;
    }


    public List<JedisPool> getJedisPoolsByHost(String host) {
        List<JedisPool> jedisPools = jedisPoolsMap.get(host);
        logger.info(host + " get jedis pool " + jedisPools);
        if (CollectionUtils.isNotEmpty(jedisPools)) return jedisPools;
        throw new RedisInitException(host + "has no JedisPoll found ! please init first");
    }


    private static void initMultipleJedisPool(List<RedisProperty> props) {
        props.forEach((prop) -> {
            String host = prop.getHost();
            List<JedisPool> jedisPools = jedisPoolsMap.get(host);
            if (CollectionUtils.isEmpty(jedisPools)) {
                jedisPools = new ArrayList<>();
            }
            jedisPools.add(new JedisPool(poolConfig, prop.getHost(), prop.getPort(), prop.getTimeout(), prop.getPwd(), prop.getDefaultDatabase()));
            jedisPoolsMap.put(host, jedisPools);
        });
    }


    public static MultipleJedisTemplate getMultipleJedisTemplate(List<RedisProperty> props) {
        if (CollectionUtils.isEmpty(props)) {
            throw new RedisInitException("init jedis fail >>> no properties input !");
        }
        initMultipleJedisPool(props);
        return multipleJedisTemplate;
    }


    @Override
    void setConfig(JedisPoolConfig config) {
        poolConfig = config;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197166.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle数据库数据恢复方法

    Oracle数据库数据恢复方法前一段遇到:操作系统崩溃,数据库留有所有数据文件,控制文件,配置文件。下面记录一下数据恢复过程。1.下载安装Oracle数据库。安装的数据库定要与之前版本的数据库版本一致。安装的数据库位置要与之前安装的数据库位置一致。2.创建新的数据库。创建新的数据库实例,实例名称密码要与之前数据库实例一致。3.打开sqlPlus命令行(1)输入命令system/密码assysdba。(2)shutdownimmediate;关闭数据库。4.使用原本的数据文件替换到新的数据

    2022年7月17日
  • IIS真正能用的ISAPI-Rewrite防盗链规则写法

    IIS真正能用的ISAPI-Rewrite防盗链规则写法本规则支持白名单排除式防盗链,搜索引擎友好不屏蔽,被盗链后的错误提示转向,支持各种文件类型,经作者亲验真的能用,第一时间在原创发表,请继续往下阅读。近来小站遇到了盗链问题,至使网站的流量枉费流失,于是被迫准备为服务器安装防盗链机制以挽救本就不宽裕的带宽。通过G.CN和B.CN搜索后得出了几种不同的方案,例如网站程序的URL伪装法、服务器端的收费插件法和ISAPI-R…

    2022年7月23日
  • 有线如何通过笔记本无线共享上网_笔记本插网线怎么共享WiFi

    有线如何通过笔记本无线共享上网_笔记本插网线怎么共享WiFi半年前搬到新住的地方,由于条件限制,房间就一根网线,我跟我老婆两人晚上都需要用到电脑,于是萌生了通过路由器来达到多机器同时上网,不过最后失败。当时没想起大学时代经常干的事情(学校寝室上网要账号,账号都要钱的):通过一台电脑上网,所有其他电脑都通过这台机器上网。半年之后的今天,由于工作实在需要网络,这种条件下,让我想起了曾经的这么一回事,因此我在想,既然能通过有线达到共享网络,无线原理应该一样吧…

    2022年11月2日
  • python实现注册登录系统_python实现登录与注册系统「建议收藏」

    python实现注册登录系统_python实现登录与注册系统「建议收藏」本文实例为大家分享了python实现登录与注册系统的具体代码,供大家参考,具体内容如下实现功能1.调用文本文件里的用户信息2.可以将注册信息存储在文本文件里3.实现了密码格式的限制具体用户信息将如下格式存储在txt文本文件下转换后便于代码利用的格式(列表中嵌套字典)具体代码如下:#-*-coding=utf8-*-#@author:sololi#date:2020/11/3#文件说…

    2022年5月22日
  • 一句话木马怎么连接_js木马源码

    一句话木马怎么连接_js木马源码“EASYNEWS新闻管理系统v1.01正式版”是在企业网站中非常常见的一套整站模版,在该网站系统的留言本组件中就存在着数据过滤不严漏洞,如果网站是默认路径和默认文件名安装的话,入侵者可以利用该漏洞直接上传ASP木马程序控制整个网站服务器。Step1搜索入侵目标使用了“EASYNEWS新闻管理系统v1.01正式版”的网站,在网站页面的底部版权声明处,往往会有关键字符为“WWW.52EAS…

    2022年10月30日
  • 子组件传对象给父组件_react子组件改变父组件的状态

    子组件传对象给父组件_react子组件改变父组件的状态子组件传值给父组件首先子组件(组件名“Child”)内定义一个方法例如sendData=()=>{letdata=‘1234’;this.props.getData(data);//这个this,props.xxx后面的xxx是是在父组件那使用的名字;},然后可以在render函数后使用这个方法或者另外定义一个事件去触发该方法进行传值,之后可在父组件(Parent)内使用这个方法获取拿到的值:Parent组件内:首先定义一个方法getData或者其他什么都可以随

    2022年9月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号