美文网首页
Redis客户端Jedis、Lettuce、Redisson

Redis客户端Jedis、Lettuce、Redisson

作者: Alen_ab56 | 来源:发表于2022-09-22 11:30 被阅读0次

在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

相关文章

网友评论

      本文标题:Redis客户端Jedis、Lettuce、Redisson

      本文链接:https://www.haomeiwen.com/subject/oncnortx.html