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

使用BeetleX访问redis服务相关推荐

  1. jmeter修改redis_jmeter如何访问redis服务缓存

    Redis(REmote DIctionary Server)是一个开源的内存数据结构存储,用作数据库,缓存和消息代理. 作为内存数据库,它将所有数据保存在RAM中.Redis在读取/写入数据时实现高 ...

  2. Windows下安装Redis服务

    2019独角兽企业重金招聘Python工程师标准>>> Redis是有名的NoSql数据库,一般Linux都会默认支持.但在Windows环境中,可能需要手动安装设置才能有效使用.这 ...

  3. CentOS 7安装Redis服务

    一.Redis下载 在centOS里通过wget下载redis wget http://download.redis.io/releases/redis-4.0.11.tar.gz  具体版本下载地址 ...

  4. Unable to Connect: sPort: 0 C# ServiceStack.Redis 访问 redis

    需求:  对数据库中的不断抓取的文章进行缓存,因此需要定时访问数据,写入缓存中 在捕获到的异常日志发现错误:Unable to Connect: sPort: 0 使用的访问方式是线程池的方式:Poo ...

  5. 主机无法连接虚拟机中的redis服务

    解决:主机<本地>无法连接虚拟机中的redis服务 首先保证虚拟机网络已经和主机网络互通,即相互ping对方IP,能ping通但是仍然连不上redis服务,可能是以下问题. redis服务 ...

  6. Redis服务安全加固

    转载来源 : https://help.aliyun.com/knowledge_detail/37447.html?spm=a2c4g.11186623.4.4.674b4b12XmJSTD 一.背 ...

  7. 国产服务器(麒麟操作系统),springboot应用并发访问redis数据错乱解决方案

    问题描述: 国产服务器,麒麟操作系统进行部署springboot应用的时候,压测并发访问redis 服务出现数据错乱情况,比如Key A的数据给了KeyB,Key B的值给了KeyC等,导致系统不可用 ...

  8. windows安装redis服务

    说明:本文拷贝自https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html Redis是有名的NoSql数据库,一般Linux都会默 ...

  9. 外部访问redis服务器

    默认情况下,除了redis服务器本身之外,其他机器不能访问redis服务.如果外部需要访问,需要修改下配置文件,将如下语句注释掉(注意还需要关闭防火墙),然后重启 1.关闭redis [root@ce ...

最新文章

  1. [原创]Silverlight与PostgreSQL数据库的互操作(CURD完全解析)
  2. 复制MySQL实时_自制mysql主从复制(实时)软件——实现
  3. MySQL删除外键约束
  4. pdo_mysql 必须 ×未安装_php pdo_mysql未安装问题解决方法_PHP教程 | 蒲公英网
  5. Topforces Strikes Back
  6. vue 为全局变量赋值_vue设置全局变量和修改
  7. Azkaban-two_server模式-job任务运行
  8. MySQL性能优化知识:长连接、短连接、连接池
  9. 女朋友在家是怎么利用我的模型的​
  10. css绘制向左三角形_CSS绘制三角形—border法
  11. php能做什么程序,PHP 能做什么?
  12. 公募FOF同质化产品情况引人关注
  13. discuz 登录代码流程
  14. MISRA C_2012规则翻译、解读、示例
  15. C语言交换两个变量数值的几种方法
  16. Integer.MAX_VALUE是什么意思
  17. win7 正式版安装成功,贴图得瑟一下
  18. 64位计算机最大寻址,为什么说32位操作系统的寻址空间是4G
  19. 自学前端开发,现在手握大厂offer,我的故事还在继续
  20. 把backtrader改造成金融强化学习回测引擎

热门文章

  1. linux下mysql数据库操作命令
  2. 02 JRE与JDK
  3. Qt 如何处理密集型耗时的事情
  4. DIV+CSS列表式布局(同意图片的应用)
  5. android中Camera setDisplayOrientation使用
  6. 二 ASP.NET AutoPostBack
  7. Macbook全系列详细分析及购机指南
  8. css3 伪类选择器
  9. 中国HBase技术社区第五届MeetUp ——HBase技术解析及应用实践(深圳站)
  10. AWD-LSTM为什么这么棒?