Redis进阶版
Redis进阶版
1、Redis事务
Redis事务主要作用就是串联多个命令防止别的命令插入。
1.1、multi、exec、discard
- multi:组队阶段(开启事务)
- exec:执行阶段(提交事务)
- discard:撤销(回滚事务)
ps:QUEUED命令进入组队模式,两个OK,两条命令提交成功。
1.2、事务的错误处理
组队(开启事务)中某个命令出现报告错误,执行时所有的队列命令都会被取消
如果执行阶段(提交事务)某个命令报错,则只会报错的命令不会执行,而其他的命令都会执行,不会回滚
1.、悲观锁
每次去拿数据都会上锁,其他人想修改数据只能等上一个人修改完并释放锁。传统的关系型数据库用到很多这种锁机制,比如行锁,表锁,读锁,写锁等等,都是在操作之前先上锁。
1.4、乐观锁
每次去拿数据都不会上锁,但是在更新的时候会判断再此期间别人有没有更新这个数据(每个数据更新版本号就是更新),可以使用版本号等机制。redis利用check-and-set机制实现事务。
1.5、watch
在执行multi之前,先执行watch key,可以监视一个或多个key,如果在事务执行之前,这个key被其他事务改动提交,则本次事务将被打断。unwatch取消监视。 事务1:
事务2:
如果不监视,事务2exec提交时候,会再去查balance值,再加20则结果是10
1.6、Redis事务三特性
- 单独的隔离操作:事务中所有的命令都会序列化,按顺序的执行。事务在执行的过程中,不会被其他客户端发来的命令请求所打断。
- 没有隔离级别的概念:队列中的命令没有提交之前都不会时间被执行,因为事务提交前任何指令都不会被实际执行
- 不保证原子性,事务中如果一条命令执行失败,其后的命令仍然会被执行,没有回滚。
1.7、利用redis实现秒杀
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)一个子进程,将数据写到临时文件中,持久化过程结束后,再用这个临时文件体态好上次持久化号的文件。(防止持久化期间宕机)
- 优点:适合大规模的数据恢复,节省空间,恢复速度快
- 缺点:对数据完整性和一致性要求高不适合使用
配置:
- 默认快照文件:dump.rdb
- 默认文件路径:./ (用启动文件redis-cli同目录)
根据配置文件中配置的自动进行快照
代码语言:javascript代码运行次数:0运行复制save 900 1
save 00 10
save 60 10000
save m n //时间m(秒)和n(修改键值对个数)
当在m秒时间内被修改的键的个数大于等于n时,服务器就会触发bgsave命令,自动执行快照操作。
代码语言:javascript代码运行次数:0运行复制save “” //取消快照
2.2、AOF
- 以日志形式记录每一个写操作,将redis执行过的所有写指令记录下下。redis启动之初会读取该文件重新构建数据。
- 默认是关闭的,日志文件名appendonly.aof,路径和rdb一样
- aof重写,当aof文件过大,会将aof文件中的指令汇总重写,不会包含冗余的指令
- 同步策略,每次写入指令同步;每秒同步;非主动同步
- 优点:丢失数据可能小,可以操作AOF文件,处理误操作
- 缺点:需要占用更多的磁盘空间,恢复备份速度慢,每次读写都同步,有一定的性能压力
2.、总结
- 官方推荐两个都启用,默认使用aof
- 如果对数据不敏感,可以单独使用rdb
- 如果只是做纯内存缓存,可以都不用
、Redis主从复制
主机数据更新后根据配置和策略,自动同步到备机的master/slaver,master以写为主,slave以读为主
.1、一主多从
.1.1、查看主从关系相关信息
info replication命令
- role:master 角主机
- connected_slaves:0 从机个数为0
.1.2、配从(库)不配主(库)
在从机上执行:slaveof 主机ip 端口
- role:master 角从机
- 主机为:127.0.0.1 679
.1.、主机责任是写操作,从机只读,不能写
.2、主从复制原理
- slave启动成功连接到master后发送命令,然后master持久化rdb文件将数据同步给slave
- 每次主服务器进行写操作后,会与从服务器进行同步
.、薪火相传
主服务器数据同步从服务器,从服务器再同步其他的从服务器,以此类推
.、反客为主
slaveof no one 命令 主从复制阶段,当主机宕机,执行此命令,可以将从机变为主机
.、哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
- 创建哨兵的配置文件,名字不能错
- 配置文件内容:sentinel monitor mymaster 127.0.0.1 679 1 其中 mymaster为监控对象起的服务器名称,1为至少多少个哨兵同意反客为主
- 反客为主从可以设置多个从服务器的优先级
4、Redis集
redis集实现了对redis的水平扩容,即启动个redis节点,将整个数据分布存储在个节点中,每个节点存储总数据的1/。 即使集中有一部分节点失效,集也可以吉祥处理命令请求
4.1、配置
- cluster-enabled yes 打开集模式
- cluster-config-file 设定节点配置文件名
- cluster-node-timeout 15000 设定节点失联时间,超过改时间(毫秒),集自动进去主从切换
-c 采用集策略连接
4.2、集信息
cluster nodes 查询集信息命令
一个集至少要有三个主节点
5、Redis应用问题
5.1、缓存穿透(恶意攻击)
请求压力突然增大,数据在缓存中获取不到,压力都到数据库,造成数据库压力过大崩溃
解决方法:
(1)对空值缓存:如果一个查询返回的数据为空,将此结果(null)进行缓存,设置空结果的过期时间很短,最长不超过五分钟。 (2)设置可访问的名单(白名单):使用bitmap类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面id进行比较,如果id不在bitmap中,进行拦截,不允许访问。 ()采用布隆过滤器:底层和(2)类似,优点快,缺点有误识别率 (4)进行实时监控:当发现redis的命中率降低,排查访问对象和访问数据,设置黑名单限制
5.1、缓存击穿(热点数据)
key对应的数据存在,但在redis中过期,此时大量并发请求,数据库崩溃
解决方法:
(1)预先设置热门数据:在redis高峰访问之前,将热门数据提前存入redis,并加大key时长 (2)实时调整:现场讲课哪些数据热门,实时调整key的过期时长 ()使用锁:底层和(2)类似,优点快,缺点有误识别率
5.、缓存雪崩
解决方法:
(1)将缓存失效时间分散开:设置key的失效时间基础上增加一个随机值,减少key同时失效的可能性 (2)设置热点数据:设置热点数据永远不过期
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-11-05,如有侵权请联系 cloudcommunity@tencent 删除redis集事务数据主机#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 11 条评论) |
本站网友 冬冬是个胆小鬼 | 23分钟前 发表 |
此时 | |
本站网友 陈亚琼 | 19分钟前 发表 |
数据库崩溃 解决方法:(1)预先设置热门数据:在redis高峰访问之前 | |
本站网友 网络推广怎么做 | 20分钟前 发表 |
不会回滚 1. | |
本站网友 公牛牌风湿灵价格 | 11分钟前 发表 |
以此类推. | |
本站网友 哈密租房网 | 3分钟前 发表 |
压力都到数据库 | |
本站网友 浙江协同 | 30分钟前 发表 |
没有隔离级别的概念:队列中的命令没有提交之前都不会时间被执行 | |
本站网友 新问鼎 | 14分钟前 发表 |
则本次事务将被打断 | |
本站网友 厦门华厦学院 | 17分钟前 发表 |
日志文件名appendonly.aof | |
本站网友 买房支招 | 11分钟前 发表 |
存放多个用户id);uid:用户id key使用事务在并发时候可以防止超卖 | |
本站网友 陈思成主演的电视剧 | 2分钟前 发表 |
集也可以吉祥处理命令请求4.1 |