从SpringBoot2.x之后,原先使用的Jedis被lettuce替代
-
Jedis:采用直连,模拟多个线程 *** 作会出现安全问题。为避免此问题,需要使用Jedis Pool连接池!类似于BIO模式
-
lettuce:采用netty网络框架,对象可以在多个线程中被共享,完美避免线程安全问题,减少线程数据,类似于NIO模式
Jedis的@ConditionalOnClass注解中有两个类是默认不存在的,所以Jedis是无法生效的
Lettuce是存在这个类的,所有Lettuce生效
Spring的所有配置类都有一个自己的自动配置类 xxxAutoConfiguration
并且在spring.factories中也一定能找到这个类的完全限定名
自动配置类都会绑定一个properties配置文件 xxxProperties
那么就一定还存在一个RedisProperties类
RedisAutoConfiguration源码@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
// @Import注解导入了两个配置类,有Lettuce和Jedis,
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate") //我们可以自己定义一个redisTemplate来替换这个默认的!
public RedisTemplate
只有两个简单的Bean
- RedisTemplate
- StringRedisTemplate
当看到xxTemplate时可以对比RestTemplat、SqlSessionTemplate,通过使用这些Template来间接 *** 作组件。那么这俩也不会例外。分别用于 *** 作Redis和Redis中的String数据类型。
在RedisTemplate上也有一个条件注解,说明我们是可以对其进行定制化的
如何编写配置文件然后连接Redis,就需要阅读RedisProperties
这是一些基本的配置属性。
还有一些连接池相关的配置。注意使用时一定使用Lettuce的连接池。
导入依赖
org.springframework.boot
spring-boot-starter-data-redis
编写配置文件
# 配置redis
spring.redis.host=127.0.xxx.xxx
spring.redis.port=6379
@SpringBootTest
class Redis02SpringbootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
// redisTemplate *** 作不同的数据类型,api和我们的指令是一样的
// opsForValue *** 作字符串 类似String
// opsForList *** 作List 类似List
// opsForHah
//...
// 除了基本的 *** 作,我们常用的方法都可以直接通过redisTemplate *** 作,比如事务和基本的CRUD
// 获取连接对象
//RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//connection.flushDb();
//connection.flushAll();
redisTemplate.opsForValue().set("mykey","kuangshen公众号");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
}
去redis查看数据,发现出现乱码问题(原因是没有序列化)(在网络中传输的对象也是一样需要序列化,否者就全是乱码。)
查看RedisTemplate代码
默认序列化器是采用JDK序列化器
自定义RedisTemplete(RedisConfig)@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
// RedisTemplate对象,使用更方便
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
//Json的序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// String的序列化配置
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
自定义Redis工具类
使用RedisTemplate需要频繁调用.opForxxx然后才能进行对应的 *** 作,这样使用起来代码效率低下,工作中一般不会这样使用,而是将这些常用的公共API抽取出来封装成为一个工具类,然后直接使用工具类来间接 *** 作Redis,不但效率高并且易用。
工具类参考博客:
https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html
https://www.cnblogs.com/zhzhlong/p/11434284.html
测试工具类@Autowired
private RedisUtil redisUtil;
@Test
void test() {
redisUtil.set("name","张三");
System.out.println(redisUtil.get("name"));
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)