前序:
默认使用SimpleCacheConfiguration 组件
ConcurrentMapCacheManager==ConcurrentMapCache
将数据保存在ConcurrentMap<Object,Object> 中
开发中使用缓存中间件:
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 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 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<Object,Employee> 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<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Employee> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class); template.setDefaultSerializer(ser); return template; } }
setDefaultSerializer()方法: