前序:
默認使用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()方法:

