C# redis 的简单应用
region 准备参数
var connStr = "localhost:6379,password=";
var db = 2;
SiteRedisHelper redisHelper = new SiteRedisHelper(connStr, "monster", db);
var key = "MessageQueue";
var msg = string.Empty;
#endregion
消息写入+读取(入门版)
#region 添加消息
while (true)
{
Console.WriteLine("请输入你需要发送的消息");
msg = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(msg))
{
// var listLeftPush = redisHelper.ListLeftPush(key, msg);//添加一条消息并返回已添加消息数量
var listLeftPushAsync = redisHelper.ListLeftPushAsync(key, msg);//异步添加
//追加事件
listLeftPushAsync.ContinueWith((task =>
{
if (task.IsCompletedSuccessfully)
{
Console.WriteLine($"消息添加完毕,此消息队列共有{task.Result}条信息");
}
}));
}
else
{
Console.WriteLine("停止发送消息");
break;
}
};
#endregion
#region 读取消息
while (!string.IsNullOrWhiteSpace(msg = redisHelper.ListLeftPop(key)))
{
Console.WriteLine("消息出列:" + msg);
Debug.WriteLine("消息出列:" + msg);
FileLogTools.Write(msg, "RedisMSMQ.Try");
}
#endregion

相对来说还是挺简单的,也没有遇上什么奇怪的异常,此处便不做什么太多说明
将实体做为消息进行写入/读取
稍微改造了一下使用对象做为消息进行写入/读取
<实体类>
public class MsgEntity
{
public string Content { get; set; }
public DateTimeOffset CreateTime { get; set; }
}
<添加相关>
var msgCount = redisHelper.ListLeftPush<MsgEntity>(key,new MsgEntity()
{
Content = msg,
CreateTime = DateTimeOffset.Now
});
Console.WriteLine($"添加成功,消息站已有{msgCount}条消息");
<读取的消息>
1.原始:
���� DRedisMSMQ.Try, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null RedisMSMQ.Try.Entity.MsgEntity <Content>k__BackingField<CreateTime>k__BackingFieldSystem.DateTimeOffset hello����System.DateTimeOffset DateTime
OffsetMinutes
'NCN���
... 一串乱码 + 一堆命名空间 看来写入需要调整
2.调整 :
<old>
private static byte[] Serialize(object obj)
{
try
{
if (obj == null)
return null;
var binaryFormatter = new BinaryFormatter();
using (var memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, obj);
var data = memoryStream.ToArray();
return data;
}
}
catch (SerializationException ex)
{
throw ex;
}
}
<new>
JsonConvert.SerializeObject(redisValue)
2.1 读取同样处理
<异常记录>
1.添加时异常:System.Runtime.Serialization.SerializationException:“Type 'RedisMSMQ.Try.Entity.MsgEntity' in Assembly 'RedisMSMQ.Try, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.”
说明:此对象在程序集中不可进行序列化
处理:给类添加特性[Serializable]
使用实体时,处理也是非常简单的,主要是注意一下转string的方式,
个人使用的是JsonConvert 进行序列化/反序列化(json比较简洁,工具类功能也比较齐全) 其次就是编码一致
模拟简单的发布/订阅
#region 准备参数
var connStr = "localhost:6379,password=";
var db = 2;
SiteRedisHelper redisHelper = new SiteRedisHelper(connStr, "monster", db);
var key = "entrepot";
var model = default(Produce);
#endregion
#region 审核线程,订阅申请消息,给予相应的处理
ThreadPool.QueueUserWorkItem((state =>
{
Thread.Sleep(1000);
while (IsDealValid)
{
var validMsg = redisHelper.ListRightPop<Produce>(key);
if (validMsg != null && !validMsg.IsNull())
{
Console.WriteLine($"正在审核产品:{JsonConvert.SerializeObject(validMsg)}");
}
}
}));
#endregion
#region 主线程_添加产品
Console.WriteLine("欢迎来到产品中心,请填写产品注册资料");
IsDealValid = true;
while ((model = Produce.RegisterProduce())!= null)
{
var validCount = redisHelper.ListLeftPush<Produce>(key, model);//将注册资料添加到消息队列中
Console.WriteLine($"产品注册申请正在处理中……,在您之前共有{validCount-1}个产品正在处理,请耐心等待审核结果");
}
#endregion
发布/订阅
#region 订阅消息
ThreadPool.QueueUserWorkItem((state =>
{
redisHelper.Subscribe(channel, ((redisChannel, value) =>
{
//Console.WriteLine($"订阅方收到一条消息:{JsonConvert.SerializeObject(value)}");
if (!value.IsNullOrEmpty)
{
Console.WriteLine($"订阅方收到一条消息:{value.ToString()}");
}
}));
Console.WriteLine("子线程已订阅消息");
}));
#endregion
#region 主线程发布消息
while ((model = Produce.RegisterProduce()) != null)
{
var receiveCount = redisHelper.Publish(channel, model);
Console.WriteLine($"此条消息已被{receiveCount}个人订阅");
}
#endregion
发布订阅 vs 消息队列
1. 消息队列中的消息不能重复读取,发布订阅中的消息由订阅方共享
2. 若发布时没有订阅方,后续加入的订阅方将不能收到此条消息。在消息队列中,若消息没有及时出列,消息将会继续保存在消息队列中
总结
总体来说,redis的操作都是比较简单的,因为官方已经有集成api供我们调用,所以操作起来还是没什么难度,只需要了解方法的应用就可以了,复杂一点的,应该就是业务流程的一些具体应用,应用场景的使用,效率的提升
相关类说明:
SiteRedisHelper
参考博文:http://www.cnblogs.com/liqingwen/archive/2017/04/06/6672452.html
《构造方法》
public SiteRedisHelper(string connStr, string defaultKey, int db = -1)
{
//连接字符串
ConnectionString = connStr;
//建立连接
_connMultiplexer = ConnectionMultiplexer.Connect(ConnectionString);
//默认前缀【无实用】
DefaultKey = defaultKey;
//注册相关事件 【未应用】
RegisterEvent();
//获取Database操作对象
_db = _connMultiplexer.GetDatabase(db);
}
author:monster
since:7/9/2018 11:25:14 AM
direction:redis mssq analysis
C# redis 的简单应用的更多相关文章
- redis 的简单命令
以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis > re ...
- Redis的简单了解以及主从复制
1.Redis的简单了解 Redis是一种高性能的分布式NoSql数据库,持久存储,高并发,数据类型丰富,通过现场申请内存空间,同时可以配置虚拟内存.五种数据类型:string(字符串,这种格式和me ...
- Redis主从复制简单介绍
由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分 ...
- Redis 的简单运算
Redis 的简单运算 命令 说明 备注 incr key 在原字段上加 1 只能对整数操作 incrby key increment 在原字段上加上整数 (increment) 只能对整数操作 de ...
- python redis 实现简单的消息订阅
python + redis 实现简单的消息订阅 订阅端 import redis from functools import wraps class Subscribe: def __init__( ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- Redis——分布式简单使用
Redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis安装:参考博客http://www ...
- Redis的简单介绍及在Windows下环境搭建
简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...
- 基于redis 内存数据库简单使用
在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...
- redis的简单使用
一.简单使用Jedis 需要Jedis就从Maven获取吧! Maven Pom.xml <dependency> <groupId>redis.clients</gro ...
随机推荐
- Consul 简介、安装、常用命令的使用
1 Consul简介 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式" ...
- mysql彻底删除
yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysq ...
- Java设计模式之——抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- <转>linux操作系统编程——共享内存读写(采用信号量进行同步互斥)
http://blog.csdn.net/yanghaoran321/article/details/7872722 程序要求: 创建一个写端和一个读端,写端写入数据后读端才开始读,读端读完数据后,写 ...
- 搭建Git Server - 个人开发简单搭建
###################### 教程一 ####################### 1. 创建git用户和用户组 #新建一个git用户组 sudo groupadd git #新建一 ...
- 二维码生成插件qrious及网站扫码登录的一些理解
什么是二维码 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...
- Spark之 SparkSql整合hive
整合: 1,需要将hive-site.xml文件拷贝到Spark的conf目录下,这样就可以通过这个配置文件找到Hive的元数据以及数据存放位置. 2,如果Hive的元数据存放在Mysql中,我们还需 ...
- java实现最通俗易懂的01背包问题
这几天一直在想背包问题,昨天还有个学长专门讲了,但是还是不是很理解,今天我终于想通了背包问题,其实只要理解了这个思路,不管用什么语言,肯定是能编出来的.下面我就来介绍一下背包问题. 1.题目描述: 有 ...
- UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!
UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...
- IDEA05 mybatis插件之MyBatisCodeHelper-Pro
前提准备: >IDEA专业版本 1 安装MyBatisCodeHelper-Pro IDEA提供了插件安装功能,可以根据开发需要安装适合的插件 >help -> find actio ...