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