.Net Core下使用KeyDB高可用缓存集群

前言

提到缓存,首先会想到Redis,它是目前最流行的开源内存键值存储服务。

使用单个Redis实例进行缓存非常简单,如果创建高可用集群,则需要一个主节点、两个从节点和多个监视主节点的哨兵节点:

哨兵节点监控主节点的状态,一旦出现故障,则将其中一个从节点提升为主节点。

为了高可用集群正常工作,哨兵节点需要为单数,不仅要监控主副节点,它们之间也要互相监控。

一旦某个哨兵节点出现故障,则主从切换可能失效。

可以看到,这种方式不仅部署复杂,对运维也有较高要求。

KeyDB

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

KeyDB支持主动复制功能,每个节点都设置成主节点,节点之间互相同步数据:

KeyDB允许你读取和写入所有节点,这可以增加高负载下的读取,并可保证如果一个节点出现故障,另一个将继续工作。

Demo

下面,我们演示用CentOS创建KeyDB集群,并用ASP.NET Core Web API使用缓存。

1. 安装KeyDB集群

运行下列命令安装KeyDB:

wget https://download.keydb.dev/pkg/open_source/rpm/centos7/x86_64/keydb-latest-1.el7.x86_64.rpm
sudo yum install ./keydb-latest-1.el7.x86_64.rpm

这里使用了同一台机器的2个端口(16379、26379)作为2个节点组成集群,创建配置文件db1.conf:

port 16379requirepass qwe123
masterauth qwe123active-replica yes
replicaof 127.0.0.1 26379

db2.conf配置相同,只是把端口互换一下。

分别运行下列命令启动集群:

keydb-server db1.confkeydb-server db2.conf

2. 安装Nginx

Nginx用作负载均衡,让处于主动复制模式的任一KeyDB节点都可以接收数据。

数据也会被复制到其他节点,如果一个节点出现故障,另一个将承担负载,直到问题得到解决。

下载Windows版最新的Nginx,修改conf\nginx.conf后运行。

nginx.conf内容如下:

events {worker_connections  1024;
}stream
{upstream keydb{server 192.168.1.10:16379;server 192.168.1.10:26379;}server{listen 127.0.0.1:6379;proxy_pass keydb;proxy_protocol off;}}

Nginx监听本机的6379端口,并且请求转发到KeyDB集群。

3. 创建示例应用

新建ASP.NET Core Web API。

由于KeyDB和Redis完全兼容,可以直接使用Redis的客户端类库

引用nuget包Microsoft.Extensions.Caching.StackExchangeRedis,修改Startup.cs:

public void ConfigureServices(IServiceCollection services)
{services.AddStackExchangeRedisCache(options =>{options.Configuration = this.Configuration.GetConnectionString("keydb");});...
}

修改appsettings.json增加配置,连接串对应Nginx地址:

"ConnectionStrings": {"keydb": "localhost:6379,password=qwe123"}

Controller实现代码如下:

[HttpGet]
public async Task<string> Get()
{var key = "KeyDbDemo";string result = await _cache.GetStringAsync(key);if (string.IsNullOrEmpty(result)){//缓存60秒var cacheEntryOptions = new DistributedCacheEntryOptions();cacheEntryOptions.SlidingExpiration = TimeSpan.FromSeconds(60);await _cache.SetStringAsync(key, "My IO", cacheEntryOptions);return "No Cache";}return result;
}

可见和使用Redis没有任何区别。

4. Demo

运行程序,效果如下:

可以看到2个KeyDB节点都有数据:

停止任一KeyDB节点,程序还是能够正常工作。

结论

在本文中,我们介绍了KeyDB集群,确实比Redis集群使用要简单很多。

可以把使用Redis的程序无缝切换过来,你还不赶快试一下!

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

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

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

相关文章

超赞!世界10个著名悖论的最终解答来了!

全世界只有3.14 % 的人关注了爆炸吧知识今天小编看到一篇作者Das对十大悖论的个人理解&#xff0c;觉得挺有意思&#xff0c;现在便分享给模友们看看&#xff0c;你们的想法是怎样的呢&#xff1f;电车难题引用&#xff1a;“电车难题”是伦理学领域最为知名的思想实验之一&…

C# 数据类型及相互转换及常用基础

C#的数据类型可以分为3类&#xff1a;数值类型、引用类型、指针类型。指针类型仅在不安全代码中使用。值类型包括简单类型&#xff08;如字符型、浮点型和整数型等&#xff09;、集合类型和结构型。引用类型包括类类型、接口类型、代表类型和数组类型。值类型和引用类型的不同之…

用wxpython做ui_wxPython - 如何强制UI刷新?

我把我的问题归结为这篇文章中显示的示例代码。请注意&#xff0c;我没有调用app.MainLoop&#xff08;&#xff09;&#xff0c;因为这不是一个交互式窗口;我希望它在开始时弹出&#xff0c;在工作发生时显示一些进度条&#xff0c;并在完成时消失。wxPython - 如何强制UI刷新…

设置计算机网络密码怎么设置路由器,如何在计算机上设置路由器密码?

问: 如何在计算机上设置路由器密码&#xff1f;A: 在计算机浏览器中&#xff0c;输入路由器的管理地址&#xff0c;打开登录页面&#xff0c;输入登录密码&#xff0c;然后进入设置页面.然后打开无线设置或Wi-Fi设置选项&#xff0c;您可以设置无线密码(wifi密码). 打开此选项可…

hive sql 怎么实现循环_不出办公室就能无水造纸?让废纸“秒循环再生”怎么实现的...

废纸变为再生纸&#xff0c;不出办公室就能循环利用起来&#xff0c;既节省大量木材&#xff0c;还不消耗一滴水……第三届进博会上&#xff0c;首次参展的打印巨头爱普生带来其全球首创的“干纤维纸张循环系统”&#xff0c;环保效果令人赞叹&#xff0c;吸引大批观众前来围观…

用ISAPI方式实现Web页面的自动更新

对于某些网站管理员来说&#xff0c;最痛苦的事情莫过于每天必做的重复工作。譬如&#xff1a;从新闻页面中删除旧的新闻标题&#xff0c;换上新的新闻标题&#xff1b;如果想让读者能看到以前的新闻&#xff0c;还要更改随时间改变的FormField值。等等。用DELPHI编写一个WebSe…

windows下编译firefox

可以自己定制下。估计很简单。。。。。 官方文档扫一遍&#xff1a; https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions 以下是中文相关博客&#xff1a; http://www.cnblogs.com/jianghust/archive/2010/06/14/1758234.html http://blog.…

两头编程,测试中间

最近在做一些开发测试代码的工作&#xff0c;就是为了测试中间业务程序&#xff0c;前头调用程序&#xff0c;后头写挡板程序&#xff0c;说白了就是链路调用&#xff0c;因为复杂度在中间的业务程序&#xff0c;所以前后两端的程序应相对简单。这里就有一个问题&#xff1a;技…

Win32 窗口篇(3)

1.11 如何显示或隐藏窗口的标题栏 使用ModifyStyle方法改变参数来更改窗体样式 void CDemoDlg::OnTest1() {//删除标题栏风格ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED); }void CDemoDlg::OnTest2() {//添加标题栏风格ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED); …

linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

来源CSDN:CSDN-专业IT技术社区-登录​blog.csdn.net一、概念和原理消息队列是另一种标准IPC,当然也大概遵循大部分标准消息队列,它是存放消息(数据)的队列&#xff0c;而队列是先进先出的线性数据结构换句话说,我们就是利用这个数据结构 进行进程间的通信消息队列允许多个进程同…

15个只有数学老师懂的泪流满面瞬间

全世界只有3.14 % 的人关注了爆炸吧知识「1」大题算了半天&#xff0c;就是跟标准答案对不上「2」一次令人期待的公开课啊啊——啊...「3」这就是传说中美好的协同教研「4」在网上下了一堆 PPT 准备拼到一起「5」预测高考题「6」临下课了还有三道大题没评讲「7」当我以为我已经…

matlab绘制二元一次函数图像_【八上数学】 一次函数必考知识点(下)

【八上数学】《一次函数》必考知识点(中)【八上数学】《函数、一次函数》必考知识点(上)写在前面本讲&#xff0c;我们重点研究一次函数与一元一次方程&#xff0c;不等式&#xff0c;二元一次方程组的问题&#xff0c;帮助同学们解决一些典型问题&#xff0e;一、一次函数与二…

计算机能代替纸笔英语作文,电脑能代替纸笔吗英语作文

电脑能代替纸笔吗英语作文在现实生活或工作学习中&#xff0c;说到作文&#xff0c;大家肯定都不陌生吧&#xff0c;作文可分为小学作文、中学作文、大学作文(论文)。作文的注意事项有许多&#xff0c;你确定会写吗&#xff1f;以下是小编为大家整理的电脑能代替纸笔吗英语作文…

《WinForm开发系列之高级篇》Item2 TCP异步传输

1.AsySocket.cs 代码 publicclassAsySocket {#region私有字段privateSocket mSocket null;privatestringmID "";#endregion#region构造函数publicAsySocket(string_LocalIP, int_LocalPort) { try{ mSocket newSocket(AddressFamily.InterNetwork, SocketType.Stream…

C# params的用法详解

为了将方法声明为可以接受可变数量参数的方法&#xff0c;我们可以使用params关键字来声明数组,要求&#xff1a;(1)在方法声明中的 params 关键字之后不允许任何其他参数&#xff0c;并且在方法声明中只允许一个 params 关键字。(2)该参数必须标识一个一维数组&#xff0c;但类…

忙碌的三月,小感慨下~

感觉这个月过的非常快&#xff0c;收获好多。 这个月一直在忙科技立项的事&#xff0c;忙着学习VSTO&#xff0c;忙着分配任务&#xff0c;忙着答辩。我个人还是很喜欢去接触新的东西的&#xff0c;各种学习&#xff0c;呵呵。在这次科技立项中学到了更多的是管理方面的东西&am…

spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

公众号关注“程序员二哥”&#xff0c;设为‘星标’&#xff0c;带你学习更多的知识。本文内容 详细介绍5中bean的sope及使用注意点自定义作用域的实现应用中&#xff0c;有时候我们需要一个对象在整个应用中只有一个&#xff0c;有些对象希望每次使用的时候都重新创建一个&…

女生的拳头有多厉害?

1 天下武功唯快不破2 狗子&#xff1a;没想到我有这种天赋3 哈哈哈还是你社会啊4 女生的拳头有多厉害&#xff1f;?5 怎么解开的&#xff1f;6 心中有海&#xff0c;脚下有沙&#xff0c;这就是马尔代夫7 你的人生概括

【转】10个让人受益的管理原理

1、彼得原理    每个组织都是由各种不同的职位、等级或阶层的排列所组成&#xff0c;每个人都隶属于其中的某个等级。彼得原理是美国学者劳伦斯彼得在对组织中人员晋升的相关现 象研究后&#xff0c;得出一个结论&#xff1a;在各种组织中,雇员总是趋向于晋升到其不称职的地…

与ln的指数转化公式_高考数学48条秒杀型公式与方法

点上方蓝字&#xff0c;关注“云学冠学习资讯”有助于提高成绩哦&#xff01;除了课本上的常规公式之外&#xff0c;掌握一些必备的秒杀型公式能够帮你在考试的时候节省大量的时间&#xff0c;师姐这次的分享就是48条秒杀公式&#xff0c;直接往下看&#xff01;1.适用条件&…