前序:
默认使用SimpleCacheConfiguration 组件 ConcurrentMapCacheManager==ConcurrentMapCache 将数据保存在ConcurrentMap 中
开发中使用缓存中间件: redis , memcache ,ehcache
安装redis流程:
1.安装redis ,使用docker docker命令:
docker pull redis
docker images
docker run -d -p 6379:6379 --name myredis docker.io/redis
2.引入redis的starter
org.springframework.boot
spring-boot-starter-data-redis
3.配置redis
spring.redis.host =192.168.0.133
配置完成后Redis客户端console测试:
String测试: append msg hello 插入key为msg,value为hello append msg world msg的值变为 helloworld get msg 获得msg的值 list测试:
lpush mylist 1 2 3 4 5
从左边往里面插入
那么值就是 5 4 3 2 1
lpop mylist
弹出左边的5 值为 4 3 2 1
rpop mylist
弹出右边的1 值为 4 3 2
set测试:
sadd myset zhangsan lisi
增加一个set集合(无序)不可重复
sadd myset lisi
返回0 因为已经存在
smembers myset
查看myset 集合里面的值
sismember myset wangwu
判断myset集合里面是否存在wangwu 元素 如果有返回1 没有返回0
代码测试:
@Autowired
RedisTemplate redisTemplate; // 操作k-v都是对象的
@Autowired
StringRedisTemplate stringRedisTemplate; // 操作字符串用
@Autowired
RedisTemplate empRedisTemplate;
/*
* String,List(列表),Set(集合),Hash(散列),ZSet(有序集合)
* stringRedisTemplate.opsForValue() 【操作string字符串的】
* stringRedisTemplate.opsForList()
* stringRedisTemplate.opsForSet()
* stringRedisTemplate.opsForHash()
* stringRedisTemplate.opsForZSet()
*/
@Test
public void redisTest01(){
// 给redis中添加数据
// stringRedisTemplate.opsForValue().append("msg","hello");
// String ss= stringRedisTemplate.opsForValue().get("msg");
// System.out.println(ss);
stringRedisTemplate.opsForList().leftPush( "mylist","1");
stringRedisTemplate.opsForList().leftPush( "mylist","2");
stringRedisTemplate.opsForList().leftPush( "mylist","3");
}
// 保存对象测试
@Test
public void redisTest02(){
Employee emp = employeeMapper.getEmpById(1);
// 默认如果保存对象使用gdk,使用jdk序列化机制,序列化后的数据保存到redis中
// redisTemplate.opsForValue().set("emp",emp);
// 解决方法:
// 1.把对象转为json
// 2.根据redisTemplate默认得序列话规则为gdk,重新配置新的RedisTemplate改变其序列化规则
empRedisTemplate.opsForValue().set("emp-1",emp);
}
@Autowired
EmployeeMapper employeeMapper;
@Test
public void contextLoads() {
Employee emp = employeeMapper.getEmpById(1);
System.out.println(emp.toString());
}
插入redis值乱码,重新配置新的RedisTemplate改变其序列化规则方法: 思路: 1.redis starter 引入后 ,在RedisAutoConfiguration类中有两个加入容器的方法
2.类实现序列化
public class Employee implements Serializable
3.按照其格式,重写RedisTemplate方法,并且加入容器中。
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer ser = new Jackson2JsonRedisSerializer(Employee.class );
template.setDefaultSerializer(ser);
return template;
}
}
setDefaultSerializer()方法: