Redis Plus 来了,性能炸裂!

点击关注公众号,Java干货及时送达79533b668b48c3aec39d4ce6d55eadf1.png

cf9a812da2b32728c641f555280962c0.png 学习 Spring Cloud 微服务的正确姿势!

549a0839ec9cc79438efff2139048d07.png 用上 ChatGPT 啦,强的离谱!

f6c7b885109946c9238fad4e4fd67ce9.png 博客园在绝境求生。。


来源:https://developer.aliyun.com/article/705239

1 什么是KeyDB?

KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。

除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能,例如直接备份到AWS S3。

KeyDB与Redis协议,模块和脚本保持完全兼容性。这包括脚本和事务的原子性保证。由于KeyDB与Redis开发保持同步,因此KeyDB是Redis功能的超集,从而使KeyDB取代了现有Redis部署。

在相同的硬件上,KeyDB每秒可以执行的查询数量是Redis的两倍,而延迟却降低了60%。Active-Replication简化了热备用故障转移,使您可以轻松地在副本上分配写操作并使用基于TCP的简单负载平衡/故障转移。KeyDB的高性能可让您在更少的硬件上做更多的事情,从而降低了运营成本和复杂性。

400f9671b6c0feb9f67feb8385d79563.png

在此处查看完整的基准测试结果和设置信息:

https://docs.keydb.dev/blog/2019/10/07/blog-post/

2 走进KeyDB

KeyDB项目是从redis fork出来的分支。众所周知redis是一个单线程的kv内存存储系统,而KeyDB在100%兼容redis API的情况下将redis改造成多线程。

项目git地址:

https://github.com/JohnSully/KeyDB

网上公开的技术细节比较少,本文基本是通过阅读源码总结出来的,如有错漏之处欢迎指正。

推荐一个开源免费的 Spring Boot 最全教程:

https://github.com/javastacks/spring-boot-best-practice

多线程架构

线程模型

KeyDB将redis原来的主线程拆分成了主线程和worker线程。每个worker线程都是io线程,负责监听端口,accept请求,读取数据和解析协议。如图所示:

eeb6631321fb5a44bae6d237ee688d9f.jpeg

KeyDB使用了SO_REUSEPORT特性,多个线程可以绑定监听同个端口。

每个worker线程做了cpu绑核,读取数据也使用了SO_INCOMING_CPU特性,指定cpu接收数据。

解析协议之后每个线程都会去操作内存中的数据,由一把全局锁来控制多线程访问内存数据。

主线程其实也是一个worker线程,包括了worker线程的工作内容,同时也包括只有主线程才可以完成的工作内容。在worker线程数组中下标为0的就是主线程。

另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

主线程的主要工作在实现serverCron,包括:

  • 处理统计

  • 客户端链接管理

  • db数据的resize和reshard

  • 处理aof

  • replication主备同步

  • cluster模式下的任务

链接管理

在redis中所有链接管理都是在一个线程中完成的。在KeyDB的设计中,每个worker线程负责一组链接,所有的链接插入到本线程的链接列表中维护。链接的产生、工作、销毁必须在同个线程中。每个链接新增一个字段

int iel; /* the event loop index we're registered with */

用来表示链接属于哪个线程接管。

KeyDB维护了三个关键的数据结构做链接管理:

  • clients_pending_write:线程专属的链表,维护同步给客户链接发送数据的队列

  • clients_pending_asyncwrite:线程专属的链表,维护异步给客户链接发送数据的队列

  • clients_to_close:全局链表,维护需要异步关闭的客户链接

分成同步和异步两个队列,是因为redis有些联动api,比如pub/sub,pub之后需要给sub的客户端发送消息,pub执行的线程和sub的客户端所在线程不是同一个线程,为了处理这种情况,KeyDB将需要给非本线程的客户端发送数据维护在异步队列中。

同步发送的逻辑比较简单,都是在本线程中完成,以下图来说明如何同步给客户端发送数据

7722e6f21fa8f9d62199b60e26cc0900.png

如上文所提到的,一个链接的创建、接收数据、发送数据、释放链接都必须在同个线程执行。异步发送涉及到两个线程之间的交互。KeyDB通过管道在两个线程中传递消息:

int fdCmdWrite; //写管道
int fdCmdRead; //读管道

本地线程需要异步发送数据时,先检查client是否属于本地线程,非本地线程获取到client专属的线程ID,之后给专属的线程管到发送AE_ASYNC_OP::CreateFileEvent的操作,要求添加写socket事件。专属线程在处理管道消息时将对应的请求添加到写事件中,如图所示:

fa4398519e6ef1ce861392391ad018fa.png

redis有些关闭客户端的请求并非完全是在链接所在的线程执行关闭,所以在这里维护了一个全局的异步关闭链表。

3382047ca4ca1d72e0fb95f9dae0daf4.png

锁机制

KeyDB实现了一套类似spinlock的锁机制,称之为fastlock。

fastlock的主要数据结构有:

struct ticket
{uint16_t m_active;  //解锁+1uint16_t m_avail;  //加锁+1
};
struct fastlock
{volatile struct ticket m_ticket;volatile int m_pidOwner; //当前解锁的线程idvolatile int m_depth; //当前线程重复加锁的次数
};

使用原子操作__atomic_load_2__atomic_fetch_add__atomic_compare_exchange来通过比较m_active=m_avail判断是否可以获取锁。fastlock提供了两种获取锁的方式:

  • try_lock:一次获取失败,直接返回

  • lock:忙等,每1024 * 1024次忙等后使用sched_yield 主动交出cpu,挪到cpu的任务末尾等待执行。

在KeyDB中将try_lock和事件结合起来,来避免忙等的情况发生。每个客户端有一个专属的lock,在读取客户端数据之前会先尝试加锁,如果失败,则退出,因为数据还未读取,所以在下个epoll_wait处理事件循环中可以再次处理。

82ed7fe069d8e734826af1e117f29239.png

Active-Replica

KeyDB实现了多活的机制,每个replica可设置成可写非只读,replica之间互相同步数据。主要特性有:

  • 每个replica有个uuid标志,用来去除环形复制

  • 新增加rreplay API,将增量命令打包成rreplay命令,带上本地的uuid

  • key,value加上时间戳版本号,作为冲突校验,如果本地有相同的key且时间戳版本号大于同步过来的数据,新写入失败。采用当前时间戳向左移20位,再加上后44位自增的方式来获取key的时间戳版本号。

参考文档:https://docs.keydb.dev/docs/commands


最后推荐下我的新书《Spring Boot 3 核心技术与最佳实践》,首发荣登京东计算机图书排行榜 TOP 1,首发 5 折最后几天促销中……

End

fa8e10625e0e392ec895ab6a69f09e03.png 学习 Spring Cloud 微服务的正确姿势!

e47c2d40f6833dd93030880bdbcbc554.png 博客园在绝境求生。。

748b256fb82f5197436f7fed2b9b970a.png 用上 ChatGPT 啦,强的离谱!

995ed9bc7d35d19399dbc618b6bd1784.png 怎么删除 HashMap 中的重复元素?

a507aa105c9b179433f0e94783da85bc.png Java 20 正式发布,超神了。。

fe11d1075bb20401ffeaea8e4440572d.gif

Spring Cloud 微服务最新课程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27386.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 重磅发布 GPT-4 !ChatGPT 炸裂大升级,直接能考上哈佛,抢先体验后我慌了...

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! ​ 一觉醒来,万众期待的GPT-4,它来了! OpenAI老板Sam Altman直接开门见山地介绍说: 这是我们迄今为止功能最强大的模型! …

QQ、微信、lol自动发消息工具

写了一个电脑自动发消息的工具,脱离双手,让我们聊天更方便跟简洁! 电脑软件。 自动发消息,双手离开键盘!能设置次数和发送间隔。 ​​​​​​链接在这:阿里云盘分享提取码:51ar 一定要先看…

AIGC的下一步,AIGA改写企业软件

▎在AIGC产品里,我们已经证明了生成式自动化在大模型和超级自动化时代是完全可行的。 编者按: 贾岿博士是弘玑Cyclone首席产品官,曾担任UiPath全球研发中心高级研发总监、微软Azure云计算主任架构师。弘玑Cyclone 是一家专注于RPA的厂商&…

zblog仿站必看!附加zblog所有必备标签调用规则和中文说明

Z-Blog是一个开源的PHP博客程序,具有轻量、简洁、易用等特点,非常适合新手搭建个人博客。以下是Z-Blog仿站教程,包含了基本的代码示例。 1. 下载Z-Blog程序并安装 首先,需要到官网下载Z-Blog程序,解压缩后上传到服务器…

老板用了ChatGPT后,决定扩招40%程序员...

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 陆奇在最近的分享中提出一个观点:“生成式AI,不会抢程序员的饭碗,相反会增加程序员的岗位。” 理由很简单,AI大幅提升程序员的工作效率,同样…

只需要两步就能快速接入GPT

缘起 最近一个朋友提出,让我出个关于如何快速接入GPT的教程,今天就给大家安排上。 需要的工具 经过实测,这是迄今为止最便捷的接入方式,而且亲测有效。 首先,第一步你需要下载最新版的微软Edge浏览器,去…

强推宝藏网站

最近还是有很强烈的感受,方法大于努力。最近就整理了一下大学期间比较好用的网站,也陪我度过了一段时间了,排名不分先后,把压箱底的东西拿出来了。 ChatGPT WeTab 新标签页https://www.wetab.link/ 这个就不用多说,最…

如果让chatAI来写代码,会是怎么样的效果?

近日,我在刷B站的时候看到了由UP主老耗游戏发布的这个视频这下键盘不会废了! 在这个视频中,我了解到了这个网站:WeTab新标签页,也在这个网站中真正的接触到了ChatAI。 这个网站的chatAI功能实际上还是需要下载安装如谷…

GPT免费网站分享(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

一个iPhone/iPad可以无成本使用GPT的方法

WeTab新标签页 虽然gpt已经上线app store,但是国内的iPhone用户还是无法快速拥有。而最近WeTab新标签页上线了iOS和iPadOS端,直接在app store就能下载,并且无使用成本。 一直以来WeTab新标签页的PC端浏览器插件就受到了很多用户的喜爱&…

大数据看惊天逆转+绝杀,亚洲杯时隔16年夺冠,恭喜女足

在北京时间2022年2月6日晚结束的女足亚洲杯决赛中,在上半场0:2落后的局面下,’ 中国女足下半场5分钟连进两球,顽强扳平比分。 在随后的比赛中,中国女足在伤停补时阶段又打进1球,以最终比分3:2夺冠! 第9次夺…

程序员也为你骄傲~恭喜2022年女足夺得亚洲杯冠军~中国冠军~

今天是正月初七,虎年开工大吉的日子。 想想昨天女足夺冠的场景,还是很激动! 今天这版面留给特别的女足! 北京时间2月6日晚,中国国家女子足球队3比2逆转乾坤,战胜韩国女足,第9次捧起亚洲杯冠军…

C站CatGPT,对标ChatGPT,C站赢麻了

前言: 最近AI确实很火,而且也被炒的很高。针对日常程序开发有什么帮助呢?对于C站的爱好者,今天来聊聊CatGPT。 一、 使用入口 1、猿如意-CatGPT 猿如意为C站为程序猿开发的专业软件,其中使用几个月的感受来看&#xf…

【综合】体育比赛高手榜

【综合】体育比赛高手榜 虽然但是,还是不建议同学们直接抄我的代码_(:з」∠)_,我写博客的主要目的还是提供思路,代码也不一定就是最优解,有写的不清楚的部分或者是有更好的算法都可以留言awa 背景 某地举办冬季体育比赛&#…

张家俊:ChatGPT八个技术问题的猜想

Datawhale干货 作者:张家俊,中国科学院自动化研究所 转载自 | 机器学习与自然语言处理 看到ChatGPT的华丽诞生,心情很复杂,既高兴、惊喜,也感到恐慌,高兴和惊喜的是没有预料到这么快就见证了自然语言处理&…

python代码中的中文语法错误:SyntaxError: Non-ASCII character ‘\xe5‘ in file trade.py on line 7

编写的python程序中使用了中午,执行的时候报了上述语法错误。经过排查原因如下: 我使用的解释器的版本是python2的,Python 2默认的编码格式是ASCII,如果直接使用中文就会报如下错误: SyntaxError: Non-ASCII characte…

关于使用VS Code开发stm32的一些感想

0. 引言 这几天在推【宇宙最强编辑器VS Code】专栏系列文章,不少群聊和文章的留言都是关于使用VS code 进行stm32开发和调试,看到后思绪万千,不知如何回复,决定暂停更新,结合自身的经历写篇文章来回复这个问题。 两年…

浅谈NAS使用感想

为何买NAS 上周入手了一台NAS,对于我们小小的工作室来说,也算是“巨额”IT投资了。 买NAS的理由很简单:被刚刚过去的勒索病毒吓到了,虽然咱重要资料不多,但这些年积累下来,几百G还是有的。万一中了招&…

劝你轻易别来阿那亚,我怕你来了就不想走

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 4.21-23,津津乐道的几位主播收到深夜谈谈播客网络的邀请,在阿那亚参加了「声量The Power of …

emo-scheme 新特性

缘起 最近发现 scheme 组件使用的一些不完美和可改进点,主要有以下几个: DeepLink 该如何支持?期望使用时可以获取结构化的数据(data class),避免从 NavBackStackEntry 去 getString、getInt 之类的。期望…