文章目录
一、用Redis实现缓存(2024/8/13)
1.什么是Redis序列化
- Redis序列化是指将Redis中的数据结构(如strings、hashes、lists、sets、zsets等)转换为二进制格式,以便在内存和磁盘之间进行存储和传输的过程。
2.为什么要重写Redis序列化
- redis的序列化方式:默认使用JDK方式序列化,该序列化对象必须实现一个接口
- JDK 方式的对象序列化, 对象 ->字符流->二进制。会把对象转成二进制存储,不方便查看,所以要重写redis 序列化方式。
3.RedisTemplate和StringRedisTemplate区别
RedisTemplate 和 StringRedisTemplate 都是Spring Data Redis提供的模板类,用于简化与Redis的数据交互,但它们有特定的关注点:
- RedisTemplate:
这是一个更通用的模板,它提供了一系列操作不同类型数据的接口,包括字符串、哈希、列表、集合和有序集合等。你可以直接对各种键值对数据进行CRUD操作,例如get、set、hmset等。 - StringRedisTemplate:
它是专门针对字符串类型数据设计的,提供了更多的字符串操作方法,如msetnx(原子设置多个键),strlen(获取字符串长度),del(删除键)等。其API通常比RedisTemplate更简洁,专注于处理字符串相关的场景。
两者的区别在于使用场景和效率。如果你的应用只需要对Redis的字符串类型数据进行操作,并希望API更精简,那么StringRedisTemplate是更好的选择。如果需要对多种数据结构进行操作,或者希望使用更全面的功能集,RedisTemplate则更为合适。
4. 如何重写Redis缓存序列化
@Configuration
public class RedisConfig {
/**
* redisConnectionFactory 链接redis工厂
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置序列化Key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置序列化Value的实例化对象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
/**
* 设置Hash类型存储时,对象序列化报错解决
*/
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
4.简单使用
@Autowired
private RedisTemplate<String,Object> redisTemplate;
//object为要使用缓存的实体类
//1.判断redis中有没有该数据,如果存在,就响应数据给请求,否则到2
Object cacheobject = (Object) redisTemplate.opsForValue().get("CACHE:QUERYFRUIT" + id);
if(cachobject!=null){
//ResponseDate<>()是响应的统一返回类,ok()是自定义的响应成功的方法,ObjectDTO是实体类的DTO层,其中有一个自定义构造方法可以将实体类中数据传给DTO中相应字段
return new ResponseData<>().ok(new ObjectDTO(cacheobject));
}
//2.查询数据库中是否有符合请求的信息
Object object= objectMapper.queryById(id);
//3.将该信息传输到redis中下次请求就可以通过redis响应
redisTemplate.opsForValue().set("CACHE:QUERYFRUIT"+id,fruit);
5.用redis做缓存会有下面三个问题
- 缓存穿透(一定要解决)
- 缓存雪崩
- 缓存击穿
925

被折叠的 条评论
为什么被折叠?



