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