Star描述项目

1.S->situation(背景)

2.T->task(任务)

3.A->action(动作)

4.R->result(结果)


1.S

商店评价平台这个项目主要是一个评价和查看本地商店生活的项目;主要目的是为了,让用户通过这个项目来获取附近商户的信息以及交友等;

我主要负责这个项目的后端开发,使用的是springboot框架+redis缓存中间件+mysql数据库; 其中还使用了redis分布式锁,Redisson可重入的分布式锁, 新的redis数据类型:Geo,bitmap等;以及lua脚本保证多步redis操作原子性等;

主要实现了 商店浏览 , 探店笔记 , 关注推送, 以及优惠券秒杀等功能;

2.T

在这个项目中,我主要负责 高并发秒杀系统以及缓存优化相关功能的实现;

一,Redis缓存优化(缓存穿透、击穿、雪崩)

二,优惠券秒杀系统分布式锁保证并发安全

三,基于Redis Stream实现异步下单

四,附近商户查询,签到功能(Redis GEO,BitMap)

五,关注用户动态推送(Feed流)

一,Redis缓存优化(缓存穿透、击穿、雪崩)

1,缓存雪崩: 短时间大量的缓存同时过期失效

项目中我是通过在过期时间上加上一个时间随机值来实现的防止缓存同时过期的情况

2,缓存穿透: 短时间大量使用大量不存在的key来进行一个查询,导致大量查询打到数据库,对数据库造成极大的压力

有两种防治方法:1.缓存空对象 2.布隆过滤器,添加可能的key,来过滤那些不可能的请求

布隆过滤器使用比较复杂,且我了解工作中应该也使用较少;所以我项目中使用的是缓存空对象的形式来实现的;

3,缓存击穿: 热点key失效,短时间大量的请求查询这个key,导致大量的请求打到数据库,对数据库造成极大的压力

解决方法有: 1.对于热点key实现一个永不过期策略; 2.使用逻辑过期策略,添加一个字段来为户key的过期时间,实际上redis中对key是不加ttl的, 3.使用互斥锁来使得大多数请求只有一个请求能真正打到数据库上,查询数据库,同时建立一个缓存;

项目中主要是通过逻辑过期和使用互斥锁两种策略来防止的缓存击穿;

逻辑过期: