Redis事务处理流程
-
Redis服务器接受客户端命令
-
检查客户端是否处于事务状态
-
是,则将命令放入事务队列中
-
向客户端返回QUEUED字符串(表示命令已入事务列队)
-
-
否,则直接执行命令
-
向客户端返回命令执行结果
-
-
Redis事务错误
-
调用EXEC之前的错误 (语法错误/事务回滚)
-
有可能是由于语法有误导致,也可能是由于内存不足导致
-
只要出现某个命令无法成功写入缓冲队列的情况,redis 都会进行记录,在客户端调用EXEC 时,redis 会拒绝执行这一事务
-
-
调用EXEC之后的错误(数据类型错误/事务不回滚)
-
redis 不会理睬这些错误,而是继续向下执行事务中的其他命令
-
对于应用层面的错误,并不是 redis 自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来的其他命令的执行
-
watch命令使用
Redis事务中watch命令的作用是监视key是否被改动(可同时监视多个key)
-
如果 watch 监视的 key 在执行事务 exec 命令之前没有被改动,则 watch 命令不做任何操作,事务可以正常执行
-
如果 watch 监视的 key 在执行事务 exec 命令之前有被改动过,则在执行事务 exec命令时就会返回 nil,事务无法执行
可以利用 watch 命令实现类似于数据库“乐观锁”的效果
Redis缓存系统常见问题及解决方案
缓存穿透问题
-
什么是缓存穿透
当用户在 Redis 缓存系统执行一条无效查询时,这条无效查询将穿透 Redis 缓存系统并MySQL 数据库请求数据,而 MySQL 数据库也获取不到数据
解决方案1>
缓存空对象
用户查询Redis缓存和MySQL数据库中都不存在的数据时,MySQL会返回一个空对象。并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。
-
优点
-
机制原理和实现比较简单
-
代码修改维护容易
-
-
缺点
-
会带之Redis缓存中产生大量空对象
-
会占用许多内存控件
-
会浪费许多资源(可设置缓存空对象过期时间)
-
解决方案2>
布隆过滤器
的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,只要参数设置的合理,它的精确度可以控制的一个期望精确值
-
解决方案
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap拦截掉,从而避免了对底层数据库的查询压力
布隆过滤器在空间效率和查询效率都非常高
缓存击穿
缓存击穿是指 Redis 缓存中有一些的热点数据 key 同时过期失效,或有一些非热点数据key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis 缓存,涌入MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃
解决方案
-
Redis高可用
搭建 Redis 主从架构或集群架构
-
限流降级
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个 key只允许一个线程查询数据和写缓存,其他线程等待
-
数据预热
将部分可能大量访问的热点数据提前加载到 Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的 key
-
不同时期时间
设置不同的过期时间让缓存失效的时间点尽量均匀
Redis持久化
为什么需要持久化
Redis对数据的操作基于内存,意外情况会导致Redis中的数据丢失,无法恢复。持久化机制使得Redis在下次重启时可以利用之前持久化的文件进行数据恢复。
以下二者同时使用
RDB
-
RDB(Redis DataBase)
把当前数据生成快照保存在硬盘上
可以手动触发:save和bgsave
也可以自动触发:bgsave
-
优点
紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快。
-
缺点
每次进行
bgsave
操作都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。
AOF
AOF (Append Only File,即只允许追加不允许改写的文件) 方式就是将执行过的写指令记录下来 (在数据恢复时按照从前到后的顺序再将指令都执行一遍)
数据回复完整度高
通过配置 redis.conf 中的 appendonly yes 可以打开 AOF 功能 如有写指令 (如SET 等),redis 就会被追加到 AOF 文件的末尾;默认的 AOF 持久化策略是每秒钟fsync 一次 (fsync 是指把缓存中的写指令记录到磁盘中) 数据恢复完整度高 redis 提供 redis-check-aof 工具,可以用来进行 AOF 文件修复· redis 提供 AOF 文件重写 (rewrite) 机制 (AOF 文件压缩) 误操作执行 flushall 导致数据全部被清空,可以通过 AOF 文件恢复 (AOF 未被重写)
-
不足
AOF 文件要比 RDB 文件体积大,AOF 方式数据恢复速度要慢于 RDB 方式
-
原理
Redis慢查询
慢查询就是系统在命令执行前后计算每条命令的执行时间,,当超过预设闽值就将这条命令的相关信息 (如发生时间、耗时、命令的详细信息)记录到慢查询日志中
慢查询的作用是帮助开发和运维人员定位和优化系统存在的慢操作 慢
-
配置项
-
slowlog-log-slower-than (慢查询预设值)
单位是微妙 (1秒=1000毫秒=1000000微秒) ,默认值 10000 微妙;假如执行了一条“很慢”的命令如果它的执行时间超过了10000 微秒,那么它将被记录在慢查询日志中。
-
slowlog-max-len (慢查询日志最大记录数)
Redis 使用了一个列表来存储慢查询日志,当慢查询日志列表已经处于最大长度时,列表中最早插入的那条记录将被移除。
-
-
Redis慢查询日志管理命令
虽然慢查询日志存放在 Redis 内存列表中,但是 Redis 并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理
-
获取慢查询日志
slowlog get [n]
-
获取慢查询日志列表当前长度
slowlog len
-
慢查询日志重置
slowlog reset