Appearance
业务篇
1.谈谈你使用Redis时印象比较深的优化场景。
首先是用的比较多的验证码,借助Redis实现定时过期,一分钟内不可重复发送的功能;
有一个印象比较深的优化经历,我曾开发的一个项目有文章阅读的功能,最开始是使用Redis的自增incr命令实现,但是发现项目运行CPU总是跑慢,但是找不到问题所在,后来通过Skywalking监控发现,是频繁的自增请求导致CPU超负荷。
- 解决方案是设计二级缓存
- 一级缓存存入内存:毫秒/1000605,得到时间块,这个时间块作为map的key,<5分钟的时间块,Map<文章Id,访问量>>
- 二级缓存定时存入Redis:定时器每5分钟从内存将阅读量存入Redis,如果key小于当前时间块就刷入Redis
2.那么对于List还有什么使用场景?
- 直播的区域排行榜,因为List支持根据下标计算,有些时候可能会把某些主播放到榜单的某个位置,
- 所有高并发设计分页的场景,比如淘宝聚划算等,通过lrange命令获取分页数据(根据start,end值)
- 数据是定时替换的,不过替换的过程可能会带来缓存击穿问题
- 微信的抢红包
3.缓存击穿问题如何解决?
设置两个缓存区域A和B,内容是一样的,先更新B再更新A,如果A查询不到去B查询。
4.你说List可以实现抢红包,如何实现?
- 包红包:将红包随机拆解成N个,放入List结构
- 每次取出使用弹出leftPop功能,这是一个原子操作,不涉及并发问题
5.对于购物车功能你有什么好的解决方案吗?
- Map<String,Map<String,String>>
- 第一层Map,Key是用户id
- 第二层Map,Key是购物车中商品id,Value是购物车数据
6.Hash结构还有什么实际用法吗?
短链接
7.Set集合有哪些使用场景?
- 用户画像去重:直接把标签往里加,不考虑集合是否有值的。
- 求两个用户的共同好友,以及不属于某个用户的好友,再结合用户标签可实现用户推荐
- 黑名单校验器
- 点赞去重
8.Redis为什么这么快?
基于单线程和内存,IO使用多路复用技术。6.0引入多线程主要也是为了解决网络IO,读写仍然是单线程,因此原子操作依然可以处理并发问题。
6.0之前也只有网络和读写是单线程,本地IO等都是多线程的。
9.Redis 支持哪几种数据类型?
字符串、Hash、List、Set、Sorted Set(有序集合)、Geolocation(GEO)
10.什么是GEO?
Redis用于存储地理位置的结构,可以计算两个位置的距离,可以计算圆心在半径内的坐标。
11.缓存穿透、缓存击穿、缓存雪崩分别是什么意思?如何解决?
- 缓存穿透:查询一个不存在的key,数据直接流向DB;解决方式是即使为空也进行缓存。
- 缓存击穿:某key过期,导致并发请求流入DB;解决方式是设置定时任务对热点数据提前缓存更新,或设置过期时间为一个动态值,不至于整个系统都被击穿。
- 缓存雪崩:多个key同时失效。把不同key设置不同时间。