一组命令的集合。一个事务中的所有命令都会被序列化,然后在事务的执行过程中,会按照顺序执行。
注:Redis事务没有隔离级别的概念
Redis单条命令保存原子性,但是事务不保证原子性
编译性异常,会导致事务中所有的命令都不会被执行;运行时异常,如果事务队列中存在语法错误,执行命令的时候,其他命令可以正常执行,错误命令抛出异常
1.开启事务(multi)
2.命令入队(......)
3.执行事务(exec)
discard --取消事务,取消之后,事务队列中的命令都不会被执行
1.rbd保存的文件是dump.rdb
2.触发机制
2.1save的规则满足的情况下,会自动触发rdb规则
2.2执行flushall命令,也会触发我们的rdb规则
2.3退出Redis,也会产生rdb文件
备份就会自动升温一个dump.rdb
3如何恢复rdb文件
3.1只需要将rdb文件放在Redis启动目录就可以,Redis启动的时候回自动检查dump.rdb恢复其中的数据
3.2查看需要存在的位置config get dir
优缺点:
优点:
1.适合大规模的数据恢复
2.对数据的完整性要求不高
缺点:
1.需要一定的时间间隔进程操作。如果Redis意外宕机,那最后一次修改数据就没有了
2.fork进程的时候,会占用一定的内容空间
aof会把我们的命令都记录下来,在恢复的时候就是把这个文件的命令都执行一遍
1.aof保存的文件为appendonly.aof
优缺点
优点:
1.每一次修改都同步,文件的完整性会更好
2.每秒同步一次,可能会丢失一秒的数据
3.从不同步,效率最高
缺点:
1.相对于数据文件来说,aof远远大于rdb,修复速度比rdb慢
2.aof的运行效率比rdb慢,所以我们Redis默认的配置就是rdb持久化
概念:用户想查询的一个数据在缓存中不存在,数据库中也不存在。当有很多用户的时候都会去数据库中查询就会给数据库造成很大的压力,相当于出现了缓存穿透
解决方案:
1.布隆过滤器:对参数进行hash形式的存储,如若要查询就会现在控制层进行校验,避免对底层存储系统造成很大的查询压力
2.缓存空对象:一次查询缓存和数据库中不存在,就在缓存中添加一个空的值
注:如果空值被缓存起来,如果存的空值过多,则需要更多的空间;即使设置过期时间,由于缓存和存储层的数据有一定的时间差,则会干扰业务的一致性效果
概念:一个请求频率很高的键,突然由于有效期到了,然后大量的请求,再回写缓存的过程,造成巨大的压力
解决方案:
1.设置热点数据永不过期
2.加互斥锁
概念:在某一个时间段内,缓存集中失效。
解决方案:
1.Redis高可用--搭建Redis集群
2.限流降级--在缓存失效后,通过加锁或者队列的形式,限制对数据库访问的线程数
3.数据预热--在正式使用之前,通过访问那些大量访问的数据的数据库,先给加载到缓存中去