1.复习内容
2.灵感代办
3.学习内容
-
Redis事务(弱事务机制)
- 事务的定义
- 事务中的语句,要视为一个整体,那么全部执行,那么放弃执行
- Redis事务特点
- 单独隔离操作,当前操作的数据,不会被被打断
- 不保证原子性,redis事务中失败之后,其余命令也会执行
- 事务中的命令都放入一个队列,执行时候再把命令一个个执行
- 事务命令
- multi 开始事务
- 命令 需要执行的命令集
- exec 提交到事务 // discard 取消事务
- 事务命令错误处理
- 1.命令语法错误,命令无法进入队列,直接被discard退出事务
- 处理方案:检查队列中的命令是否正确,错误的话,抛弃退出这个事务
- 2.类型操作有误,事务执行调用后失败,无法进行事务回滚
- 用一个LPOP操作字符串,操作会出现问题,但是在事务中,是先添加进入队列,执行时候才发现错误
- 为什么redis不支持事务回滚
- redis内部简单快速,加入回滚会臃肿
- 程序逻辑有错,才需要回滚,回滚不能解决来自编程的错误(程序员编程出错),所以redis不需要完全版的回滚
-
pipeline补充
- python使用pipeline()与execute() 批量操作
- 可以批量执行多个命令
- 可以节省数据库的io消耗,性能更好
-
pipe = r.pipeline()
pipe.set('fans',50) # 多条命令
pipe.execute()
pipe.get('fans') # 多条命令
pipe.execute() # 执行
-
python恢复备份
- 两种数据库同时开启,优先使用AOF恢复数据库
-
Redis分布式锁是怎么回事?
- 多个进程同时去拿一个数据,如果执行成功释放锁,下一个进程可以拿到锁执行程序
- 具有阻塞时间,避免了死锁,
- 典型应用:秒杀
-
Redis 缓存穿透(防止攻击)
- 原理:
- 缓存和数据库都没有的数据,用户反复发送数据查询,假的数据,用户id
- 场景
- 发起id为-1或者非常大的数据,这就属于一种攻击,倒是数据库压力过大
- 解决方案
- 请求效验,对id<=0直接拒绝
- 无法获取的数据将key和value(空值)存入缓存,设置有效缓存时间,可以防止用户反复用同一个id暴力攻击
-
Redis 缓存击穿(逻辑处理不好)
- 原理:
- 缓存过期之后,缓存没有数据,数据库有,导致瞬时并发太大
- 方案:
- 热点数据不过期(大访问量,常被访问)
- 上锁:重新设置缓存使用方式,查询key,先查缓存,没有就通过锁来访问
-
Redis 缓存雪崩
- 原理
- 缓存中大量数据过期,瞬间进入数据库大批量请求
- 解决方案
- 1,缓存设置随机时间(避免同一时间大量请求)
- 2,热点数据不过期(大访问量,常被访问)
-
哈希碰撞
- redis已经做了技术处理
- 常用哈希碰撞的方法:单链表,二次地址,二次哈希
- 在计算key的位置时候,两个key的位置一样,就是哈希碰撞,
4.扩展延伸知识
5.知识内容个人梳理
6.今天都复习了之前的什么内容
3.学习内容
-
Redis事务(弱事务机制)
- 事务的定义
- 事务中的语句,要视为一个整体,那么全部执行,那么放弃执行
- Redis事务特点
- 单独隔离操作,当前操作的数据,不会被被打断
- 不保证原子性,redis事务中失败之后,其余命令也会执行
- 事务中的命令都放入一个队列,执行时候再把命令一个个执行
- 事务命令
- multi 开始事务
- 命令 需要执行的命令集
- exec 提交到事务 // discard 取消事务
- 事务命令错误处理
- 1.命令语法错误,命令无法进入队列,直接被discard退出事务
- 处理方案:检查队列中的命令是否正确,错误的话,抛弃退出这个事务
- 2.类型操作有误,事务执行调用后失败,无法进行事务回滚
- 用一个LPOP操作字符串,操作会出现问题,但是在事务中,是先添加进入队列,执行时候才发现错误
- 为什么redis不支持事务回滚
- redis内部简单快速,加入回滚会臃肿
- 程序逻辑有错,才需要回滚,回滚不能解决来自编程的错误(程序员编程出错),所以redis不需要完全版的回滚
-
pipeline补充
- python使用pipeline()与execute() 批量操作
- 可以批量执行多个命令
- 可以节省数据库的io消耗,性能更好
-
pipe = r.pipeline()
pipe.set('fans',50) # 多条命令
pipe.execute()
pipe.get('fans') # 多条命令
pipe.execute() # 执行
-
python恢复备份
- 两种数据库同时开启,优先使用AOF恢复数据库
-
Redis分布式锁是怎么回事?
- 多个进程同时去拿一个数据,如果执行成功释放锁,下一个进程可以拿到锁执行程序
- 具有阻塞时间,避免了死锁,
- 典型应用:秒杀
-
Redis 缓存穿透(防止攻击)
- 原理:
- 缓存和数据库都没有的数据,用户反复发送数据查询,假的数据,用户id
- 场景
- 发起id为-1或者非常大的数据,这就属于一种攻击,倒是数据库压力过大
- 解决方案
- 请求效验,对id<=0直接拒绝
- 无法获取的数据将key和value(空值)存入缓存,设置有效缓存时间,可以防止用户反复用同一个id暴力攻击
-
Redis 缓存击穿(逻辑处理不好)
- 原理:
- 缓存过期之后,缓存没有数据,数据库有,导致瞬时并发太大
- 方案:
- 热点数据不过期(大访问量,常被访问)
- 上锁:重新设置缓存使用方式,查询key,先查缓存,没有就通过锁来访问
-
Redis 缓存雪崩
- 原理
- 缓存中大量数据过期,瞬间进入数据库大批量请求
- 解决方案
- 1,缓存设置随机时间(避免同一时间大量请求)
- 2,热点数据不过期(大访问量,常被访问)
-
哈希碰撞
- redis已经做了技术处理
- 常用哈希碰撞的方法:单链表,二次地址,二次哈希
- 在计算key的位置时候,两个key的位置一样,就是哈希碰撞,
4.扩展延伸知识
5.知识内容个人梳理
6.今天都复习了之前的什么内容
Redis事务(弱事务机制)
- 事务的定义
- 事务中的语句,要视为一个整体,那么全部执行,那么放弃执行
- Redis事务特点
- 单独隔离操作,当前操作的数据,不会被被打断
- 不保证原子性,redis事务中失败之后,其余命令也会执行
- 事务中的命令都放入一个队列,执行时候再把命令一个个执行
- 事务命令
- multi 开始事务
- 命令 需要执行的命令集
- exec 提交到事务 // discard 取消事务
- 事务命令错误处理
- 1.命令语法错误,命令无法进入队列,直接被discard退出事务
- 处理方案:检查队列中的命令是否正确,错误的话,抛弃退出这个事务
- 2.类型操作有误,事务执行调用后失败,无法进行事务回滚
- 用一个LPOP操作字符串,操作会出现问题,但是在事务中,是先添加进入队列,执行时候才发现错误
- 1.命令语法错误,命令无法进入队列,直接被discard退出事务
- 为什么redis不支持事务回滚
- redis内部简单快速,加入回滚会臃肿
- 程序逻辑有错,才需要回滚,回滚不能解决来自编程的错误(程序员编程出错),所以redis不需要完全版的回滚
pipeline补充
- python使用pipeline()与execute() 批量操作
- 可以批量执行多个命令
- 可以节省数据库的io消耗,性能更好
-
pipe = r.pipeline() pipe.set('fans',50) # 多条命令 pipe.execute() pipe.get('fans') # 多条命令 pipe.execute() # 执行
-
python恢复备份
- 两种数据库同时开启,优先使用AOF恢复数据库
Redis分布式锁是怎么回事?
- 多个进程同时去拿一个数据,如果执行成功释放锁,下一个进程可以拿到锁执行程序
- 具有阻塞时间,避免了死锁,
- 典型应用:秒杀
Redis 缓存穿透(防止攻击)
- 原理:
- 缓存和数据库都没有的数据,用户反复发送数据查询,假的数据,用户id
- 场景
- 发起id为-1或者非常大的数据,这就属于一种攻击,倒是数据库压力过大
- 解决方案
- 请求效验,对id<=0直接拒绝
- 无法获取的数据将key和value(空值)存入缓存,设置有效缓存时间,可以防止用户反复用同一个id暴力攻击
Redis 缓存击穿(逻辑处理不好)
- 原理:
- 缓存过期之后,缓存没有数据,数据库有,导致瞬时并发太大
- 方案:
- 热点数据不过期(大访问量,常被访问)
- 上锁:重新设置缓存使用方式,查询key,先查缓存,没有就通过锁来访问
Redis 缓存雪崩
- 原理
- 缓存中大量数据过期,瞬间进入数据库大批量请求
- 解决方案
- 1,缓存设置随机时间(避免同一时间大量请求)
- 2,热点数据不过期(大访问量,常被访问)
哈希碰撞
- redis已经做了技术处理
- 常用哈希碰撞的方法:单链表,二次地址,二次哈希
- 在计算key的位置时候,两个key的位置一样,就是哈希碰撞,
5.知识内容个人梳理
6.今天都复习了之前的什么内容