https://www.jianshu.com/p/90a9e2eccd73
在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce
Jedis:采用的直连,BIO网络模型
Jedis有一个问题:多个线程使用一个连接的时候线程不安全。
解决思路是:
使用连接池,为每个请求创建不同的连接,基于Apache common pool实现。Jedis的连接池有三个实现:JedisPool,ShardedJedisPool,JedisSentinelPool,都是用getResource从连接池获取一个连接。
public class JedisPoolTest {
public static void main(String[] args) {
ordinaryPool();
shardedPool();
sentinelPool();
}
/**
* 普通连接池
*/
public static void ordinaryPool(){
JedisPool pool = new JedisPool("这个参数是ip地址",6379);
Jedis jedis = pool.getResource();
jedis.set("shihui","石灰");
System.out.println(jedis.get("shihui"));
}
/**
* 分片连接池
*/
public static void shardedPool() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// Redis服务器
JedisShardInfo shardInfo1 = new JedisShardInfo("这个参数是ip地址", 6379);
// 连接池
List<JedisShardInfo> infoList = Arrays.asList(shardInfo1);
ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);
ShardedJedis jedis = jedisPool.getResource();
jedis.set("shihui","分片测试");
System.out.println(jedis.get("shihui"));
}
/**
* 哨兵连接池
*/
public static void sentinelPool() {
String masterName = "redis-master";
Set<String> sentinels = new HashSet<String>();
sentinels.add("这个参数是ip地址1:26379");
sentinels.add("这个参数是ip地址2:26379");
sentinels.add("这个参数是ip地址3:26379");
JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels);
pool.getResource().set("shihui", "哨兵" + System.currentTimeMillis() + "石灰");
System.out.println(pool.getResource().get("shihui"));
}
}
Lettuce:采用netty,NIO模式
支持同步、异步和响应式模式(Reactive)
实例可以在多个线程中进行共享,不存在线程不安全的情况。
Redisson:
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid),提供了分布式和可扩展的Java数据结构,比如分布式的Map,List.,Queue,Set,不需要自己去运行一个服务实现。
基于Netty实现,采用非阻塞10,性能高;支持异步请求。
支持连接池、pipeline、LUA Scripting.Redis Sentinel,Redis Cluster不支持事务,官方建议以LUA Scripting代替事务
主从、哨兵、集群都支持。Spring也可以配置和注入RedissonClient。
在Redisson里面提供了更加简单的分布式锁的实现。
public static void main(String[]args)throws InterruptedException{
RLock rLock-redissonClient.getLock("updateAccount");
//最多等待100秒、上锁10s以后自动解锁
if(rLock.tryLock(100,10,TimeUnit.SECONDS)){
System.out.println("获取锁成功");
}
// do something
rLock.unlock();
}
参考:
https://blog.csdn.net/shihui_0516/article/details/110409135?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-110409135-blog-117781602.t5_refersearch_landing&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-110409135-blog-117781602.t5_refersearch_landing&utm_relevant_index=4