【重学Redis】都2021年了,你还在使用jedis吗?

开课吧樵夫2021-12-20 16:24

  Redis作为一种常见的缓存选择,因其高性能而受欢迎。Redis的2.x版本只支持单机模式,集群模式从3.0版本引入。

  常用的redis的Java客户端

  1、Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持,Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis,学习成本较低。

  2、Redisson实现了分布式和可扩展的Java数据结构,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列。Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。

  3、Lettuce是高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。目前springboot默认使用的客户端。

  Jedis的使用

  创建Maven工程,在项目中添加Jedis依赖。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

  Jedis的使用方法非常简单,只要三行代码就可以实现基本的set/get功能

//1.生成一个Jedis对象,这个对象负责和指定Redis实例进行通信
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2.jedis执行set操作
jedis.set("hello", "world");
//3.jedis执行get操作,value="world"
String value = jedis.get("hello");

  Jedis连接池

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(20);
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMinIdle(5);
// timeout:这里既是连接超时又是读写超时,从Jedis 2.8开始可以单独设置connectionTimeout和soTimeout
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 3000, "password");
Jedis jedis = jedisPool.getResource();

  哨兵模式连接池

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
String masterName = "redis-master";
Set<String> sentinels = new HashSet<String>();
sentinels.add(new HostAndPort("192.168.0.70",6379).toString());
sentinels.add(new HostAndPort("192.168.0.80",6380).toString());
sentinels.add(new HostAndPort("192.168.0.90",6381).toString());
//JedisSentinelPool其实本质跟JedisPool类似,都是与redis主节点建立的连接池
//JedisSentinelPool并不是说与sentinel建立的连接池,而是通过sentinel发现redis主节点并与其建立连接
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, config, 3000, "password");
Jedis jedis = jedisSentinelPool.getResource();

  集群模式连接池

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.0.61", 6379));
jedisClusterNode.add(new HostAndPort("192.168.0.62", 6379));
jedisClusterNode.add(new HostAndPort("192.168.0.63", 6379));
jedisClusterNode.add(new HostAndPort("192.168.0.64", 6379));
jedisClusterNode.add(new HostAndPort("192.168.0.65", 6379));
jedisClusterNode.add(new HostAndPort("192.168.0.66", 6379));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "password", config);
System.out.println(jedisCluster.set("cluster", "zhuge"));

  RedisTemplate的使用

  添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

  Redis单机配置

spring:
# 单机配置
  redis:
    host: "127.0.0.1"
    port: 6379
    database: 0
    timeout: 3000
    password: "password"
    lettuce:
      pool:
        max-idle: 50
        min-idle: 10
        max-active: 100
        max-wait: 1000

  StringRedisTemplate和RedisTemplate的区别

  1、两者的数据是不共通的,也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据

  2、StringRedisTemplate 默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate 默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

  使用时注意事项:

  当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。

  但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

  哨兵模式配置

spring:
# 哨兵模式配置
  redis:
    sentinel:    #哨兵模式
      master: mymaster  #主服务器所在集群名称
      nodes: 192.168.0.60:6379,192.168.0.61:6379,192.168.0.62:6379
    lettuce:
      pool:
        max-idle: 50
        min-idle: 10
        max-active: 100
        max-wait: 1000

  集群模式配置

spring:
# 集群模式配置
  redis:
    lettuce:
      pool:
        max-idle: 50
        min-idle: 10
        max-active: 100
        max-wait: 1000
    cluster:
      nodes: 192.168.0.61:6379,192.168.0.62:6379,192.168.0.63:6379,192.168.0.64:6379,192.168.0.65:6379,192.168.0.66:6379

  lettuce的使用

  添加依赖

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.1.5.RELEASE</version>
</dependency>

  使用

RedisClient redisClient = RedisClient.create("redis://password@localhost:6379/0");
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();
syncCommands.set("key", "Hello, Redis!");
connection.close();
redisClient.shutdown();

  Redisson的使用

  添加依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.16.6</version>
</dependency>  

  使用

// 1. Create config object
Config config = new Config();
config.useClusterServers()
       // use "rediss://" for SSL connection
      .addNodeAddress("redis://127.0.0.1:7181");
// or read config from file
config = Config.fromYAML(new File("config-file.yaml")); 
// 2. Create Redisson instance
// Sync and Async API
RedissonClient redisson = Redisson.create(config);
// Reactive API
RedissonReactiveClient redissonReactive = redisson.reactive();
// RxJava3 API
RedissonRxClient redissonRx = redisson.rxJava();
// 3. Get Redis based implementation of java.util.concurrent.ConcurrentMap
RMap<MyKey, MyValue> map = redisson.getMap("myMap");
RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");
RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");
// 4. Get Redis based implementation of java.util.concurrent.locks.Lock
RLock lock = redisson.getLock("myLock");
RLockReactive lockReactive = redissonReactive.getLock("myLock");
RLockRx lockRx = redissonRx.getLock("myLock");
// 5. Get Redis based implementation of java.util.concurrent.ExecutorService
RExecutorService executor = redisson.getExecutorService("myExecutorService");

  对比

  1、Jedis 是老牌的 Redis官方 的 Java 实现客户端,支持全面的 Redis 操作特性,但是Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。

  2、Redisson是基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。

  3、Lettuce也是基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。

  4、Redisson不仅提供了一系列的分布式Java常用对象,基本可以与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)。但是和Jedis相比,功能较为简单,对字符串的操作支持比较差,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

  5、从活跃度上来说的话,lettuce的社区活跃度也比jedis要活跃

  使用建议

  建议使用lettuce + Redisson,Jedis 和 lettuce 是比较纯粹的 Redis 客户端,几乎没提供什么高级功能。Jedis 的性能比较差,所以如果你不需要使用 Redis 的高级功能的话,优先推荐使用 lettuce。而且现在lettuce是springboot官方默认的客户端,以后的发展想来不会太差。

  Redisson 的优势是提供了很多开箱即用的 Redis 高级功能,如果你的应用中需要使用到 Redis 的高级功能,建议使用 Redisson。

  以上就是开课吧小编为大家整理发布的“【重学Redis】都2021年了,你还在使用jedis吗?”一文,更多相关内容尽在开课吧广场Java教程频道。

【重学Redis】都2021年了,你还在使用jedis吗?

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享