一、连接方案
jedis连接实现
lettuce连接实现
redisson连接
jedis连接
简单实用,但是jedis的实例是线程不安全的,多线程环境下需要基于链接池来使用
演示
首先要新建一个maven工程,然后引入下面的pom依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
简单连接
编写测试类
/**
* @author:
* @date: 2022/3/24 18:30
* @description:
*/
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp(){
jedis = new Jedis("127.0.0.1",6379);
jedis.select(0);
}
@Test
public void setRedis(){
jedis.set("name","小明");
System.out.println(jedis.get("name"));
}
测试结果:
连接池的形式连接
package redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author:
* @date: 2022/3/24 18:36
* @description: Jedis连接池
*/
public class JedisConnetFactory {
private static final JedisPool jedisPool;
static{
// 配置连接池
JedisPoolConfig config = new JedisPoolConfig();
// 最大连接数
config.setMaxTotal(8);
// 最大空闲链接
config.setMaxIdle(8);
// 最小空闲链接
config.setMinIdle(0);
// 最长等待时间
config.setMaxWaitMillis(1000);
jedisPool = new JedisPool(config,"127.0.0.1",6379);
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
编写测试类
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.JedisConnetFactory;
import redis.clients.jedis.Jedis;
/**
* @author:
* @date: 2022/3/24 18:30
* @description:
*/
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp(){
jedis = JedisConnetFactory.getJedis();
jedis.select(0);
}
@Test
public void setRedis(){
jedis.set("name","小明");
System.out.println(jedis.get("name"));
}
可以手动模拟测试一下。
lettuce连接
是基于netty实现的,支持同步,异步,响应式编程方式,并且是线程安全的。支持redis的哨兵模式,集群模式和管道模式
lettuce连接已经在springboot中帮我们集成了,我们只需要创建一个spring-boot的maven工程,然后引入下面的pom依赖就行了
<!--spring-data-redis-->
<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>
<!--json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
配置数据源
spring:
redis:
host: 127.0.0.1
port: 6379
lettuce:
pool:
# 最大连接数
max-activity: 8
# 最大空闲链接
max-idle: 8
# 最小空闲链接
min-idle: 0
# 最长等待时间
max-wait: 1000
启动类设置一下
@ComponentScan("com.mumu.*")
配置哪些包下的类需要被spring管理
@SpringBootApplication
@ComponentScan("com.mumu.*")
public class SpringRedisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRedisDemoApplication.class, args);
}
}
编写测试类
@SpringBootTest
class SpringRedisDemoApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
stringRedisTemplate.opsForValue().set("name", "张三");
Object openId = stringRedisTemplate.opsForValue().get("name");
System.out.println(openId);
}
}
这里我默认使用StringRedisTemplate模板,没有使用默认的RedisTemplate模板,因为RedisTemplate写入的时候序列化,会自动使用默认的jdk序列化,从而导致你存的时候key=name,value = 张三,但是在redis中你查看会发现乱码。
此时你可以按照上面的写法用StringRedisTemplate这个对象,也可以自己定义序列化。
自定义RedisTemplate序列化方式
/**
* @author:
* @date: 2022/3/24 19:13
* @description:
*/
@Configuration
public class RedisConfig {
@Bean("redisTemplate")
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer stringSerializer = new StringRedisSerializer();
template.setConnectionFactory(factory);
// 创建json序列化工具对象
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key的序列化
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
// 设置value的序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
这里需要注意的是redisTemplate被你自己定义成一个Bean的时候,在注入spring容器的时候是不会去覆盖默认的beanName = redisTemplate 的Bean,所以这时候你用@Autowired注解去注释的时候,会出现一个属性注入失败的报错,这时候你应该用@Resource注解去注入,我用的是springboot-2.6.4版本出现的问题。我后来就索性直接不适用自定义的redisTemplate,而是用StringRedisTemplate就很好的规避了这块的问题。
redisson连接
是基于redis实现的分布式,可伸缩的java数据结构集合,包含了诸如map,queue,lock等强大功能
redisson主要是封装了针对redis的一系列的操作的工具包。比如分布式锁的实现等等。
<!--引入redisson组件-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>