每日八股day11
### 本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写,如有错误纯属本人实力不佳,欢迎各位大佬阅读指正 ###
1.Redis 是什么?为什么叫高性能?
Redis是基于内存的高性能非关系型数据库。
为什么高性能:
基于内存操作,没有磁盘IO开销。
单线程模型,避免线程切换与锁竞争,CPU利用率高,命令串执行高效。
IO多路复用,采用非阻塞IO,单个线程同时监听多个连接,有事件才处理,并发强
高效的数据结构和简单命令,复杂度低,执行速度快。
避免频繁内存拷贝。
单线程避免了并发安全问题。
补充:Redis 单线程为什么还能抗高并发?
使用IO多路复用,单线程同时监听大量连接,非阻塞处理。
基于内存操作,命令执行极快,耗时极短。
单线程避免锁竞争,线程切换等开销,CPU利用率高。
整体无阻塞,单线程也能达到极高QPS。
2.Redis 支持的数据类型有哪些?
5 大基础:
String,Hash,List,Set,ZSet/SortedSet
3 大特殊:
Bitmap(位图)基于String实现,按bit操作用于签到,用户在线状态,布隆过滤器。
HyperLogLog,做基数统计用于UV,独立访客统计。
GEO(地理信息),经纬度存储,距离计算,用于附近的人,附件门店。
高级类型:
Stream,持久化消息队列,支持消费者组用于可靠消息,日志采集。
Module(扩展类型),如RedisJOSN,RedisTimeSeries等。用于支持JSON,时序,全文检索。
追问:Stream 作用?和 List 做队列区别?
Stream是持久化消息队列,支持消费者组,消息确认,回溯。
List不支持ACK,消息取出就丢,不适合可靠消息。
3.Redis 常用应用场景有哪些?
热点数据缓存(核心),减轻DB压力,提升读取速度,用于商品信息,用户信息,配置。
分布式锁,SETNX/Redisson,解决分布式系统并发安全问题。
计数器/限流,INCR,DECR,用于点赞数,阅读数,接口限流,IP限流。
会话存储(Session共享),替代服务器Session,用于集群环境统一登陆态。
消息队列,简单队列,异步任务,高级用Stream。
排行榜,ZSet有序集合,用于积分排行,热度排行等。
去重、交集/并集,Set用于共同好友,去重。
签到、用户状态,Bitmap用于布隆过滤器,签到统计,在线状态。
附近的人,GEO。
分布式ID生成,INCR/INCRBY,全局唯一ID。
延迟任务,ZSet,订单超时未支付自动取消。
追问:Redis 做缓存三大问题:穿透、击穿、雪崩
穿透:查询不存在的数据,使用布隆过滤/缓存空值。
击穿:热点key过期,使用互斥锁永不过期。
雪崩:大量key同时过期,使用过期时间加随机值/集群+多级缓存。