一 客户端版本
Jedis,Redisson,lettuce3个版本 推荐后两个
Jedis
- 使用阻塞的I/O,同步调用,不支持异步,不是线程安全的
- 老牌的 Redis 的 Java 实现客户端,提供了比较全面的 Redis 命令的支持
- 使用连接池连接,方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致
- 支持基本的数据类型如:String、Hash、List、Set、Sorted Set
- 不支持本地缓存
- 必须使用同步的操作,比如设计金额
- 官网:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
lettuce
- 是一种可扩展的线程安全的 Redis 客户端,支持异步模式
- 底层基于 Netty,支持高级的 Redis 特性,比如哨兵,集群,管道,自动重新连接和Redis数据模型。lettuce能够支持redis4,需要java8及以上,在spring boot2之后,redis连接默认就采用了lettuce
- 地址:https://github.com/lettuce-io/lettuce-core
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Redisson
- Redisson实现了分布式和可扩展的Java数据结构,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性
- 基于NIO的Netty框架上异步操作。它的API是线程安全的
- Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用
- 支持本地缓存
- 支持包括(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)
- 项目地址:https://github.com/redisson/redisson
- 官方对比:https://dzone.com/articles/redisson-pro-vs-jedis-which-is-faster
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
二 Redisson简单上手
yml配置和启动服务端
#单Redis节点模式
redisson:
singleServerConfig:
address: 127.0.0.1:6379
运行命令 redis-server.exe redis.windows.conf
//使用官方封装提供的接口
@Autowired
private RedissonClient redissonClient
//简单的一个加锁
RLock rLock = redissonClient.getLock(redisKey);
Boolean res = rLock.tryLock(0, annotation.expireSeconds(), TimeUnit.MILLISECONDS);
if(!res){
throw new RuntimeException("数据未发生变化");
}
//读取字符串
public String getStr(String key) {
RBucket<String> bucket = redissonClient.getBucket(key);
return bucket.get();
}
//缓存字符串
public void setStr(String key, String value) {
RBucket<String> bucket = redissonClient.getBucket(key);
bucket.set(value);
}
//移除缓存
public void delete(String key) {
redissonClient.getBucket(key).delete();
}
//检查redis中是否存在key
public Boolean hasKey(String key) {
RKeys rKeys = redissonClient.getKeys();
return rKeys.countExists(getNameMapper().map(key)) > 0;
}
//获取所有的指定前缀keys
public Set<String> getKeys(String prefix) {
Iterable<String> keysByPattern = redissonClient.getKeys().getKeysByPattern(prefix);
Set<String> keys = new HashSet<>();
for (String s : keysByPattern) {
keys.add(s);
}
return keys;
}
//发布通道消息
public <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
RTopic topic = redissonClient.getTopic(channelKey);
topic.publish(msg);
consumer.accept(msg);
}
//订阅通道接收消息
public <T> void subscribe(String channelKey, Class<T> clazz, Consumer<T> consumer) {
RTopic topic = redissonClient.getTopic(channelKey);
topic.addListener(clazz, (channel, msg) -> consumer.accept(msg));
}