Jedis、Redisson与lettuce

来自Wikioe
跳到导航 跳到搜索


关于

Jedis

Jedis 是Java 实现的Redis 客户端,它的 API 提供了全面的类似于 Redis 原生命令的支持。相比于其他 Redis 封装框架更加原生


特点:

  • Jedis 中的方法调用是比较底层的暴露的 Redis 的 API,也即 Jedis 中的 Java 方法基本和 Redis 的 API 保持着一致,了解 Redis 的 API,也就能熟练的使用 Jedis。
    • Jedis 仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。
    • 支持单机、哨兵、Cluster等部署模式,支持事务、pipeline(管道技术)、LUA脚本等。
  • Jedis 使用阻塞的I/OBIO),且其方法调用都是同步的。(程序流需要等到 sockets 处理完I/O才能执行)
  • Jedis 客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
  • 不支持读写分离,需要自己实现。


它的使用主要是使用 JedisPool:

  1. 初始化:
        // 创建JedisPool所需的连接池配置
        JedisPoolConfig poolConfig = new JedisPoolConfig();
     
        // 最大连接数,默认8
        poolConfig.setMaxTotal(1024);
        // 最大空闲数,默认8
        poolConfig.setMaxIdle(100);
        // 是否启用pool的jmx管理功能, 默认true
        poolConfig.setJmxEnabled(true);
     
        // 创建JedisPool连接池
        jedisPool = new JedisPool(poolConfig, HOST, PORT, TIMEOUT, PASSWORD);
    
  2. demo:
        /**
        * 同步获取Jedis
        * @return
        */
        public synchronized static Jedis getJedis(){
            if(jedisPool != null){
                //获取Jedis对象
                Jedis jedis = jedisPool.getResource();
                return jedis;
            }
            return null;
        }
        
        /**
        * 释放jedis资源
        */
        public static void releaseResource(Jedis jedis){
            if( jedis !=null ){
                jedis.close();
            }
        }
    

Redisson

Redisson 实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。

  • Redisson 的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。


特点:

  • 提供分布式锁等常见的操作封装,并实现了分布式和可扩展的Java数据结构,但不支持一些基础的 Redis 原生功能
    • Redisson 不仅提供了一系列的分布式 Java 常用对象,基本可以与 Java 的基本数据结构通用,还提供了许多分布式服务,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)。
    • 不支持事务操作,可以使用 LUA 脚本实现。
  • 基于 Netty 实现,采用非阻塞的I/OAIO),性能高,支持异步的请求。
  • Redisson 的 API 是线程安全的,所以可以操作单个 Redisson 连接来完成各种操作。
  • 支持连接池。
  • 支持在主从部署和 cluster 部署模式下的读写分离
    • 在此基础上,支持读操作负载均衡
  • 第三方框架整合:
    • Redisson 提供了和 Spring 框架的各项特性类似的,以Spring XML的命名空间的方式配置RedissonClient实例和它所支持的所有对象和服务;
    • Redisson 完整的实现了 Spring 框架里的缓存机制;
    • Redisson 在 Redis 的基础上实现了 Java 缓存标准规范;
    • Redisson 为 Apache Tomcat 集群提供了基于 Redis 的非黏性会话管理功能。该功能支持 Apache Tomcat 的6、7和8版。
    • Redisson 还提供了 Spring Session 会话管理器的实现。

demo:

    //创建配置  
    Config config = new Config();  
  
    //指定编码,默认编码为org.redisson.codec.JsonJacksonCodec   
    config.setCodec(new org.redisson.client.codec.StringCodec());  
  
    //指定使用单节点部署方式  
    config.useSingleServer().setAddress("redis://127.0.0.1:6379");  
    config.useSingleServer().setClientName("root");
    config.useSingleServer().setPassword("abcabc");
 
    //创建redisson客户端
    RedissonClient redisson = Redisson.create(config);  
 
    RBucket<String> keyObject = redisson.getBucket("key");  
    keyObject.set("value");  
 
    //关闭RedissonClient  
    redisson.shutdown();

Lettuce

Lettuce 是目前 springboot 默认使用的客户端。


特点:

  • 基于 Netty 框架的事件驱动的通信层,其方法调用是异步的。
  • Lettuce 的 API 是线程安全的,所以可以操作单个 Lettuce 连接来完成各种操作。
  • 不需要考虑线程池,性能比较高,Spring 生态默认。
  • 同样支持连接池。


demo:【???】

    RedisClient client = RedisClient.create("redis://localhost"); 
    
    StatefulRedisConnection<String, String> connection = client.connect(); 
    RedisStringCommands sync = connection.sync(); 
    String value = sync.get("key"); 
 
    StatefulRedisConnection<String, String> connection = client.connect(); 
    RedisStringAsyncCommands<String, String> async = connection.async(); 
    RedisFuture<String> set = async.set("key", "value"); 
    RedisFuture<String> get = async.get("key"); 
 
    async.awaitAll(set, get) == true;  
 
    set.get() == "OK" ; 
    get.get() == "value" ;