事物的基本操作
*开启事务
multi
*作用
设定事物的开启位置,此指令执行后,后续的所有指令均加入到事物中
*执行事物
exec
*作用
设定事物的结束位置,同时执行事物,与multi成对出现,成对使用
注意:加入事物的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
*取消事物
discard
*作用
终止当前事务的定义,发生在multi之后,exec之前
事务的工作流程
1.redis缓存雪崩
redis缓存雪崩指的是:一般是由大量的key集中在一段时间内失效,或者redis服务故障所引起的,导致查询请求查不到缓存,大量的请求涌入mysql,它会导致mysql瞬间被大量的流量打死,或者是由于该服务接口访问时间过长,导致耗尽了线程资源,不仅会导致该服务其他接口得不到线程资源,也有可能会使上游服务的资源也全都耗在这,然后引起整个系统的崩溃。
解决方式:1. 若是由于大量key过期所造成的,可以给key的ttl(time to live)设置一个过期时间
2. 若是因为redis服务器宕机所导致的,可以搭建redis集群,保证高可用
3. 可以从请求量层面进行解决,对缓存业务添加限流和服务降级策略
4. 可以添加多级缓存,比如说nginx缓存
二、redis缓存击穿
redis缓存击穿指的是:热点key的过期,从而导致大量访问热点key的请求访问数据库,从而导致数据库压力过大。
解决方式:热点key通常是我们通过后台进行批量添加的,比如秒杀活动,解决热点key失效,可以重建缓存
1. 互斥锁实现:只允许一个线程对redis缓存进行重建,其他线程处于等待状态,可以通过redis当中的setnx实现。缺点是串行化执行,效率低。优点是一致性高。
2. 逻辑过期:给需要缓存的数据添加一个逻辑过期字段,通过对逻辑过期字段的判断,判断数据有无过期,如果过期则开启一个线程进行缓存重建,并且返回之前的数据。缺点是数据的一致性低,优点是相应速度快。
三、redis缓存穿透
redis缓存穿透指的是:redis当中没有数据,数据库当中也没有数据,请求每次都是访问数据库,而数据库有没有数据返回。
解决方式:1. 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力附加 对于空间的利用到达了一种极致,那就是Bitmap 和布隆过滤器 (Bloom Filter) 。 Bitmap: 典型的就是哈希表缺点是, Bitmap 对于每个元素只能记录 1bit 信息,如果还想完成额外的功能,恐怕只能靠牺牲更多的空间、时间来完成了。
布隆过滤器(推荐)
就是引入了 k(k>1)k(k>1) 个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判重的过程。 它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 Bloom-Filter算法的核心思想就是利用多个不同的 Hash 函数来解决 “ 冲突 ” 。 Hash存在一个冲突(碰撞)的问题,用同一个 Hash 得到的两个 URL 的值有可能相同。为了减少冲突,我们可以多引入几个 Hash ,如果通过其中的一个 Hash 值我们得出某元素不 在集合中,那么该元素肯定不在集合中。只有在所有的Hash 函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这便是 Bloom-Filter的基本思想。 Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。
2. 接口层增加校验,如用户鉴权校验, id 做基础校验, id<=0 的直接拦截;
3. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将 keyvalue对写为 key-null ,缓存有效时间可以设置短点,如 30 秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击