使用BeetleX访问redis服务

        BeetleX针对redis访问封了全async/await操作模式,通过它可以更高效地访问redis服务。BeetleX.Redis提供读写分离和多机故意写入处理,同时安全的TLS访问机制,在使用功能上组件支持绝大部分基础指令,并提供json,protobuf和messagepack序列化的支持;组件默认基于连接池操作,高并发处理使更简便。

支持指令

        组件实现的基础指令虽然不是全部,但相关基础功能的都有实现,包括有序列,订阅和消息队列等等;以下是实现的指令列表。

AUTH| BLPOP| BRPOP| BRPOPLPUSH| DECR| DECRBY| DEL| DUMP| EXISTS|
EXPIRE| EXPIREAT| FLUSHALL| GET| GETBIT| GETRANGE| GETSET| HDEL| 
HEXISTS| HGET| HGETALL| HINCRBY| HINCRBYFLOAT| HKEYS| HLEN| HMGET| 
HMSET| HSET| HSETNX| HSTRLEN| HVALS| INCR| INCRBY| INCRBYFLOAT| 
KEYS| LINDEX| LINSERT| LLEN| LPOP| LPUSH| LPUSHX| LRANGE| LREM| 
LSET| LTRIM| MGET| MOVE| MSET| MSETNX| OBJECT| PERSIST| PEXPIRE| 
PEXPIREAT| PING| PSETEX| PTTL| PUBLISH| RANDOMKEY| RENAME| RENAMENX|
RPOP| RPOPLPUSH| RPUSH| RPUSHX| SCAN| SELECT| SET| SETBIT| SETEX| 
SETNX| SETRANGE| STRLEN| SUBSCRIBE| TOUCH| TTL| TYPE| UNLINK|
UNSUBSCRIBE| WAIT| ZADD| ZCARD| ZCOUNT| ZINCRBY| ZINTERSTORE| 
ZLEXCOUNT| ZRANGE| ZRANGEBYLEX| ZRANGEBYSCORE| ZRANK| ZREM| 
ZREMRANGEBYLEX| ZREMRANGEBYRANK| ZREMRANGEBYSCORE| ZREVRANGE| 
ZREVRANGEBYSCORE| ZREVRANK| ZSCORE| ZUNIONSTORE| PFCount| PFAdd|
PFMerge| INFO| XACK| XADD| XDEL| XGROUP| XLEN| XRANGE| XREAD|
XREADGROUP| XREVRANGE|

涉及到常用功能一百多个指令都有实现,不过在集群方面组件并没有支持,主要考虑到这种方式都可以通过服务拆分治理的方式可以解决。如果你也想参与这个组件的开发可以访问 https://github.com/IKende/BeetleX.Redis

使用

        在项目中通过Nuget引用BeetleX.Redis组件,最新版本是v1.0.1。引用组件后就可以通过RedisDB来操作redis服务。

RedisDB DB = new RedisDB(0);

创建完RedisDB后需要添加对应的redis写入服务地址

 db.Host.AddWriteHost("127.0.0.1");

以上是针对当前RedisDB添加一个服务地址,实际上可以通过AddWriteHost添加多个,当存在多个WriteHost的情况按顺序写入第一个,其他WriteHost则用于故障备份需要。如果需要读写分离可以通过AddReadHost添加读的服务地址.

db.Host.AddReadHost("127.0.0.1", 6378);

为了可以对应故障处理,同样支持添加多个。

序列化格式

        RedisDB默认是以string的方式来处理内容,一般情况不会这样用,毕竟在应用中都涉及到对象处理;所以在使用前最好配置一下DataFormater类型。

RedisDB.DataFormater = new JsonFormater();

以上是配置一个Json的序列化处理器,组件还提供ProtobufFormater和MessagePackFormater;相对于json来说这两种序列化可以得到更高效的序列化处理性能和更低的内存占用空间。

密码/TLS

        为了安全考虑一般redis服务都会添加密码,有些情况为了保障通讯的安全还可能基于TLS的方式访问。

var host = RedisDB.Host.AddWriteHost("127.0.0.1", 6379, true);
host.Password = "123456";

以上代码是在添加服务地址的时候指定为TLS访问,通过Password属性设置服务访问密码。

操作

        当RedisDB定义好后就可以进行操作,RedisDB的所有操作都是基于async/await进行

  • SET/GET

var result = await DB.Set("test", "henryfan1");
var value = await DB.Get<string>("test");
  • MSET

var result = await DB.MSet(("key1", "hello"), ("key2", "world"));
var get = await DB.Get<string>("key1");
get = await DB.Get<string>("key2");

快速访问

        如果不想定义RedisDB对象,组件提供了一个默认的DefaultRedis对象来简单化操作。

 DefaultRedis.Instance.DataFormater = new JsonFormater();DefaultRedis.Instance.Host.AddWriteHost("127.0.0.1");await DefaultRedis.Set("emp1", GetEmployee(1));await DefaultRedis.Set("order1", GetOrder(1));await DefaultRedis.Set("customer1", GetCustomer(1));await DefaultRedis.Get<Employee, Order, Customer>("emp1", "order1", "customer1");

bytes操作

        有些情况需求直接读写redis的bytes数据,组件支持这样操作。

var data = Encoding.UTF8.GetBytes("henryfan@msn.com");
await DB.Set("bytes", new ArraySegment<byte>(data));
var result = await DB.Get<ArraySegment<byte>>("bytes");
Assert.Equal<string>(Encoding.UTF8.GetString(result.Array, 0, result.Count), "henryfan@msn.com");

创建订阅

var subscribe = DefaultRedis.Subscribe();
subscribe.Register<Employee>("employees", e =>
{Console.WriteLine($"Receive employee {e.FirstName} {e.LastName}");
});
subscribe.Listen();

创建列表

var list = DB.CreateList<Employee>("employees");
await list.RPush(GetEmployee(1));
await list.RPush(GetEmployee(2));
await list.Insert(true, GetEmployee(2), GetEmployee(3));
await list.Range(0, -1);

键值表

var table = DB.CreateHashTable("myhash");
await table.MSet(("field1", "hello"), ("field2", "world"));
var values = await table.Get<string, string, string>("field1", "field2", "nofield");

序列

string member = "ken";
var sequeue = DB.CreateSequence("seq2");
var count = await sequeue.ZAdd((4.14, member));
var value = await sequeue.ZScore(member);
await sequeue.ZIncrby(5, member);
value = await sequeue.ZScore(member);

队列

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var id = await stream.Add(DataHelper.Defalut.Employees[0]);
id = await stream.Add(DataHelper.Defalut.Employees[1]);
id = await stream.Add(DataHelper.Defalut.Employees[2]);
var len = await stream.Len();var group = await stream.GetGroup("g1");
var items = await group.Read("henry", "0");
foreach (var item in items)await item.Ack();
items = await group.Read("henry");
【BeetleX通讯框架代码详解】
【WebApi示例扩展】
BeetleX

开源跨平台通讯框架(支持TLS)
轻松实现高性能:tcp、http、websocket、redis、rpc和网关等服务应用

https://beetlex.io

如果你想了解某方面的知识或文章可以把想法发送到

henryfan@msn.com|admin@beetlex.io

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

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

相关文章

鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?

对于大部分差友们来说&#xff0c;“开发者大会”这个词一定显得陌生而又遥远&#xff0c;跟普通的产品发布会不一样&#xff0c;他们面向的对象并不是普通的消费者&#xff0c;而是各种程序猿和攻城狮。话又说回来&#xff0c;能开“ 开发者大会”&#xff0c;也说明这个企业已…

android loading封装_我们经常用的Loading动画居然还有这种姿势

背景Loading动画几乎每个Android App中都有。一般在需要用户等待的场景&#xff0c;显示一个Loading动画可以让用户知道App正在加载数据&#xff0c;而不是程序卡死&#xff0c;从而给用户较好的使用体验。同样的道理&#xff0c;当加载的数据为空时显示一个数据为空的视图、在…

数据结构——基于字符串模式匹配算法的病毒感染检测

实验四 基于字符串模式匹配算法的病毒感染检测 【实验目的】 1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配BF算法和KMP算法的实现。 【实验内容】 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了…

WPF 使用 Expression Design 画图导出及使用 Path 画图

WPF 使用 Expression Design 画图导出及使用 Path 画图目录WPF 使用 Expression Design 画图导出及使用 Path 画图一、软件介绍二、Microsoft Expression Design 使用三、微语言和 Path 绘图1、"注释" 图形&#xff08;中括号&#xff09;2、"并行模式" 图…

数据结构——模式匹配kmp算法

暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int ipos,j1;while(i<S[0]&&j<T[0]){if(S[i]T[j]){i;j;}else {ii-j2;j1;}}if(j>T[0])return i-T[0];else return 0;} kmp算法 next[]数组的求法&#xff1a; 例子&#xff1a;abaabcac 模式串…

互联网时代供应链

供应链是指围绕核心企业&#xff0c;从配套零件开始&#xff0c;制成中间产品以及最终产品&#xff0c;最后由销售网络把产品送到消费者手中的、将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。供应链管理的经营理念是从消费者的角度&a…

win7 计算器 android,教你巧妙应用Win7计算器和时钟

正文最新的Win7是一种个性化设计极强的操作系统&#xff0c;在许多细节方面都做到了人性化设计。其功能的DIY性非常明显&#xff0c;是XP系统远远不能比的。今天我们要说的是Win7计算器和时钟&#xff0c;除了可以计算和时间之外我们还可以让他们有哪些妙用呢&#xff1f;我们左…

真实经历:整整一年了,他是这样从程序员转型做产品经理的

这是头哥侃码的第224篇原创每年年底&#xff0c;有不少企业都会对一年内辛勤劳作的员工量身定做一些奖项。发个奖杯&#xff0c;给点奖金&#xff0c;让那些没得奖的人看看&#xff0c;咱们公司有多么的关注员工的闪光点&#xff0c;优秀之处。用人所长&#xff0c;容人所短&am…

数据结构—— 基于二叉树的算术表达式求值

实验五 基于二叉树的算术表达式求值 数据结构——中序表达式求值&#xff08;栈实现&#xff09; 实验目的&#xff1a; 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法。 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于表达式树的表达式求值算法。 实验内容&a…

数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...

世界知名迷你准系统领导品牌&#xff0d;浩鑫Shuttle&#xff0c;秉承开拓创新&#xff0c;引领行业发展的传统&#xff0c;此次创造性的推出全球首款采用英特尔硬件方案搭载Android系统的NS01A数字标牌播放器&#xff0c;为整个数字标牌行业贡献了全新的硬件解决方案。英特尔方…

BCVP开发者说第3期:Adnc

沉静岁月&#xff0c;淡忘流年1项目简介AdncAdnc是一个轻量级的.NetCore微服务快速开发框架&#xff0c;同时也可以应用于单体架构系统的开发。框架基于JWT认证授权、集成了一系列微服务配套组件&#xff0c;代码简洁、易上手、学习成本低、开箱即用。    框架前端基于Vue、…

数据结构——二叉树的非递归算法

二叉树的非递归算法 先序遍历非递归算法1 先序遍历非递归算法2 非递归交换左右孩子算法 使用栈来实现二叉树的非递归算法 栈的基本算法 #include<stdio.h> #include<bits/stdc.h> typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1 #define …

python字符串的表示_Python字符串方法总结

Python字符串方法图示&#xff1a; &#xff08;温馨提示&#xff1a;对图片点右键——在新标签页中打开图片&#xff09;1、index() 定义&#xff1a;查找并返回指定str的索引位置&#xff0c;如果没找到则会抛异常&#xff08;查找的顺序是从左至右&#xff09;可以指定范围&…

Kuma 1.0 GA发布,70多项新功能和改进

喜欢就关注我们吧&#xff01;Kuma 1.0 GA 现已发布&#xff0c;包含了 70 多种新功能和改进。Kuma 是一个现代的通用服务网格控制平面&#xff0c;基于 Envoy 搭建&#xff0c;Envoy 是一个为云原生应用设计的强大的代理软件。Kuma 高效的数据平面和先进的控制平面&#xff0c…

还在犹豫是否迁移.NET5?这几个项目已经上线了!

.NET5正式发布有十多天&#xff0c;博客园、知乎、技术群都讨论的非常热烈。关于项目是否迁移.NET5的话题讨论的尤为热烈&#xff0c;作为.NET十年老司机要告诉你&#xff0c;.NET5的迁移势在必行&#xff0c;当下就是最好的时机&#xff01;犹豫项目是否升级到.NET5的&#xf…

Android切换泰语,Android应用内切换语言

首先扯点别的&#xff1a;这是第一次在简书上写东西&#xff0c;我突然明白为啥这么多人在简书上写东西了&#xff0c;因为没有广告啊&#xff0c;哈哈。最近接触到Android 应用内切换语言的问题&#xff0c;研究了两天&#xff0c;做个记录先。实现了中文&#xff0c;英文&…

工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...

黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计第一标段招标公告招标编号&#xff1a;JTZGSJ20200011.招标条件本招标项目黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计已由上级部门批准建设&#xff0c;项目业主为哈尔滨交通集团有限公司&#xff0c;建设资金来…

从 3.1 到 5.0 —— OpenReservation 更新记

OpenReservation 从 asp.net core 3.1 到 5.0IntroOpenReservation 是一个开源的预约系统&#xff0c;最初的版本是我们学校的活动室预约系统&#xff0c;现在正逐步变成一个更为通用的预约系统。.NET5 发布之后也是把这个项目更新到了 5.0。这个项目是一个做了很长时间的项目&…

数据结构——哈弗曼编码问题

实验六 基于哈夫曼树的数据压缩算法 【实验目的】 掌握哈夫曼树的构造算法。掌握哈夫曼编码的构造算法。 【实验内容】 问题描述 输入一串字符,根据给定的字符串中字符出现的频率建立相应的哈夫曼树, 构造哈夫曼编码表,在此基础上可以对压缩文件进行压缩(即编码),同时可以对 压…

relation does not exist报错是什么意思_为什么Zookeeper天生就是一副分布式锁的胚子?...

“ 什么是分布式锁&#xff1f;分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中&#xff0c;常常需要协调他们的动作。图片来自 Pexels如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0…