protobuf使用详解_使用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("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.Getbyte>>(Assert.Equal<string>(Encoding.UTF8.GetString(result.Array, 0, result.Count), "henryfan@msn.com");

创建订阅

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

创建列表

var list = DB.CreateList("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 stream = DB.GetStream("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

76cafa4f8a96cbc3d04de0cef9c3ae83.png

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

henryfan@msn.com|admin@beetlex.io

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值