Jedis、Redission、Lettuce 操作Redis、常用Redis操作方法
文章目录
概述
Jedis
、Redisson
和Lettuce
都是Redis
的Java
客户端,它们的主要区别在于以下几点:
- 架构设计:
Jedis
和Redisson
都是单线程的客户端,而Lettuce
是多线程的客户端。这意味着Lettuce
可以在一个线程池中处理多个连接,从而提高了性能和吞吐量。 - 连接管理:
Jedis
和Lettuce
都使用连接池来管理连接,而Redisson
使用Netty
作为底层通信框架,它的连接管理和线程模型与Netty
相同。 - 功能支持:
Jedis
和Redisson
都提供了丰富的功能和API
,例如分布式锁、分布式队列、分布式计数器等。Lettuce
的功能相对较少,但它提供了更好的异步支持和响应式编程模型。 - 性能表现:在性能方面,
Lettuce
通常比Jedis
和Redisson
更快,因为它使用了异步、非阻塞的I/O
模型和多线程连接池。但在特定的使用场景下,Jedis
和Redisson
也可能表现更好。 - 综上所述,选择适合自己的
Redis
客户端取决于具体的使用场景和需求。如果你需要使用丰富的功能和API
,可以选择Jedis
或Redisson
;如果你需要更好的性能和异步支持,可以选择Lettuce
。
Jedis
- 定义:
Jedis
是Redis
官方推荐的Java
连接开发工具。 Jedis
是一个流行的Redis
客户端中间件,提供了简单易用的API
和高性能的连接池管理。它是一个轻量级的库,适用于大多数Redis
应用场景,包括数据缓存、消息队列等。
Maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
使用方法
- 创建
Jedis
实例:在代码中,首先需要创建Jedis
实例来连接Redis
服务器。可以使用默认的构造函数创建实例,也可以指定Redis
服务器的主机名和端口号。 - 执行
Redis
操作:通过Jedis
实例,可以执行各种Redis
操作,如设置键值对、获取值、执行数据结构操作等。
Jedis jedis = new Jedis("localhost",6379);
jedis.set("one", "one");
return jedis.get("one");
JedisPool初始化
@Bean
public JedisPool getJedisPool(){
RedisProperties redisProperties=new RedisProperties();
GenericObjectPoolConfig jedisPoolConfig=new JedisPoolConfig();
// 资源池中的最大连接数
jedisPoolConfig.setMaxTotal(10);
// 资源池允许的最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
// 资源池确保的最少空闲连接数
jedisPoolConfig.setMinIdle(0);
// 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)。
jedisPoolConfig.setMaxWaitMillis(1000);
JedisPool jedisPool=new JedisPool(jedisPoolConfig,redisProperties.getHost(),redisProperties.getPort());
try{
Jedis resource = jedisPool.getResource();
logger.info("==========JedisPool配置成功!");
return jedisPool;
}catch (Exception e){
logger.info("==========JedisPool配置失败!");
return null;
}
}
Redission
Redisson
在基于NIO
的Netty
框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。Redisson
是一个功能强大的Redis
客户端中间件,提供了大量的分布式数据结构和服务,如分布式锁、分布式队列、分布式Map
等。它还支持异步操作和响应式编程模型,适用于高并发和大规模分布式系统。
Maven依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.5.0</version>
</dependency>
Redisson配置
@Configuration
public class RedissionConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
private static Logger logger = Logger.getLogger(String.valueOf(RedissionConfig.class));
/**
* 单机模式配置
*/
@Bean
public RedissonClient redissonClient() {
try {
RedisProperties redisProperties = new RedisProperties();
Config config =new Config();
config.useSingleServer().setAddress("redis://"+host+":"+port);
RedissonClient redissonClient = Redisson.create(config);
logger.info("==========Redisson配置完成!");
return redissonClient;
} catch (Exception e) {
logger.info("==========Redisson配置失败!" + e.getMessage());
return null;
}
}
}
使用方法
RedissonClient
接口中有好多方法进行操作Redis
,首先,确保你已经按照前面的步骤正确配置了Redisson
。
- 注解方式进行注入
redissonClient
@Autowired
private RedissonClient redissonClient;
进行Redis
操作。Redisson
提供了丰富的API
来操作Redis
数据。以下是一些常见的示例:
- 获取一个字符串:
RBucket<Object> bucket = redissonClient.getBucket("myKey");
Object value = bucket.get();
- 设置一个字符串:
RBucket<Object> bucket = redissonClient.getBucket("myKey");
bucket.set("myValue");
- 获取一个
Map
:
RMap<Object, Object> map = redissonClient.getMap("myMap");
Object value = map.get("myKey");
- 设置一个
Map
:
RMap<Object, Object> map = redissonClient.getMap("myMap");
map.put("myKey", "myValue");
- 获取一个列表:
RList<Object> list = redissonClient.getList("myList");
Object value = list.get(0);
- 添加一个元素到列表:
RList<Object> list = redissonClient.getList("myList");
list.add("myValue");
这只是一些使用Redisson
的基本示例,Redisson
还提供了更多的功能和API
,例如分布式锁、分布式队列、分布式计数器等。
Lettuce
Lettuce
是一个可伸缩线程安全的Redis
客户端。多个线程可以共享同一个RedisConnection
。它利用优秀nettyNIO
框架来高效地管理多个连接。Lettuce
是一个高性能的Redis
客户端中间件,使用Netty
作为底层网络通信框架,提供了异步和响应式编程模型,支持Redis Sentinel、Redis Cluster
和Redis
单机模式。Lettuce
还支持SSL
和连接池管理等特性。
Maven依赖
<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>
applicaiton.yml配置
server:
port: 8888
spring:
redis:
host: localhost
port: 6379
lettuce: # 这里标明使用lettuce配置
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms #连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 5 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
timeout: 10000ms #连接超时时间(毫秒)
RedisConfig配置RedisTemplate
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
/**
* RedisTemplate配置
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory connectionFactory){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
使用
@RequestMapping("/test1")
public void addlist1() {
redisTemplate.opsForValue().set("one", "one");
redisTemplate.opsForSet().add("test:set2", "1");
redisTemplate.opsForSet().add("test:set2", "2");
redisTemplate.opsForSet().add("test:set1", "3");
redisTemplate.opsForSet().add("test:set1", "3");
redisTemplate.opsForHash().put("hash1", "name1", "lms1");
redisTemplate.opsForHash().put("hash1", "name2", "lms2");
redisTemplate.opsForHash().put("hash1", "name3", "lms3");
redisTemplate.opsForList().leftPush("two", "two", "two1");
}
完整代码见https://gitee.com/Marlon_Brando/JavaTest/tree/master/configtest