在线快速创建SpringBoot项目
redis 官网
redis 官网中文版
redis在线学习工具(免安装版本)
分布式缓存Redis客户端
1,自带客户端 redis-cli
2,可视化工具
3,语言客户端:java
·jedis
1,jedis是直连模式,在多个线程间共享一个Jedis实例时是线程不安全的,需要使用线程池
2,其API提供了比较全面的Redis命令支持,相比于其他的Redis二次封装的更加原生
3,jedis中的方法调用都是比较底层的暴露的Redis的API,Java方法几乎和Redis的API保持一直
4,使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作
·lettuce
1,高级Redis客户端,用于线程安全同步,异步和响应使用
2,基于netty的事件驱动,可以在多个线程之间并发访问,通过异步的方式可以更好的利用系统资源[添加链接描述](https://start.spring.io/)
SpringBoot中基于StringDataRedis的RedisTemplate简单使用:
添加依赖 spring-boot-starter-data-redis:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
class ApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
/**
* redis数据类型
*/
@Test
void redisTest1() {
// 操作 String 基本的K-V操作
ValueOperations valueOperations = redisTemplate.opsForValue();
// 操作 List数据类型
ListOperations listOperations = redisTemplate.opsForList();
// 操作 Set数据类型
SetOperations setOperations = redisTemplate.opsForSet();
// 操作 Hash数据类型
HashOperations hashOperations = redisTemplate.opsForHash();
// 操作 ZSet数据类型
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
/**
* redis String链式操作数据类型
* 当前操作使用Redis可视化工具会产生乱码
* 但是不影响我们的操作使用
*/
@Test
void redisStringTest1() {
// 操作 String 基本的K-V操作
redisTemplate.opsForValue().set("name","123");
}
/**
* redis String 链式操作数据类型
*/
@Test
void redisStringTest2() {
// 操作 String 基本的K-V操作
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
}
}
SpringBoot中基于StringDataRedis的RedisTemplate和stringRedisTemplate的区别:
/**
* redis String链式操作数据类型
* redisTemplate默认采用的是JDK序列化策略,会将数据系列化成为字节数组保存至redis数据库中,不影响我们的操作使用
* stringRedisTemplate默认采用的是String序列化策略
* 因为序列化策略的不同导致两者的数据是不互通的
*/
@Test
void redisStringTest1() {
// 操作 String 基本的K-V操作
redisTemplate.opsForValue().set("name","123");
stringRedisTemplate.opsForValue().set("name_to_str","123+name_to_str");
}
/**
* redis String 链式操作数据类型
*/
@Test
void redisStringTest2() {
// 操作 String 基本的K-V操作
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
String name_to_str = stringRedisTemplate.opsForValue().get("name_to_str");
System.out.println(name_to_str);
}
StringDataRedis的RedisTemplate的策略配置:
自定义redis序列化方式,提供了多种可选择策略:
1,JdkSerializationRedisSerializer:
·POJO对象的存取场景,使用JDK本身序列化机制
·默认机制 ObjectInputStream/ObjectOutputStream进行序列化操作
2,StringRedisSerializer
·Key或者value为字符串
3,Jackson2JsonRedisSerializer
·利用jackson-json工具,将pojo实例序列化成json格式存储
4,GenericFastJsonRedisSerializer
·另一种javabean与json之间的转换,同时也需要指定Class类型
RedisTemplate的策略配置工具类:
package com.example.fenredis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerializer 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置String K-V序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hash K-V序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//设置支持事务
// redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
配置好以上的redis策略后就可以获取到:
@Test
void redisStringTest1() {
// 操作 String 基本的K-V操作
redisTemplate.opsForValue().set("name1","123");
}
/**
* redis String 链式操作数据类型
*/
@Test
void redisStringTest2() {
// 操作 String 基本的K-V操作
String name = (String) redisTemplate.opsForValue().get("name1");
System.out.println(name);
String name_to_str = stringRedisTemplate.opsForValue().get("name1");
System.out.println(name_to_str);
}