百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

java的redis连接工具篇(java redis client)

bigegpt 2025-06-18 19:15 3 浏览

在 Java 里,有不少用于连接 Redis 的工具,下面为你介绍一些主流的工具及其特点:

Jedis

Jedis 是 Redis 官方推荐的 Java 连接工具,它提供了全面的 Redis 命令支持,且 API 设计直观。


public class JedisExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.set("key", "value");
        String value = jedis.get("key");
        System.out.println(value);
        jedis.close();
    }
}

它的优势在于使用简单,不过在多线程环境下需要配合连接池使用。

下面是jedis连接池的配置使用,需要注意的是使用完连接资源后需要close归还到连接池,在获取资源时候需要重新指定db,在前面的连接close后是仍然保留之前的db

public class JedisUtils {
    private static final JedisPool jedisPool;
    static {
        //配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大连接数
        poolConfig.setMaxTotal(5000);
        //最大空闲连接
        poolConfig.setMaxIdle(1200);
        //最小空闲连接
        poolConfig.setMinIdle(10);
        //最长等待时间,ms
        poolConfig.setBlockWhenExhausted(true);
        poolConfig.setMaxWaitMillis(-1);
        //空闲检查有效性
        poolConfig.setTestWhileIdle(true);
        //进行有效性检查
//		poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);

        String pwd = "123456";
        String port = "6379";
        String timeout = "10000";
        String host = "127.0.0.1";

        if (StringUtils.isEmpty(pwd)) {
            jedisPool = new JedisPool(poolConfig, host, Integer.parseInt(port), Integer.parseInt(timeout));
        } else {
            jedisPool = new JedisPool(poolConfig, host, Integer.parseInt(port), Integer.parseInt(timeout), pwd);
        }
    }

    
    public static Jedis getJedisDB(int index) {
        log.info("jdeis active num:{}", jedisPool.getNumActive());
        Jedis resource = jedisPool.getResource();
        resource.select(index);
        return resource;
    }

Lettuce

Lettuce 是基于 Netty 的高性能 Redis 客户端,它支持同步、异步和响应式编程模式,并且天然适配 Reactive Streams。其特点是线程安全,适合在高并发场景中使用。


public class LettuceExample {
    public static void main(String[] args) {
        RedisClient redisClient = RedisClient.create(RedisURI.create("redis://localhost:6379"));
        StatefulRedisConnection<String, String> connection = redisClient.connect();
        RedisCommands<String, String> commands = connection.sync();
        commands.set("key", "value");
        String value = commands.get("key");
        System.out.println(value);
        connection.close();
        redisClient.shutdown();
    }
}

Lettuce 自身提供了GenericObjectPool(基于 Apache Commons Pool)的封装示例,可通过配置PoolConfig控制连接池参数(如最大连接数、空闲连接超时时间等)。

// 配置连接池
GenericObjectPoolConfig<StatefulRedisConnection<String, String>> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(100); // 最大连接数
config.setMinIdle(10);   // 最小空闲连接数

// 创建连接工厂
RedisClient client = RedisClient.create("redis://localhost:6379");
RedisURI uri = RedisURI.create("localhost", 6379);
ConnectionFactory<String, String> factory = new JedisConnectionFactory(uri);

// 创建连接池
GenericObjectPool<StatefulRedisConnection<String, String>> pool = 
    new GenericObjectPool<>(() -> client.connect(), config);

// 从连接池获取连接
try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) {
    RedisCommands<String, String> commands = connection.sync();
    commands.set("key", "value");
} catch (Exception e) {
    // 异常处理
} finally {
    pool.returnObject(connection); // 归还连接
}

Redisson

Redisson 是一个在 Redis 基础上实现的分布式和可扩展的 Java 数据结构集合。它提供了如分布式锁、分布式集合等高级功能。


public class RedissonExample {
    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        RedissonClient redisson = Redisson.create(config);
        RLock lock = redisson.getLock("myLock");
        lock.lock();
        try {
            // 执行需要加锁的业务逻辑
        } finally {
            lock.unlock();
        }
        redisson.shutdown();
    }
}

以下是 Redisson 连接池的典型配置代码


public class RedissonConfigExample {

    // 单机模式配置
    public static RedissonClient createSingleServerClient() {
        Config config = new Config();
        config.useSingleServer()
            .setAddress("redis://localhost:6379")
            .setDatabase(0)
            // 连接池配置
            .setConnectionPoolSize(100)             // 最大连接数
            .setConnectionMinimumIdleSize(10)       // 最小空闲连接数
            .setSubscriptionConnectionPoolSize(50)  // 订阅连接池大小
            // 超时配置
            .setConnectTimeout(5000)                // 连接超时时间(毫秒)
            .setTimeout(3000)                       // 命令超时时间(毫秒)
            .setRetryAttempts(3)                    // 重试次数
            .setRetryInterval(1500)                 // 重试间隔(毫秒)
            // 空闲检测
            .setIdleConnectionTimeout(10000)        // 空闲连接超时时间(毫秒)
            .setPingConnectionInterval(60000);      // 心跳检测间隔(毫秒)
        return Redisson.create(config);
    }

    // 主从模式配置
    public static RedissonClient createMasterSlaveClient() {
        Config config = new Config();
        config.useMasterSlaveServers()
            .setMasterAddress("redis://master:6379")
            .addSlaveAddress("redis://slave1:6379", "redis://slave2:6379")
            // 读写分离配置
            .setReadMode(ReadMode.SLAVE)            // 读操作优先从从节点获取
            .setSubscriptionMode(ReadMode.MASTER)   // 订阅操作使用主节点
            // 连接池配置(主节点)
            .setMasterConnectionPoolSize(100)
            .setMasterConnectionMinimumIdleSize(10)
            // 连接池配置(从节点)
            .setSlaveConnectionPoolSize(100)
            .setSlaveConnectionMinimumIdleSize(10)
            // 其他通用配置(同单机模式)
            .setConnectTimeout(5000)
            .setTimeout(3000);
        return Redisson.create(config);
    }

    // 哨兵模式配置
    public static RedissonClient createSentinelClient() {
        Config config = new Config();
        config.useSentinelServers()
            .setMasterName("mymaster")
            .addSentinelAddress("redis://sentinel1:26379", 
                               "redis://sentinel2:26379", 
                               "redis://sentinel3:26379")
            // 哨兵监控相关配置
            .setCheckSentinelsList(false)           // 是否检查哨兵列表
            .setScanInterval(2000)                  // 哨兵扫描间隔(毫秒)
            // 连接池配置
            .setMasterConnectionPoolSize(100)
            .setSlaveConnectionPoolSize(100)
            .setSubscriptionConnectionPoolSize(50)
            // 其他配置
            .setConnectTimeout(5000)
            .setDatabase(0);
        return Redisson.create(config);
    }

    // 集群模式配置
    public static RedissonClient createClusterClient() {
        Config config = new Config();
        config.useClusterServers()
            .addNodeAddress("redis://node1:7000", "redis://node2:7001", 
                           "redis://node3:7002", "redis://node4:7003")
            // 集群扫描与拓扑发现
            .setScanInterval(2000)                  // 集群状态扫描间隔(毫秒)
            .setCheckSlotsCoverage(true)            // 是否检查槽覆盖情况
            // 负载均衡策略
            .setLoadBalancer(new org.redisson.connection.balancer.RoundRobinLoadBalancer())
            // 连接池配置(每个节点)
            .setNodeConnectionMinimumIdleSize(10)
            .setNodeConnectionPoolSize(64)
            // 重试与超时
            .setRetryAttempts(3)
            .setRetryInterval(1500)
            .setTimeout(3000);
        return Redisson.create(config);
    }

    public static void main(String[] args) {
        // 根据实际环境选择配置方式
        RedissonClient client = createSingleServerClient();
        
        // 使用示例
        try {
            client.getBucket("testKey").set("testValue");
            System.out.println(client.getBucket("testKey").get());
        } finally {
            client.shutdown(); // 关闭客户端时自动释放连接池资源
        }
    }
}

Redisson 的优势在于提供了丰富的分布式对象和服务。

Spring Data Redis

Spring Data Redis 是 Spring 框架的一部分,它为 Redis 提供了高度抽象的 API。



@Configuration
public class RedisConfig {
    @Bean
    public JedisConnectionFactory connectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6379);
        return new JedisConnectionFactory(config);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory());
        return template;
    }
}

借助 Spring 的依赖注入机制,它能让 Redis 的操作变得更加简便。

可以根据项目的具体需求来挑选合适的 Redis 连接工具。

● 若你追求简单易用的工具,那么 Jedis 是个不错的选择。

● 要是处于高并发场景,Lettuce 会更适合你。

● 当你需要分布式锁或分布式集合等高级功能时,Redisson 是首选。

● 如果你在使用 Spring 框架,Spring Data Redis 能让你更好地集成 Redis。

例如在呼叫中心系统中的配置更新操作上就可以选择jedis、Spring Data Redis完成参数的更迭,在呼叫黑名单系统中就可以选择Lettuce来进行开发,在对部分分布式系统的接口验证上可以使用Redisson

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...