通常在redis中常见(java)客户端有三个:jedis、lettuce、redisson。下面就简单介绍一下这三个不同的redis客户端,看完之后你会选择哪个呢?
![82e191d586cd250258aec00095c0abee.png](https://i-blog.csdnimg.cn/blog_migrate/e5dbdba3bc12180d1fb0d5a45cb24fe9.jpeg)
jedis客户端
jedis应该是redis中最老牌的Java客户端,提供了比较全面的Redis命令的支持,jedis采用的是socket长链接、阻塞式的方式进行数据的交互。同时为了实现链接的复用(减少连接频繁的创建和销毁)jedis也增加了连接池的功能,可以根据实际情况进行配置。
简单使用Demo
Jedis jedis = new Jedis("localhost", 6379);jedis.set("foo", "bar");String value = jedis.get("foo");jedis配置连接池大小GenericObjectPoolConfig config = new GenericObjectPoolConfig();config.setMaxTotal(100);config.setMaxIdle(20);JedisPool jedisPool = new JedisPool(config, "localhost", 6379);Jedis jedis = jedisPool.getResource();System.out.println(jedis.ping());
lettuce客户端
lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API。
Springboot 2.x版本之后Spring-data-redis底层默认使用的就是lettuce。
简单使用Demo
RedisURI redisUri = RedisURI.builder() .withHost("localhost") .withPort(6379) .withTimeout(Duration.of(10, ChronoUnit.SECONDS)) .build();RedisClient redisClient = RedisClient.create(redisUri);StatefulRedisConnection connection = redisClient.connect();RedisCommands redisCommands = connection.sync();SetArgs setArgs = SetArgs.Builder.nx().ex(5);String result = redisCommands.set("name", "throwable", setArgs);result = redisCommands.get("name");
最后在总结一下jedis和luttuce这两个区别(如果使用RedisTemlate操作直接用默认实现lettuce就可以了):
1.jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接
2.lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
redisson客户端
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。
它不仅提供了一系列的分布式的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) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
同时Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。
简单使用Demo
// 客户端配置
Config config = new Config();
// 设置序列化协议ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);JsonJacksonCodec jsonJacksonCodec = new JsonJacksonCodec(om);config.setCodec(jsonJacksonCodec) .useSingleServer() .setAddress(redisHostName) .setPassword(redisPassword) .setDatabase(defaultDBStr) .setConnectTimeout(timeout) .setConnectionMinimumIdleSize(minIdle) .setIdleConnectionTimeout(maxWait) .setConnectionPoolSize(maxActive);// 客户端创建RedissonClient client = Redisson.create(config);RBlockingQueue queue = redissonClient.getBlockingQueue("key");queue.add(T);redisson的功能非常多、让人觉得花里胡哨的,但是我们在使用的时候直接查使用手册即可,使用还是非常方便的(详细的使用手册:https://gitee.com/mirrors/redisson/wikis/1.-%E6%A6%82%E8%BF%B0?sort_id=1717185)
我个人比较习惯使用redisson,原因很简单:
1.功能丰富;
2.可以像操作java普通数据结构和对象一样操作redis中的数据;
3.同样是线程安全、也同样有同步和异步操作;
Spring RedisTemplate
最后再说一下Spring-data-redis,它是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring cache进行了实现。
如果不使用redisson那肯定会使用RedisTemplate这个操作类,几乎所有相关redis的操作都被封装在这个类中。