d1sbb


Home | Message | Rev Shell | About | Links

SpringBoot和Redis笔记


SpringBoot笔记

SpringBoot接口开发的常用注解有哪些?

@Controller 标记此类是一个控制器,可以返回视图解析器指定的html页面,通过@ResponseBody可以将结果返回ison xml数据
@RestController 相当于@ResponseBody加@Controller,实现rest接口开发,返回ison数据,不能返回html页面
@RequestMapping 定义接口地址,可以标记在类上也可以标记在方法上,支持http的postput get等方法
@PostMapping 定义post接口只能标记在方法上用于添加记录复杂条件的查询接口
@GetMapping 定义get接口只能标记在方法上用于查询接口的定义
@PutMapping 定义put接口只能标记在方法上用于修改接口的定义
@DeleteMapping 定义delete接口只能标记在方法上用于删除接口的定义
@RequestBody 定义在方法上用于将json串转成java对象
@PathVarible 接收请求路径中占位符的值.
@ApiOperation swagger注解对接口方法进行说明
@Api wagger注解对接口类进行说明
@Autowired 基于类型注入
@Resource 基于名称注入,如果基于名称注入失败转为基于类型注入

异步线程调用

①:在自动审核的方法上加上@Async注解(标明要异步调用)
②:在文章发布成功后调用审核的方法
③:在自媒体引导类中使用@EnableAsync注解开启异步调用

循环依赖

看了下关系:岗位是挂组织的: PositionServicelmpl 有调用 OrgServicelmpl 组织里面有查询人员: OrgServicelmpl 有调用 UserServicelmpl 人员是查组织岗位的: UserServicelmpl 有调用 PositionServicelmpl 这样就变成循环依赖了。而且OrgServicelmpl 里面还有@Async 的使用。 处理方式一: 使用延迟加载Q: @Lazy的使用

@Resource
@Lazy
private IUserService userService;

redis

#注释掉这部分,这是限制redis只能本地访问
bind 127.0.0.1
#默认yes,开启保护模式,限制为本地访问
protected-mode no
#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方#式启动redis失败
daemonize no
#redis持久化(可选)
appendonly yes
#设置密码
requirepass 123321

docker run --restart=always \
-p 6379:6379 \
--name myredis \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
-d redis:latest redis-server /etc/redis/redis.conf \
--appendonly yes


穿透无中生有key,布隆过滤null隔离。
缓存击穿过期key,锁与非期解难题。
雪崩大量过期key,过期时间要随机。
面试必考三兄弟,可用限流来保底。

redis做为缓存,mysql的数据如何与redis进行同步呢? (双写一致性)

1. 介绍自己简历上的业务我们当时是把文章的热点数据存入到了缓存中虽然是热点数据,但是实时要求性并没有那么高所以我们当时采用的是异步的方案同步的数据
2. 我们当时是把抢券的库存存入到了缓存中这个需要实时的进行数据同步为了保证数据的强一致,我们当时采用的是redisson提供的读写锁来保证数据的同步

介绍一下异步的方案(介绍一下redisson读写锁的这种方案)

允许延时一致的业务采用异步通知
 使用MQ中间中间件更新数据之后通知缓存删除
 利用canal中间件不需要修改业务代码伪装为mysql的一个从节点canal通过读取binlog数据更新缓存
        
强一致性的采用Redisson提供的读写锁
 共享锁读锁readLock加锁之后其他线程可以共享读操作
 排他锁独占锁writeLock也叫加锁之后阻塞其他线程读写操作