2020.6.3 Redis Day04

发布于 2020-06-03  35 次阅读


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.今天都复习了之前的什么内容


Ares个人进阶之路