通常在redis中常见(java)客户端有三个:jedis、lettuce、redisson。下面就简单介绍一下这三个不同的redis客户端,看完之后你会选择哪个呢?
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<String, String> connection = redisClient.connect();
RedisCommands<String, String> 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<T> 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的操作都被封装在这个类中。
本文暂时没有评论,来添加一个吧(●'◡'●)