文章目录

  • 1、Redis事务
  • 1.1、multi、exec、discard
  • 1.2、事务的错误处理
  • 1.3、==悲观锁==
  • 1.4、==乐观锁==
  • 1.5、watch
  • 1.6、==Redis事务三特性==
  • 1.7、利用redis实现秒杀
  • 2、Redis持久化
  • 2.1、RDB
  • 2.2、AOF
  • 2.3、总结
  • 3、Redis主从复制
  • 3.1、一主多从
  • 3.1.1、查看主从关系相关信息
  • 3.1.2、配从(库)不配主(库)
  • 3.1.3、主机责任是写操作,从机只读,不能写
  • 3.2、主从复制原理
  • 3.3、薪火相传
  • 3.3、反客为主
  • 3.3、==哨兵模式==
  • 4、Redis集群
  • 4.1、配置
  • 4.2、集群信息
  • 5、Redis应用问题
  • 5.1、缓存穿透(恶意攻击)
  • 解决方法:
  • 5.1、缓存击穿(热点数据)
  • 解决方法:
  • 5.3、缓存雪崩
  • 解决方法:


1、Redis事务

Redis事务主要作用就是串联多个命令防止别的命令插入。

1.1、multi、exec、discard

  • multi:组队阶段(开启事务)
  • exec:执行阶段(提交事务)
  • discard:撤销(回滚事务)

redis 进入 8 redis进阶_database


ps:QUEUED命令进入组队模式,两个OK,两条命令提交成功。

1.2、事务的错误处理

组队(开启事务)中某个命令出现报告错误,执行时所有的队列命令都会被取消

redis 进入 8 redis进阶_数据_02


如果执行阶段(提交事务)某个命令报错,则只会报错的命令不会执行,而其他的命令都会执行,不会回滚

redis 进入 8 redis进阶_redis_03

1.3、悲观锁

每次去拿数据都会上锁,其他人想修改数据只能等上一个人修改完并释放锁。传统的关系型数据库用到很多这种锁机制,比如行锁,表锁,读锁,写锁等等,都是在操作之前先上锁。

1.4、乐观锁

每次去拿数据都不会上锁,但是在更新的时候会判断再此期间别人有没有更新这个数据(每个数据更新版本号就是更新),可以使用版本号等机制。redis利用check-and-set机制实现事务。

1.5、watch

在执行multi之前,先执行watch key,可以监视一个或多个key,如果在事务执行之前,这个key被其他事务改动提交,则本次事务将被打断。unwatch取消监视。

事务1:

redis 进入 8 redis进阶_database_04


事务2:

redis 进入 8 redis进阶_数据_05

如果不监视,事务2exec提交时候,会再去查balance值,再加20则结果是130

1.6、Redis事务三特性

  1. 单独的隔离操作:事务中所有的命令都会序列化,按顺序的执行。事务在执行的过程中,不会被其他客户端发来的命令请求所打断。
  2. 没有隔离级别的概念:队列中的命令没有提交之前都不会时间被执行,因为事务提交前任何指令都不会被实际执行
  3. 不保证原子性,事务中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚。

1.7、利用redis实现秒杀

redis 进入 8 redis进阶_redis 进入 8_06


kcKey:库存key;userKey:用户清单key(set,存放多个用户id);uid:用户id key

  • 使用事务在并发时候可以防止超卖,数量变为负数
  • 使用乐观锁,会出现少卖,数量没有变为0。(例如:100请求100并发,秒杀10个产品;假如100个请求同时进入事务,当其中一个秒杀成功,库存-1,用户清单+1,其他请求库存-1的时候,此时库存版本号已变化,因为是乐观锁,故其他请求事务全部打断,此时,一百个请求秒杀只有一个请求秒杀成功)
  • 使用lua脚本,将秒杀过程写入脚本,脚本功能不会被其他命令插队

2、Redis持久化

2.1、RDB

  • 默认情况下,是快照RDB的持久方式,将内存中数据以快照的方式写入二进制文件中。
  • 实现原理:redis会单独创建(fork)一个子进程,将数据写到临时文件中,持久化过程结束后,再用这个临时文件体态好上次持久化号的文件。(防止持久化期间宕机)
  • 优点:适合大规模的数据恢复,节省空间,恢复速度快
  • 缺点:对数据完整性和一致性要求高不适合使用

redis.conf配置:

  • 默认快照文件:dump.rdb
  • 默认文件路径:./ (用启动文件redis-cli同目录)

根据redis.conf配置文件中配置的自动进行快照

save 900 1
save 300 10
save 60 10000
save m n  //时间m(秒)和n(修改键值对个数)

当在m秒时间内被修改的键的个数大于等于n时,服务器就会触发bgsave命令,自动执行快照操作。

save “”  //取消快照

2.2、AOF

  • 以日志形式记录每一个写操作,将redis执行过的所有写指令记录下下。redis启动之初会读取该文件重新构建数据。
  • 默认是关闭的,日志文件名appendonly.aof,路径和rdb一样
  • aof重写,当aof文件过大,会将aof文件中的指令汇总重写,不会包含冗余的指令
  • 同步策略,每次写入指令同步;每秒同步;非主动同步
  • 优点:丢失数据可能小,可以操作AOF文件,处理误操作
  • 缺点:需要占用更多的磁盘空间,恢复备份速度慢,每次读写都同步,有一定的性能压力

2.3、总结

  • 官方推荐两个都启用,默认使用aof
  • 如果对数据不敏感,可以单独使用rdb
  • 如果只是做纯内存缓存,可以都不用

3、Redis主从复制

主机数据更新后根据配置和策略,自动同步到备机的master/slaver,master以写为主,slave以读为主

redis 进入 8 redis进阶_redis_07

3.1、一主多从

3.1.1、查看主从关系相关信息

info replication命令

redis 进入 8 redis进阶_redis 进入 8_08

  • role:master 角色主机
  • connected_slaves:0 从机个数为0
3.1.2、配从(库)不配主(库)

在从机上执行:slaveof 主机ip 端口

redis 进入 8 redis进阶_redis 进入 8_09

  • role:master 角色从机
  • 主机为:127.0.0.1 6379
3.1.3、主机责任是写操作,从机只读,不能写

redis 进入 8 redis进阶_数据_10

3.2、主从复制原理

  • slave启动成功连接到master后发送命令,然后master持久化rdb文件将数据同步给slave
  • 每次主服务器进行写操作后,会与从服务器进行同步

3.3、薪火相传

redis 进入 8 redis进阶_数据_11


主服务器数据同步从服务器,从服务器再同步其他的从服务器,以此类推

3.3、反客为主

slaveof no one 命令
主从复制阶段,当主机宕机,执行此命令,可以将从机变为主机

3.3、哨兵模式

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

  • 创建sentinel.conf哨兵的配置文件,名字不能错
  • 配置文件内容:sentinel monitor mymaster 127.0.0.1 6379 1
    其中 mymaster为监控对象起的服务器名称,1为至少多少个哨兵同意反客为主
  • 反客为主从可以设置多个从服务器的优先级

4、Redis集群

redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在N个节点中,每个节点存储总数据的1/N。
即使集群中有一部分节点失效,集群也可以吉祥处理命令请求

4.1、配置

  • cluster-enabled yes 打开集群模式
  • cluster-config-file nodes-6379.conf 设定节点配置文件名
  • cluster-node-timeout 15000 设定节点失联时间,超过改时间(毫秒),集群自动进去主从切换

-c 采用集群策略连接

redis 进入 8 redis进阶_database_12

4.2、集群信息

cluster nodes 查询集群信息命令

一个集群至少要有三个主节点

5、Redis应用问题

5.1、缓存穿透(恶意攻击)

请求压力突然增大,数据在缓存中获取不到,压力都到数据库,造成数据库压力过大崩溃

redis 进入 8 redis进阶_数据_13

解决方法:

(1)对空值缓存:如果一个查询返回的数据为空,将此结果(null)进行缓存,设置空结果的过期时间很短,最长不超过五分钟。
(2)设置可访问的名单(白名单):使用bitmap类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面id进行比较,如果id不在bitmap中,进行拦截,不允许访问。
(3)采用布隆过滤器:底层和(2)类似,优点快,缺点有误识别率
(4)进行实时监控:当发现redis的命中率降低,排查访问对象和访问数据,设置黑名单限制

5.1、缓存击穿(热点数据)

key对应的数据存在,但在redis中过期,此时大量并发请求,数据库崩溃

redis 进入 8 redis进阶_redis_14

解决方法:

(1)预先设置热门数据:在redis高峰访问之前,将热门数据提前存入redis,并加大key时长
(2)实时调整:现场讲课哪些数据热门,实时调整key的过期时长
(3)使用锁:底层和(2)类似,优点快,缺点有误识别率

5.3、缓存雪崩

redis 进入 8 redis进阶_redis_15

解决方法:

(1)将缓存失效时间分散开:设置key的失效时间基础上增加一个随机值,减少key同时失效的可能性
(2)设置热点数据:设置热点数据永远不过期