今天在实现店铺相关接口时,学习到了一个重要的技术点:Redis缓存技术
Redis是一个基于内存的key-value结构数据库,是互联网技术领域使用最广泛的存储中间件。
使用方法
1.导入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>2.配置Redis数据源
database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。 port:端口号 host:IP地址,localhost默认代表本机
在application.yml中添加读取application-dev.yml中的相关Redis配置
sky:
redis:
host: localhost
port: 6379
password: 123456
database: 10 3.编写配置类,创建RedisTemplate对象
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}4.通过RedisTemplate对象操作Redis
API | 返回值类型 | 说明 |
|---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | - | 通用的命令 |
使用案例:String
1.设置值
redisTemplate.opsForValue().set("key", "value");2.获取值
Object value = redisTemplate.opsForValue().get("key");其他类型的使用方法也是如此,与上面两个例子差不多。
业务场景
店铺只有营业和打烊两个状态,如果为了这么简单的数据单独建表,成本效益不高。其次,店铺营业状态属于高并发请求类型,MySQL的读写性能并不占优势,因此引入了Redis缓存技术。
实现思路
1.设置店铺营业存储
public static final String KEY = "SHOP_STATUS";
// 存储值:1-营业中,0-打烊中2.设置营业状态
// 设置营业状态
@PutMapping("/{status}")
@ApiOperation("设置营业状态")
public Result setStatus(@PathVariable Integer status){
log.info("设置营业状态为:{}", status == 1 ? "营业中" : "打烊中");
redisTemplate.opsForValue().set(KEY, status);
return Result.success();
}3.获取营业状态(管理端)
// 获取营业状态
@GetMapping("/status")
@ApiOperation("获取营业状态")
public Result<Integer> getStatus(){
Integer shopStatus = (Integer)redisTemplate.opsForValue().get(KEY);
log.info("获取营业状态:{}", shopStatus == 1 ? "营业中" : "打烊中");
return Result.success(shopStatus);
}4.获取营业状态(用户端)
@RestController("userShopController")
@RequestMapping("/user/shop")
public class ShopController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/status")
@ApiOperation("获取营业状态")
public Result<Integer> getStatus(){
Integer shopStatus = (Integer)redisTemplate.opsForValue().get("SHOP_STATUS");
log.info("获取营业状态:{}", shopStatus == 1 ? "营业中" : "打烊中");
return Result.success(shopStatus);
}
}Redis的使用拓展
因为Redis基于内存存储,读写性能高,因此适合处理高并发请求数据,适合存储热点数据。
连接工厂是Spring Data Redis提供的核心组件,负责管理与Redis服务器的连接。
主要功能:
💡 理解要点: 连接工厂就像一个统一的连接管理中心,确保应用程序能够高效、可靠地与Redis服务器通信。
Redis只能存储字符串、数字等基本类型,而我们需要存储的往往是Java对象。序列化器负责将Java对象的Key序列化为Redis可接受的字节数组格式。
常见序列化方式:
JDK序列化方式:
JdkSerializationRedisSerializer(默认方式) String序列化方式:StringRedisTemplate(当前使用) JSON序列化方式:GenericJackson2JsonRedisSerializer或Jackson2JsonRedisSerializer
使用String序列化方式的原因
RedisTemplate可以接收任意类型的对象,并默认采用JDK序列化,转成字节形式进行储存,如\xAC\xED\x00\x05t\x00\x06\xE5\x8C\x97\xE4\xBA\xAC。
但也因为使用的是JDK序列化,导致可读性差、内存占用大的缺点。
因此,我们可以统一使用String序列化器,要求只能存储String类型的Key和Value。当需要存储Java对象时,手动完成对象的序列化和反序列化。这样不仅可以节省额外的内存开销,可读性也更高。
为什么不适用JSON序列化?
使用JSON序列化器虽然可以将Jaava对象自动序列化为JSON字符串。但会记录序列化对应的class名称,如"@class": "com.sky.pojo.user",这样带来了额外的内存开销。
本文为苍穹外卖项目学习笔记,持续更新中…
如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。