HM新出springboot入门项目《苍穹外卖》,笔者打算写一个系列学习笔记,“苍穹外卖项目解读”,内容主要从HM课程,自己实践,以及踩坑填坑出发,以技术,经验为主,记录学习,也希望能给在学想学的小伙伴一个参考。
注:本文章是直接拿到项目的最终代码,然后从代码出发,快速逆向学习技术经验! 可能需要一些前置知识
觉得文章有用可以关注点赞收藏期待更新^^,期待您的评论留言
苍穹外卖项目解读(一) 完整代码本地部署运行
苍穹外卖项目解读(二) 管理端JWT令牌、AOP注解开发、分页
苍穹外卖项目解读(三) redis、cache缓存解读
摘自https://ac.nowcoder.com/discuss/1139639?type=0&channel=-1&source_id=discuss_terminal_discuss_hot_nctrack
Redis
:(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操作是原子性的。
基本数据类型
:
1、String:最常用的一种数据类型,String类型的值可以是字符串、数字或者二进制,但值最大不能超过512MB。
2、Hash:Hash 是一个键值对集合。
3、Set:无序去重的集合。Set 提供了交集、并集等方法,对于实现共同好友、共同关注等功能特别方便。
4、List:有序可重复的集合,底层是依赖双向链表实现的。
5、SortedSet:有序Set。内部维护了一个score的参数来实现。适用于排行榜和带权重的消息队列等场景。
优点
:
1、基于内存操作,内存读写速度快。
2、支持多种数据类型,包括String、Hash、List、Set、ZSet等。
3、支持持久化。Redis支持RDB和AOF两种持久化机制,持久化功能可以有效地避免数据丢失问题。
4、支持事务。Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
5、支持主从复制。主节点会自动将数据同步到从节点,可以进行读写分离。
6、Redis命令的处理是单线程的。Redis6.0引入了多线程,需要注意的是,多线程用于处理网络数据的读写和协议解析,Redis命令执行还是单线程的。
缺点
:
1、对结构化查询的支持比较差。
2、数据库容量受到物理内存的限制,不适合用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的操作。
3、Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
更详细的redis相关知识请大家自行搜罗学习
spring:
redis:
host: localhost //redis服务主机地址
port: 6379 //主机port
password: 123456 //redis服务密码
database: 1 //redis服务使用那个库db01
--------springframework RedisTemplate子类 StringRedisTemplate-----
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {//设置序列化器 string
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory); //连接工厂
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
-------------------项目的redisconfg------------------------------------
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
操作redis,在服务端我们根据我们需求需要的类型,并是用opsForxxx()调用相关数据结构的存储
此外,简单的redis操作就是存、取、更新、删(过期),建议读者深入了解、系统学习redis
1、SpringCache
是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项。
2、Spring Cache利用了AOP
,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了,做到了对代码侵入性做小。
3、由于市面上的缓存工具实在太多,SpringCache框架还提供了CacheManager接口,可以实现降低对各种缓存框架的耦合。它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案,比如Caffeine、Guava Cache、Ehcache。
缓存的实现底层技术支持是CGLib动态代理,在目标方法调用前、后分别追加相应的缓存操作,以达到添加缓存、更新缓存、删除缓存的操作。
(1)EnableCaching
标注于SpringBoot应用启动类上,添加此注解表示开启Spring Cache缓存;移除表示关闭缓存。如果在全局配置文件中添加如下配置,即使在启动类上标注EnableCaching注解,Spring Cache缓存然后是关闭状态。
spring:
cache:
type: none
如果应用中自定义独立于Spring容器的缓存,则不受此配置影响。
(2)CacheConfig
标注于类上,更具体的说是标注于业务服务类上。统一配置如下参数信息:
在类上统一进行配置,类下的方法自动继承相应的配置。
(1)Cacheable
添加缓存的核心注解,分两种情况:一是对应key值未有缓存数据,先执行方法,然后根据condition和unless条件决定是否添加缓存;二是对应key值已有缓存,不执行方法体,直接返回数据。
(2)CachePut
(3)CacheEvict