文档章节

C# Redis

o
 osc_db1n5a75
发布于 2019/01/03 13:51
字数 2369
阅读 12
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

原文: C# Redis

C# Redis

  1. 发布订阅模型
  2. Redis中的发布订阅
  3. 客户端编程示例
  4. 0.3版本Hredis

发布订阅模型

在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。

发送方:只负责向第三方发送消息。(杂志社把读者杂志交给邮局)
接收方:被动接收消息。(1:向邮局订阅读者杂志,2:门口去接邮过来的杂志)
第三方作用是:存储订阅杂志的接收方,并在杂志过来时送给接收方。 (邮局)

C#示例,发送方把杂志放到邮局里面:

if (QA.AddBug())
            EmailNotify();
接收方到邮局登记地址,有杂志过来时送货上门:
EmailNotify += () => { Console.WriteLine("A君"); };
    EmailNotify += () => { Console.WriteLine("B君"); };

第三方邮局接受读者杂志订阅,收到杂志时进行派送:

public delegate void MessageHandler();
    public static event MessageHandler  EmailNotify;

        if (QA.AddBug())
            EmailNotify();

当我们把观察者模式放大到系统级时,就是发布订阅(pub/sub)了。 主要是用来降低发布者和订阅者的耦合,提高前端系统吞吐量。结构如图:

Redis中的发布订阅

Redis实现完整的发布订阅范式,就是说任何一台redis服务器,启动后都可以当做发布订阅服务器。

普通订阅

启动订阅者client。

redis-cli.exe -h 127.0.0.1 -p 6379

订阅bar频道。格式:SUBSCRIBE name1 name2。 
成功订阅回复,分别对应订阅类型、订阅频道、订阅数量。

127.0.0.1:6379> SUBSCRIBE bar
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "bar"
3) (integer) 1

新起个发布者client,发送消息。格式:publish channelName Message。

127.0.0.1:6379> publish bar val
(integer) 1

订阅client回复,分别对应消息类型,频道,消息。

1) "message"
2) "bar"
3) "val"

图例

模式订阅

Redis支持模式匹配订阅,*为模糊匹配符。
订阅所有频道的消息

PSUBSCRIBE *

订阅以news.开头的所有频道。

PSUBSCRIBE news.*

取消订阅

取消普通订阅和取消模式订阅的命令。

UNSUBSCRIBE  bar
PUNSUBSCRIBE  ba*

取消在官方提供的连接工具中无法模拟的。

查看订阅信息

查看订阅消息是redis在2.8中心增加的命令之一。

pubsub channels [pattern] 。

返回当前服务器被订阅的所有频道。

127.0.0.1:6379> pubsub channels
1) "bar"

指定匹配参数,返回与模式匹配的所有频道。

127.0.0.1:6379> pubsub channels ba*
1) "bar"

pubsub numsub [channel-1 channel-2 ...channel-n]

接受任意多个频道作为输入参数,返回这些频道的订阅者数量。

127.0.0.1:6379> pubsub numsub  bar bar2
1) "bar"
2) (integer) 1
3) "bar2"
4) (integer) 0

客户端编程示例

复制代码
RedisPubSub client = new RedisPubSub("127.0.0.1", 6381);
            client.OnUnSubscribe += (obj) => {
                Console.WriteLine();
            };
            client.OnMessage = (sender, arcgs) =>{
                Console.WriteLine(arcgs);
            };
            client.OnError = (Exception) => { 
                Console.WriteLine(Exception.Message);
            };
            client.Subscribe("bar");

            Console.ReadLine();
复制代码

0.3版本HRedis

基本使用

using (RedisClient client = new RedisClient("127.0.0.1", 6381))
        {
            client.Set("key", "value");
            client.Get("key");
        }

使用连接池,自动回收连接。

PoolRedisClient prc = new PoolRedisClient(new PoolConfiguration());

        prc.Single.Set("key", "value");

        prc.Single.Get("key");

及上面的订阅。

 

C# Redis系列(二)-Hredis客户端设计及开源

2015-04-18 08:02 by 蘑菇先生, 1155 阅读, 收藏编辑
接上篇c#实现redis客户端(一),重新整理些了下。阅读目录:项目说明Hredis设计图单元测试场景总结项目说明背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端,所以就简单重写了个。目标:尽可能的简单,轻量级,不进行过度的封装,使用方便。代码说明: 1. 与Redis...

AutoMapper使用手册(一)

2015-02-14 18:00 by 蘑菇先生, 948 阅读, 收藏编辑
阅读目录 1. 介绍 2. 基本使用 3. 自动分割映射(Flattening) 4.自定义字段映射(Projection) 5.验证配置(Configuration validation)介绍AutoMapper是一个轻量级的类库,主要功能是把一个对象转换成另外一个对象,而避免我们每次都...

Net作业调度(五)—quartz.net动态添加job设计

2015-01-19 08:42 by 蘑菇先生, 1623 阅读, 收藏编辑
介绍在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布。也看到有园子的同学问过。这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模块。目录一:传统方式二:框架反射方式三:进程方式四:URL方式五:框架配置方式六:总结一:传统方式1: ...

Net作业调度(四)—quartz.net持久化和集群

2015-01-18 15:17 by 蘑菇先生, 1240 阅读, 收藏编辑
介绍在实际使用quartz.net中。持久化能保证实例重启后job不丢失、 集群能均衡服务器压力和解决单点问题。quartz.net在这二块配置都比较方便,来看下。一:持久化quartz.net的持久化,是把job、trigger一些信息存储到数据库里面,以解决内存存储重启丢失。1: 下载sql脚本...

c#实现redis客户端(一)

2015-01-12 08:55 by 蘑菇先生, 1678 阅读, 收藏编辑
最近项目使用中要改造redis客户端。就看了下文档,总结分享一下。目录一:协议规范二:基础通信三:状态命令四:set、get命令五:管道、事务六:总结一:协议规范redis允许客户端以TCP方式连接,默认6379端口。传输数据都以\r\n结尾。请求格式*\r\n$\r\n\r\n例:*1\r\n$...

日志系统实战(三)-分布式跟踪的Net实现

2014-12-13 20:16 by 蘑菇先生, 1728 阅读, 收藏编辑
介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了。莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是ios端参数传的不对?还是A系统或B系统提供的接口导致?相信大家碰到不少,大多数问题不大,但排查起来比较费劲。 下面,我们来看下具体实现。目录一:概述二:web环...

日志系统实战(二)-AOP动态获取运行时数据

2014-11-27 08:22 by 蘑菇先生, 1624 阅读, 收藏编辑
介绍这篇距上一篇已经拖3个月之久了,批评自己下。通过前面一篇介绍。我们通过mono反射代码,可以拿出编译好的静态数据、例如方法参数信息之类的。但实际情况是:我更需要运行时的数据,就是用户输入等外界的动态数据。既然是动态的,那就是未知的。我们怎么通过提前注入的代码获取呢? 其实这是一个思路的问题,下面...

Net作业调度(三) — Quartz.Net进阶

2014-11-17 22:32 by 蘑菇先生, 488 阅读, 收藏编辑
介绍前面我们介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求。 比如记录job执行的执行历史,发邮件等。目录1:Quartz.Net插件2:TriggerListener,JobListener3:Cron表达式4:Quartz.Net 线程池5:总结Quartz.Net插件...

Net作业调度(二) -CrystalQuartz远程管理

2014-11-01 18:21 by 蘑菇先生, 712 阅读, 收藏编辑
Source Code-1.6M介绍接着上一篇。 我们已经初步会使用Quartz.NET了。但如果想方便的知道某个作业执行情况,并暂停,启动等等,这时候就需要个管理界面了。本文介绍Quartz.NET 远程管理。如图:实战一:作业服务端 static void Main(string[] args)...

Net作业调度(一) -Quartz.Net入门

2014-11-01 13:14 by 蘑菇先生, 850 阅读, 收藏编辑
背景很多时候,项目需要在不同个时刻,执行一个或很多个不同的作业。Windows执行计划这时并不能很好的满足需求了。 这时候需要一个更为强大,方便管理,集部署的作业调度了。介绍Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net是Quartz的C#移植版本。它一...

日志系统实战(一)—AOP静态注入

2014-08-24 13:00 by 蘑菇先生, 659 阅读, 收藏编辑
背景近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息。这时候就想到用Aop的方式了。技术分析AOP分动态注入和静态注入。动态注入方式1:利用Remoting的ContextBoundObject或MarshalByRefObject。2:动态代理(反射),大多AOP框架都用这种方式...

列存储设计技巧

2014-06-02 11:37 by 蘑菇先生, 191 阅读, 收藏编辑
背景: 开发个学生系统,数据库设计。设计实施:传统数据库学生表行设计学号姓名性别年龄1张三男162李红女153王五男16当想扩展属性时,相对应的会增加字段。学号姓名性别年龄住址1张三男16河南2李红女15湖北3王五 男16北京实际开发中这样做的缺点:1:属性字段向主表加,会导致列越来越多,增加表...

开源地址 https://github.com/mushroomsir/HRedis

作者:蘑菇先生 出处:  http://mushroom.cnblogs.com/
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
PHP框架--XiunoPHP

XiunoPHP 是一款面向高负载应用的 PHP 开发框架,PHPer 通过它可以快速的简单的开发出高负载项目。 XiunoPHP 前身名为 Xiuno Framework,更名后版本号从 v1.0 开始计算。已经经过了多年的实际...

匿名
2013/03/20
2.5K
0
Redis 分片实现--Redis Shard

redis-shard 是 Redis 分区的 Python API ,基于对 key 和 key tag 进行 CRC32 checksum 计算,可参考文章 http://antirez.com/post/redis-presharding.html . 该项目由知乎网开发。 使用限制...

匿名
2012/10/24
5.6K
0
Nginx-Redis

Nginx-Redis 是为 nginx-perl 准备的异步 redis 客户端。 示例代码: use Nginx::Redis; ngxredis '127.0.0.1:6379', ['GET', 'mykey'], sub { my ($reply) = @; unless ($reply) { warn "er......

匿名
2012/11/19
3.1K
0
Fluent nHibernate

对nHibernate的封装。 特点 无XML映射文件 (.hdm.xml) 流畅接口 流程C#配置nHibernate 流畅C#映射,甚至自动映射。 强类新映射,减少类新匹配错误 * 数据库的重构,变得更容易 Fluent nHibe...

匿名
2012/11/29
3.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

PPDet:减少Anchor-free目标检测中的标签噪声,小目标检测提升明显

本文转载自AI算法修炼营。 这篇文章收录于BMVC2020,主要的思想是减少anchor-free目标检测中的label噪声,在COCO小目标检测上表现SOTA!性能优于FreeAnchor、CenterNet和FCOS等网络。整体思路...

我爱计算机视觉
昨天
0
0
BIO、NIO、AIO 区别和应用场景

点击上方“ java1234 ”,选择“标星公众号” 优质文章,第一时间送达 66套java从入门到精通实战课程分享...

小锋2
今天
0
0
ContentProvider(查询 插入 修改 删除 )

注意 本篇实在sqlite的基础上编写的所以建议首先了解sqlite 首先建立两个模块 ContentProvider ContentResolver ContentProvider 里面需要建立表和建立连接 所以在这里需要建立DBHelp类 DBHe...

osc_6ttvlt1w
26分钟前
30
0
用这个网站一查,才知道自己被卖了

还记得上个月好多大佬的Twitter账号被盗用于网络诈骗的事件吗。 7月15日,美国前总统奥巴马、“股神”巴菲特、特斯拉CEO马斯克、微软创始人比尔·盖茨等人的账户连续“被登录”,用来向大众诈...

猿大白
今天
11
0
牛客多校第9场E Groundhog Chasing Death

开始以为是什么高深的数论题,后来 重新 推了一下,得到了个这么个式子。 ∏ i = a b ∏ j = c d ( p 1 m i n ( a 1 [ 1 ] i , a 2 [ 1 ] j ) p 2 m i n ( a 1 [ 2 ] i , a 2 [ 2 ] j ) . . ...

osc_wdq5dwoy
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部