前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【数据库】Redis进阶篇

【数据库】Redis进阶篇

作者头像
用户3467126
发布于 2019-07-03 10:29:30
发布于 2019-07-03 10:29:30
46400
代码可运行
举报
文章被收录于专栏:爱编码爱编码
运行总次数:0
代码可运行

事务

为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。简单介绍Redis中事务的使用方法以及它的局限性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd user:a:follow user:b
QUEUED
127.0.0.1:6379> zadd user:b:fans 1 user:a
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> sismember user:a:follow user:b
(integer) 1

Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和 exec两个命令之间。

multi命令代表事务开始。 exec命令代表事务结束。 它们之间的命令是原子顺序执行的。 它不支持事务中的回滚特性。

Lua脚本

在Redis中执行Lua脚本有两种方法:eval和evalsha。

发布订阅

Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布 者和订阅者不进行直接通信,发布者客户端向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息。

1. 发布消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publish channel:sports "Tim won the championship"

2 2.订阅消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subscribe channel:sports

有关订阅命令有两点需要注意:

•客户端在执行订阅命令之后进入了订阅状态,只能接收subscribe、 psubscribe、unsubscribe、punsubscribe的四个命令。•新开启的订阅客户端,无法收到该频道之前的消息,因为Redis不会对 发布的消息进行持久化。

Redis发布订阅与成熟MQ的比较

(1)MQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;

(2)MQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;

(3)MQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。

总之,MQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装MQ了,因为可能MQ提供的功能大部分都用不到,而且你可以容忍redis发布订阅的缺点的话,可以考虑用它。

持久化

Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复

RDB持久化

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持 久化过程分为手动触发和自动触发。

手动触发和自动触发操作方法参考这位大神的文章:https://www.cnblogs.com/ysocean/p/9114268.html[3]

RDB的优缺点

优点:

•RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。•Redis加载RDB恢复数据远远快于AOF的方式。

缺点:

•RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过•RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。

AOF持久化

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。 AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

开启AOF,通过修改redis.conf配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
appendonly yes    ##默认不开启。

AOF文件名通过appendfilename配置设置,默认文件名appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。

AOF的工作流程如下图:

1)所有的写入命令会追加到aof_buf(缓冲区)中。

2)AOF缓冲区根据对应的策略向硬盘做同步操作。

3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。

更详细的工作原理可以参考书籍【Redis开发与运维(付磊)】 或者参考这篇文章:https://redisbook.readthedocs.io/en/latest/internal/aof.html[4]

温馨提示

场景:AOF文件可能存在结尾不完整的情况,比如机器突然掉电导致AOF尾部文件命令写入不全。

解决方法:

•对于错误格式的AOF文件,先进行备份,然后采用redis-check-aof --fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。• Redis为我们提供了aof-load-truncated配置来兼容这种情况,默认开启。加载AOF时,当遇到此问题时会忽略并继续启动,同时打印如下警告日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 397856725 !!!
# AOF loaded anyway because aof-load-truncated is enabled

持久化的优化

Redis持久化功能一直是影响Redis性能的高发地。主要有以下方面

1. fork操作

原因:对于高流量的Redis实例OPS可达5万以上,如果fork操作耗时在秒级别将拖慢Redis几万条命令执行,对线上应用延迟影响非常明显。正常情况下fork耗时应该是每GB消耗20毫秒左右。可以在info stats统计中查latest_fork_usec指标获取最近一次fork操作耗时,单位微秒。

优化:

1)优先使用物理机或者高效支持fork操作的虚拟化技术,避免使用Xen。

2)控制Redis实例最大可用内存,fork耗时跟内存量成正比,线上建议每个Redis实例内存控制在10GB以内。

3)合理配置Linux内存分配策略,避免物理内存不足导致fork失败。

4)降低fork操作的频率,如适度放宽AOF自动触发时机,避免不必要的全量复制等。

2. CPU

CPU开销分析。子进程负责把进程内的数据分批写入文件,这个过程属于CPU密集操作,通常子进程对单核CPU利用率接近90%。

CPU消耗优化。Redis是CPU密集型服务,不要做绑定单核CPU操作。由于子进程非常消耗CPU,会和父进程产生单核资源竞争。

不要和其他CPU密集型服务部署在一起,造成CPU过度竞争。如果部署多个Redis实例,尽量保证同一时刻只有一个子进程执行重写工作。

3. 内存

内存消耗优化:

1)同CPU优化一样,如果部署多个Redis实例,尽量保证同一时刻只有一个子进程在工作。

2)避免在大量写入时做子进程重写操作,这样将导致父进程维护大量页副本,造成内存消耗。

4. 硬盘

优化方法如下:

a)不要和其他高硬盘负载的服务部署在一起。如:存储服务、消息队列服务等。

b)AOF重写时会消耗大量硬盘IO,可以开启配置no-appendfsync-on-rewrite,默认关闭。表示在AOF重写期间不做fsync操作。

c)当开启AOF功能的Redis用于高流量写入场景时,如果使用普通机械磁盘,写入吞吐一般在100MB/s左右,这时Redis实例的瓶颈主要在AOF同步硬盘上。

d)对于单机配置多个Redis实例的情况,可以配置不同实例分盘存储AOF文件,分摊硬盘写入压力。

注:配置no-appendfsync-on-rewrite=yes时,在极端情况下可能丢失整个AOF重写期间的数据,需要根据数据安全性决定是否配置。

5.AOF追加阻塞

当开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用另一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,会造成Redis主线程阻塞,

阻塞流程分析:

1)主线程负责写入AOF缓冲区。

2)AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时间。

3)主线程负责对比上次AOF同步时间:如果距上次同步成功时间在2秒内,主线程直接返回。如果距上次同步成功时间超过2秒,主线程将会阻塞,直到同步操作完成。

优化AOF追加阻塞问题主要是优化系统硬盘负载,优化方法参考第4点。

总结

本文主要学习Redis的事务、发布订阅、以及持久化。 后续会继续学习Redis集群等方面的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
以标准的名义!DevOps 国际峰会 2018 · 深圳站精彩实录(附大会PPT)
是的!为期两天,1600余人签到的 DevOps 国际峰会(DOIS)2018 · 深圳站圆满结束!
DevOps时代
2018/12/07
1.9K0
腾讯云DevOps技术实践沙龙回顾(附视频)
前言 腾讯是新兴互联网企业的代表,其研发技术栈非常多样性。在海量用户的前提下,腾讯是如何保持研发的高效敏捷,将研发,集成发布,以及持续运维三者相结合,形成DevOps全链路的解决方案。上周末在腾讯滨海大厦举行的 DevOps 技术实践沙龙就由各位专家和大家一起分享了其中的经验。 腾讯工蜂 以Git为基础,是腾讯集团新一代研发管理平台,不仅支持先进的研发理念,还适应了大型企业环境,支撑了如微信等腾讯大量关键业务的研发活动。 Tencent Hub,是腾讯云使用新一代容器思想打造的,基于云的持续集成和
织云平台团队
2019/06/27
1.8K0
腾讯云DevOps技术实践沙龙回顾(附视频)
AIOps线下沙龙回顾
前言 近年,人工智能和机器学习不断发展,传统的IT运维,也从自动化运维逐渐升级到未来的智能化运维时代。得益于此,AIOps应运而生,也就是基于算法的IT运维(Algorithmic IT Operations),帮助大量运用人脑决策和手工操作的运维向着智能运维的方向前进,并且持续为企业带来更加先进的业务能力。那么 AI 技术到底如何应用到企业的实际运维当中呢? 此次沙龙旨在分享 AIOps 理念与实践经验,促进 AIOps 爱好者们相互交流和学习。希望让对 AIOps 感兴趣的人们有机会相互交流和共同成长。
织云平台团队
2018/03/28
1.3K0
AIOps线下沙龙回顾
腾讯云开发者社区技术沙龙第22期回顾,围观大牛分享的干货!(内附PPT)
2019年5月25日,由云+社区主办的第22期云+技术沙龙-互联网架构,在深圳腾讯滨海大厦举行,本期沙龙邀请了腾讯的技术专家分享关于技术架构、落地实践案例、无服务器云函数架构、海量存储系统架构等话题,深度揭秘互联网架构,带来丰富的实践经验内容。
腾讯云开发者社区技术沙龙
2019/05/29
1.5K0
腾讯云开发者社区技术沙龙第22期回顾,围观大牛分享的干货!(内附PPT)
2018中国C++大会精彩回顾
12月22日,TEG技术事业工程群联合Purecpp开源社区共同举办了2018中国C++大会,大会诚邀四位modernC++国内技术先锋带来modern c++应用、最新标准以及未来发展趋势,更有腾讯Tars、Libco开源项目技术负责人,以及CDN服务器开发技术负责人,分享了腾讯在C++工程实践应用经验,可以说这是一场最纯粹的C++大会,只有C++的各种技术细节,干货满满。现场共计数十家公司、近400位技术伙伴们参会,创造了难得的C++爱好者们的线下交流机会,线上也有800多位伙伴观看直播,气氛非常
腾讯技术工程官方号
2019/01/07
1.3K0
2018中国C++大会精彩回顾
TEG Cheers | 腾讯技术工程运维技术沙龙精彩回顾(内置现场视频)
7月28日,腾讯技术工程运维技术沙龙-深圳站在腾讯大厦2楼多功能厅举行。现场集结了数十家知名企业的技术开发和运维小伙伴,通过5个小时的思维碰撞,运维人员和导师们一起打造了一场运维人的知识盛宴。 这次,
腾讯技术工程官方号
2018/08/03
9260
鹏城相聚,精彩继续!CIS 2022大会(深圳会场)成功举办
2022年11月23日,CIS 2022网络安全创新大会(深圳会场)在深圳博林天瑞喜来登酒店顺利举办,来自全国各地的演讲嘉宾和参会观众共聚一堂,面对面交流网络安全领域的前瞻思考、心得体会,共同探寻网安未来的新趋势、新变革。 在数据价值日益提升,威胁检测愈发重要的当下,CIS 2022网络安全创新大会深圳分会场特设立“高级威胁与漏洞管理论坛”、“安全运营与数据安全论坛”两大论坛,围绕多云场景之下,讨论企业如何构筑自适应威胁监测防护体系,强化数据、资产、漏洞、API安全,提升应急响应体系等多个接地气的方向,
FB客服
2023/03/29
5090
鹏城相聚,精彩继续!CIS 2022大会(深圳会场)成功举办
互联网架构-腾讯云开发者社区技术沙龙第22期干货下载
2019年5月25日,由云+社区主办的第22期云+技术沙龙-互联网架构,在深圳腾讯滨海大厦举行。本次活动聚焦在互联网架构及其相关领域,到场的嘉宾有腾讯Turing Lab副总监张力柯、腾讯云微服务平台产品负责人韩欣、腾讯云函数计算技术负责人周维跃、腾讯云资深技术专家朱建平以及深圳友浩达科技创始人张善友。现场分享了技术架构、落地实践案例、无服务器云函数架构、海量存储系统架构等话题,深度揭秘互联网架构,带来丰富的实践经验内容。
腾讯云开发者社区技术沙龙
2019/05/27
3.1K3
互联网架构-腾讯云开发者社区技术沙龙第22期干货下载
【免费赠票】从0到1构建用户体系,8月21日深圳腾讯大厦见!
一眨眼间4年过去了……PMTalk在北京、上海、广州、深圳、成都、杭州、厦门、武汉都建立了自己的分会,让全国各地产品伙伴都能连接在一起,提供产品人一个交流的平台。通过线上社区社群打卡学习、话题交流、发表文章、问答交流......PMTalk用行动证明着自己的slogan: 一个帮助产品人成长的产品社区 90%以上的产品经理、运营的梦想就是进入腾讯。而这次可以让你有机会进入到腾讯的机会,一探究竟还顺便学习一线知识。 我们请了5位大咖们来自真实案例分析、同行间的真挚交流和讨论将为你带来前所未有的视听体验,让
腾讯大讲堂
2021/08/09
5360
【深圳】珠三角技术沙龙5月DevOps专场沙龙开放报名
活动背景 近几年来,DevOps 成为技术圈最热门的领域之一。Forrest 报告甚至清晰地提到2018年将是 DevOps 之年。本场沙龙邀请了四位大牛讲师,除了和你一起分享 DevOps 最前沿的实践和技术,还将带来一线的落地经验和丰富的案例,让 DevOps 不再停留在概念的阶段。借鉴业内成功实践 DevOps 的经验,你的团队也可以走向成功。如果你也在应用 DevOps,欢迎过来和我们一起交流。 活动概况 时间:2018年5月26日(周六)14:00-17:00 地点:深圳市南山区琼宇路特发信息科技
腾讯云 CODING
2023/05/17
2720
【深圳】珠三角技术沙龙5月DevOps专场沙龙开放报名
腾讯WeTest&TesterHome深圳线下沙龙
原文链接:https://wetest.qq.com/lab/view/456.html
WeTest质量开放平台团队
2019/05/12
6640
腾讯WeTest&TesterHome深圳线下沙龙
“ 腾讯QQ大数据与AI应用 ” 线下沙龙回顾
前言 近年,大数据,人工智能无疑是最火热的话题,本次由iTechClub华南分会和腾讯SNG数据中心联合举办的“腾讯QQ大数据与AI应用”沙龙,旨在秉承iTechClub爱技术、爱生活的宗旨,结合腾讯SNG数据中心在大数据,AI应用上多年的经验和沉淀,为大数据技术相关从业人员搭建交流分享的平台,促进大数据技术爱好者们相互交流和学习,让大家在分享交流中共同成长。 沙龙分享 3月24号,由iTechClub华南分会和腾讯SNG数据中心联合举办的“腾讯QQ大数据与AI应用”沙龙在腾讯大厦圆满举行。沙龙邀请了腾讯S
腾讯云大数据
2018/05/09
1.7K0
“ 腾讯QQ大数据与AI应用 ” 线下沙龙回顾
DevOps是软件工程的未来!--蓝鲸DevOps活动全程视频回顾(1)
19年6月,腾讯蓝鲸智云与嘉为科技于北京、上海、广州、深圳四地成功举办《蓝鲸DevOps,为研发效能而生》专场技术沙龙。
嘉为蓝鲸
2019/07/08
1.4K0
【资料合集】2019 云+技术沙龙盘点回顾
导语:“云+技术沙龙” 是 “腾讯云开发者社区” 对外的线下知识传播及行业前瞻的重要板块。在2019年,社区举办了超过15场线下沙龙,邀请了腾讯及行业内近百位高级工程师,产品负责人等为各位开发者带来最新的技术分享和行业应用案例。本文将2019年所举办的沙龙活动进行总结,并附上回顾链接及资料下载链接,为感兴趣的开发者提供更加便捷的学习入口。 Tips:使用ctrl+f 可以搜索内容,点击蓝色沙龙标题可以直达沙龙回顾页面和资料下载页面。 沙龙时间 沙龙主题 议题 讲师
腾讯云开发者社区技术沙龙
2019/12/31
2.8K0
【资料合集】2019 云+技术沙龙盘点回顾
腾讯WeTest&TesterHome深圳线下沙龙
腾讯官方的一站式品质开放平台「腾讯WeTest」携手知名测试社区「TesterHome」以及3家金融相关企业为我们带来的金融专场。 本次活动内容主要以金融公司的测试落地和测试技术为主,我们希望你是一个: 1.热爱测试技术,愿意在测试行业深耕。 2.有过1年以上有效测试经验或者开发经验,希望能在现场有收获。 3.来自金融行业,从事测试,或者开发或者技术管理工作。 4.当然,也欢迎行业中的大牛来现场沟通交流。 本次活动为期半天,希望各位参会的人员,与我们一起学习广东的各个金融公司是怎么来做测试。在交流中成
WeTest质量开放平台团队
2019/05/16
6120
腾讯WeTest&TesterHome深圳线下沙龙
回顾 2021 中国 .NET 开发者峰会
.NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展。峰会由来自北京、上海、苏州、深圳、武汉、广州、青岛、烟台、杭州等各地区的 .NET 技术社区共同发起举办,由微软Reactor , 微软 MVP & RD项目, 盛派,友浩达,米立科技,51源码服务专家,Fire UG社区,dotNET课堂联合协办,微软 Azure 白金赞助支持,NewLife 星牌赞助支持 , 目的是用中文传播 .NET 相关技术和经验。由于疫情的原因,本次峰会改为线上举办。作为2021年度国内规模最大的 .NET 线上会议,本次峰会在思否、CSDN 以及活动行3个平台同步直播,直播参与人数超过 147394 人次,其中,活动行 3858 人次,CSDN 71436 人次, 思否 72100 人次。
张善友
2022/03/30
6760
回顾 2021 中国 .NET 开发者峰会
超有趣!上周六的 es 深圳 Meetup 发生了什么事儿?
2019 年 4 月 20 日,由 Elastic 中文社区、vivo 互联网、腾讯云+社区联合主办的“Elastic 深圳 Meetup” 在深圳腾讯大厦 2F 多功能厅如期举行。
杨振涛
2019/05/15
8890
超有趣!上周六的 es 深圳 Meetup 发生了什么事儿?
干货满满,腾讯腾讯云开发者社区技术沙龙 Kafka Meetup 深圳站圆满结束
2010年,LinkedIn 着手开发 Kafka,到2011年 Kafka 进入 Apache 孵化器,成为世界顶级开源项目,并迅速被各种企业采用。据分析,目前已经有超过70%的世界500强公司在使用 Kafka。Kafka 主要作者、项目委员会主席及 Confluent 联合创始人饶军首先为大家带来了《Apache Kafka 的过去、现在和未来》的分享,介绍了 Kafka 这一路的各个关键节点及展望。他认为“Kafka 未来不仅仅是一个实时数据收集和传输系统,随着接下来的发展,它更偏向于成为一个实时数据流处理、交换和共享的平台。”
腾讯云开发者社区技术沙龙
2018/04/25
7.2K6
干货满满,腾讯腾讯云开发者社区技术沙龙 Kafka Meetup 深圳站圆满结束
连接未来,驱动创新|腾讯云 CODING DevOps 主题沙龙完美收官
近日,由腾讯云 COIDNG 主办的“连接未来,驱动创新”主题沙龙在深圳圆满结束。活动现场,来自不同行业的研效专家汇聚腾讯滨海大厦,共同探讨了在不断变革的市场环境之下,组织研发效能提升的前沿策略与实践经验。
腾讯云 CODING
2023/09/02
1980
连接未来,驱动创新|腾讯云 CODING DevOps 主题沙龙完美收官
DevOps是软件工程的未来!蓝鲸DevOps活动全程视频(2)
19年6月,腾讯蓝鲸智云与嘉为科技于北京、上海、广州、深圳四地成功举办《蓝鲸DevOps,为研发效能而生》专场技术沙龙。
嘉为蓝鲸
2019/07/08
9340
推荐阅读
相关推荐
以标准的名义!DevOps 国际峰会 2018 · 深圳站精彩实录(附大会PPT)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验