文章目录
springboot项目的概念解惑
token
session
cookie
三者介绍及区别
threadlocal
entity
entity(实体类)的作用一般是和数据表做映射。
POJO
普通java对象,除了属性和get、set方法外不包含具体的业务逻辑方法,和Entity区别在于没有和数据表中字段一一对应。
POJO(Plain Ordinary Java Object):在本规约中,POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
BO(Business Object):业务对象。可以由Service层输出的封装业务逻辑的对象。
**Query:**数据查询对象,各层接收上层的查询请求。额外规定:【强制】超过2个参数的查询封装,禁止使用Map类来传输。
VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
mapper
相当于是dao层,继承BaseMapper不用额外写什么就可以完成简单的单表查询功能了,传入entity类。参数是entity类。
各种注解的含义和作用:
@TableName(“tb_blog”)
注解在entity目录下的类上,映射entity和表名。
@Component
注解本质上就是一个类,开发中我们可以使用注解取代xml配置文件。
@component是spring中的一个注解,它的作用就是实现bean的注入。在Java的web开发中,提供3个@Component注解衍生注解(功能与@component一样)分别是:
1、@Controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层。
2、@Service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理
3、@Repository(实现dao访问) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
而@Component泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
@Bean
@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,方法的返回值是bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
@RestController
@RestController 是@controller和@ResponseBody 的结合
@Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。
@ResponseBody 它的作用简短截说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其他Object,它会以Json字符串的形式返回给客户端
@Autowired
默认通过类型注入,如存在多个类型则通过名称注入。
@Resource
默认通过名称注入,如名称无法找到,则通过类型注入。
@Configuration
使用注解@Configuration,告诉Spring Boot这是一个配置类。
@RequestMapping(“/user”)
@RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
@PathVariable
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
@Transactional
将标签放置在需要进行事务管理的方法上
@MapperScan(“com.hmdp.mapper”)
作用:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类。添加位置:是在Springboot启动类上面添加
@SpringBootApplication
我们使用springboot时单单只使用了几个注解,就能够完成spring ioc容器的功能,这是因为我们在主方法中加入了@SpringBootApplication这个注解
@EqualsAndHashCode(callSuper = true/false)
- 此注解会生成equals(Object other) 和 hashCode()方法。
- 它默认使用非静态,非瞬态的属性
- 可通过参数exclude排除一些属性
- 可通过参数of指定仅使用哪些属性
- 它默认仅使用该类中定义的属性且不调用父类的方法
- 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。
另:@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
修复此问题的方法很简单:
- 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
- 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
@Accessors
@Accessors 注解用来配置lombok如何产生和显示get和set的方法,@Accessors(chain = true)加上参数以后就可以开启链式编程.
开发经验
前端vue可以用alert调试
先删数据库还是缓存
删缓存快,更新数据库慢。先更新数据库再删缓存
缓存更新策略
缓存穿透
缓存雪崩
缓存击穿
redis实现全局唯一ID
序列号为redis自增值。
redis实现秒杀
乐观锁超卖问题
一人一单:
把查询用户是否已经有订单和扣减库存创建新订单加悲观锁(注意锁的粒度),放到一个事务里面。
集群环境下synchornize失效:分布式锁
分布式多个jvm,锁只能单个jvm生效。
分布式锁redis实现。
分布式锁的误删及解决:某个线程阻塞了,锁自己释放了,但是阻塞完毕之后线程又释放了锁,这时锁的获取者是别的线程,把别的线程的锁释放掉了。改进:存入线程表示。
但是判断和释放不是原子性的。解决:lua脚本。
redisson优化
上述锁的问题:不可重入。
为什么要可重入:防止同一个线程多次获取同一把锁产生死锁。
可重入解决逻辑
最终方案
超卖问题:
一人一单:基于redisson分布式锁
redis消息队列
Stream数据结构
点赞一人一赞
共同关注
redis set求交集
feed流
按照时间(某个字段)排序的数据结构。
SortedSet
附近商铺
基于地理坐标搜索
GEO
用户签到
bitmap
uv统计
HyperLogLog
不太重要pass了