黑马点评redis技术梳理

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)

  1. 此注解会生成equals(Object other) 和 hashCode()方法。
  2. 它默认使用非静态,非瞬态的属性
  3. 可通过参数exclude排除一些属性
  4. 可通过参数of指定仅使用哪些属性
  5. 它默认仅使用该类中定义的属性且不调用父类的方法
  6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。

另:@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:

  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
  2. 或者使用在使用@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了
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值