BeetleX针对redis访问封了全async/await操做模式,经过它能够更高效地访问redis服务。BeetleX.Redis提供读写分离和多机故意写入处理,同时安全的TLS访问机制,在使用功能上组件支持绝大部分基础指令,并提供json,protobuf和messagepack序列化的支持;组件默认基于链接池操做,高并发处理使更简便。javascript
支持指令
php
组件实现的基础指令虽然不是所有,但相关基础功能的都有实现,包括有序列,订阅和消息队列等等;如下是实现的指令列表。
css
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.Redisjava
使用
git
在项目中经过Nuget引用BeetleX.Redis组件,最新版本是v1.0.1。引用组件后就能够经过RedisDB来操做redis服务。github
RedisDB DB = new RedisDB(0);
建立完RedisDB后须要添加对应的redis写入服务地址web
db.Host.AddWriteHost("127.0.0.1");
以上是针对当前RedisDB添加一个服务地址,实际上能够经过AddWriteHost添加多个,当存在多个WriteHost的状况按顺序写入第一个,其余WriteHost则用于故障备份须要。若是须要读写分离能够经过AddReadHost添加读的服务地址.redis
db.Host.AddReadHost("127.0.0.1", 6378);
为了能够对应故障处理,一样支持添加多个。
json
序列化格式
安全
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