什么是redis
redis是使用C语言编写的,是一个非关系型的键值对数据库,数据存储在内存中,所以读写速度非常快,常被用于缓存。
常用应用场景: 缓存、计数器、排行榜等
redis的基本数据类型
缓存穿透、缓存雪崩、缓存击穿
缓存穿透
查询缓存和数据库中不存在的某个值时,一般情况下,如果底层数据库不存在对应的数据,则不会写入到缓存,就会导致每次对这个值的查询请求都会在数据库进行。
解决方法
1、如果是非法请求,在api入口处,对参数进行校验,过滤非法值
2、当查询不到相对应的数据时,设置空值或默认值,失效时间不宜过长
3、当缓存中不存在某个数据时,使用布隆过滤器判断数据是否存在,如果存在才继续往下查询
缓存雪崩
当大量缓存使用相同的失效时间,就会导致缓存在同一时间内同时失效,然后所有请求全部转发到数据库,导致数据库压力增加。
解决方法
1、失效时间使用随机数,让key均匀失效
2、使用双key,主key设置失效时间,备key不设置时间,当主key失效时,返回备key值
3、当不是核心数据时,进行api接口限流
缓存击穿
缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个key失效,而缓存雪崩是大量key失效
解决方法
1、热点数据不设置过期时间,后台异步更新缓存,适用于不严格要求缓存一致性的场景
2、在value内部设置一个比缓存失效时间短的时间标识,当异步发现该值快过期时,延长失效时间并且重新同步数据库数据