什么是 Redis?
Redis是一种基于内存的数据库,对数据的读写操作都是再内存中完成的,因此读写操作非常快,常用于缓存,消息队列,分布式锁等场景
redis支持String,list,hash,set,zset等数据类型,并对数据操作都是原子性的,因为执行命令由单线程负责,不存在并发竞争问题。此外redis还支持事务,持久化,lua脚本,多种集群方案(主从,哨兵,切片),发布/订阅模式,内存淘汰机制,过期删除策略等等。
Redis 数据结构
Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
string的应用场景:缓存对象,分布式锁,共享token等
List的应用场景:消息队列
Hash的应用场景:缓存对象,购物车等
Set的应用场景:聚合计算(并集,交集,差集),比如点赞,共同关注等
ZSet的应用场景:比如说排行榜,电话、姓名等
Redis 线程模型
Redis 是单线程吗?
redis的单线程指的是 接受客户端请求->解析请求->进行数据读写等操作->发送数据给客户端 这个过程是由一个线程来完成的,这也是我们常说redis是单线程的原因。但是Redis程序并不是单线程,Redis再启动的时候是会启动后台线程BIO的,再2.6版本会启动2个后台线程,分别处理关闭文件和AOF刷盘两个任务,4.0版本后新增了一个用来异步释放Redis内存,也就是lazfree线程
为什么Redis是单线程还这么快?
1.因为Redis大部分操作都是再内存里面运行的
2.Redis采用的单线程模型可以便面多线程之间的竞争
3.Redis采用I/0多路复制机制处理了大量的客户端So'c'ket请求
Redis的持久化
一。RDB快照
将某一个时刻的内存数据,以二进制方式快到到硬盘
二。AOF日志
每执行一条sql,就把该命令追加到AOF文件里面
三。混合持久化方式
集成了 AOF 和 RBD 的优点;
Redis集群
要想设计一个高可用的 Redis 服务,一定要从 Redis 的多服务节点来考虑,比如 Redis 的主从复制、哨兵模式、切片集群。
Redis 过期删除与内存淘汰
过期删除
1.惰性删除策略
2.定时删除策略
内存淘汰
Redis 内存淘汰策略共有八种,这八种策略大体分为「不进行数据淘汰」和「进行数据淘汰」两类策略
如何避免缓存雪崩、缓存击穿、缓存穿透
缓存雪崩
缓存雪崩实在某一个时间,设置缓存的键大面积失效的情况,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩
对于缓存雪崩的情况我们一般又两种处理方案
1.将缓存时间随机打散
2.设置缓存不过期
缓存击穿
缓存击穿就是当一个热点数据,再大量访问缓存的时候,这个缓存失效了,大量请求直接打到数据库上,造成数据库压力过大的情况。
应对缓存己算我们一般有2种处理方案
1.不设置过期时间
2.互斥锁的设计。保证同一时间只有一个业务线程请求缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
缓存穿透
当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。
应对缓存穿透的方案,常见的方案有三种。
1.非法请求限制
2.设置不正常数据的空值或者默认值
3.使用布隆过滤器判断数据是否再数据库存在,避免不曾存的数据打到数据库上面