.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 16379

requirepass qwe123
masterauth qwe123

active-replica yes
replicaof 127.0.0.1 26379

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

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

keydb-server db1.conf

keydb-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集群使用要简单很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值