redis基础知识
好记性不如烂笔头!
redis事物
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
相关命令
1)MULTI
MULTI 开始一个事务, 然后将多个命令入队到事务
2)EXEC
命令触发事务
3)DISCARD
事物回滚,将之前对列中的命令清除
4)WATCH
当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的,在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
5)UNWATCH
清除所有先前为一个事务监控的键
如下命令执行(测试multi、exec命令):
在一个终端1中正常执行如下
测试两个终端下,添加watch监控,查看执行结果
终端1执行
终端2改变name的值
终端1执行exec
发现事物没有执行成功,因为监控到name的值出现了改变,所以进行了事物的回滚!
缓存击穿、缓存穿透、缓存雪崩
参考文章如下:
原文链接1
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
缓存击穿
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
办法:
热点数据到期导致大量数据打到数据库上。
加上互斥锁,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
缓存穿透
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
办法:
布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
将空设置进缓存,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
办法:
缓存的失效时间错开,加入随机的一个时间,保证不都在同一时间打到数据库上
加上锁,同缓存穿透