您现在的位置是:首页 > 编程 > 

Redis进阶版

2025-07-22 00:31:39
Redis进阶版 1、Redis事务Redis事务主要作用就是串联多个命令防止别的命令插入。1.1、multi、exec、discardmulti:组队阶段(开启事务)exec:执行阶段(提交事务)discard:撤销(回滚事务) ps:QUEUED命令进入组队模式,两个OK,两条命令提交成功。1.2、事务的错误处理组队(开启事务)中某个命令出现报告错误,执行时所有的队列命令都会被取消 如

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

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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1162885.html

相关标签:无
上传时间: 2025-07-20 20:36:05
留言与评论(共有 11 条评论)
本站网友 冬冬是个胆小鬼
23分钟前 发表
此时
本站网友 陈亚琼
19分钟前 发表
数据库崩溃 解决方法:(1)预先设置热门数据:在redis高峰访问之前
本站网友 网络推广怎么做
20分钟前 发表
不会回滚 1.
本站网友 公牛牌风湿灵价格
11分钟前 发表
以此类推.
本站网友 哈密租房网
3分钟前 发表
压力都到数据库
本站网友 浙江协同
30分钟前 发表
没有隔离级别的概念:队列中的命令没有提交之前都不会时间被执行
本站网友 新问鼎
14分钟前 发表
则本次事务将被打断
本站网友 厦门华厦学院
17分钟前 发表
日志文件名appendonly.aof
本站网友 买房支招
11分钟前 发表
存放多个用户id);uid:用户id key使用事务在并发时候可以防止超卖
本站网友 陈思成主演的电视剧
2分钟前 发表
集也可以吉祥处理命令请求4.1