使用BeetleX訪問redis服務

        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

相關文章
相關標籤/搜索