redis
已经成为咱们开发中一项必不可少的工具, 本篇主要介绍一下redis
中几个概念 .redis
缓存穿透是指不断的请求缓存中不存在的数据, 则全部请求所有落在了数据库层, 高并发的状况下, 就直接影响了整个系统的业务, 甚至可能致使系统崩溃
一、根据key从缓存中获取数据; 二、若是数据不为空,直接返回; 三、若是数据为空,进行数据库查询; 四、若是从数据库查询出的数据不为空,则放入缓存(设定过时时间) 不断的重复第三步, 好比要查一个商品的信息, 传入 `-1`, 全部请求就直接落在了数据库上
1.设置空对象缓存 数据库取出来的数据若是是空值, 一样也缓存, 可是设置一个比较短的缓存时间, 这样能够必定意义上减缓缓存穿透 2.布隆过滤器 布隆过滤器本质上一种空间效率极高的几率型算法和数据结构,主要用来判断一个元素是否在集合中存在。 // 使用 能够提早将真实正确的key,在添加完成以后便加入到过滤器当中,每次再进行查询时,先确认要查询的key是否在过滤器当中,若是不在,则说明key为非法key,则不须要进行后续的查询步骤了。
缓存雪崩是指缓存中数据大批量同一时间过时或者redis服务挂了,而查询数据量巨大,引发数据库压力过大。
1.商城中缓存了商品的信息,时间为24小时 2.在次日的0点, 正好有一个抢购活动 3.抢购开始的时候, 所有缓存失效, 同一时间所有的商品信息查询落到数据库上, 致使可能压力过大
1.能够在作数据缓存的时候, 按分类进行缓存, 添加不一样的缓存时间 2.缓存的同时, 对缓存时间加上一个随机数, 以致于不会让全部缓存同一时间大量失效 3.对于redis服务挂掉的问题,能够实现redis的高可用主从架构, 而且作redis的持久化, 在redis挂掉的同时时读取本地缓存数据, 同时恢复redis服务加载持久化的数据
缓存击穿和缓存雪崩有点像, 不过不是大面积的缓存失效 缓存击穿指的是缓存中某一个key的值不断的接收着大量的请求, 而在这个key值失效的瞬间, 大量的请求落在了数据库上, 从而致使数据库可能压力过大
1.有key1,key2...等键值对应的缓存 2.key1属于热度商品, 不断的扛着请求 3.key1过时时间到了, 请求瞬间落在了数据库上, 致使可能压力过大
一、加分布式锁或者分布式队列 用加分布式锁或者分布式队列的方式保证缓存的单线程写,从而避免失效时大量的并发请求落到底层存储系统上。在加锁方法内先从缓存中再获取一次(防止另外的线程优先获取锁已经写入了缓存),没有再查DB写入缓存。 (固然也能够: 在没有获取锁的线程中一直轮询缓存,至超时) 二、添加超时标记 在缓存的对象上增长一个属性来标识超时时间,当获取到数据后,校验数据内部的标记时间,断定是否快超时了,若是是,异步发起一个线程(控制好并发)去主动更新该缓存。 三、另外还有一个粗暴的方法,若是你的热点数据要求实时性比较低,那么能够设置热点数据在热点时段不过时,在访问低峰期过时,好比天天凌晨过时。