Signalr:主要是用来让服务端和客户端(web)实时通信的一种技术,而不需要客户端循环请求服务端来获取消息。
Redis:是一种key,value的存储系统。支持多种存储类型,包括string,hash,list,set,zset(有序集合),并且可以实现持久化(redis可是保存在磁盘),访问速度快(内存中操作),支持事务试操作。
Signalr如何使用
1.添加Nuget程序包
2.添加一个SignalR集线器类
3.添加OWIN Startup类
Redis如何使用(一般会配合CacheManager使用)
1.安装Redis,见
http://www.runoob.com/redis/redis-tutorial.html
有具体下载地址和教程
2.添加Nuget程序包
2.Startup类中添加配置
3.配合signalr使用时会将消息存到redis,然后再从redis读取
具体代码如下:
Startup类
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
//第三个参数是密码,第四个参数是redis的key,最后是只redis的库号
GlobalHost.DependencyResolver.UseRedis(
new RedisScaleoutConfiguration("127.0.0.1", 6379, string.Empty, "SignalrAndRedis") { Database = 15 });
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration { EnableJSONP = true };
map.RunSignalR(hubConfiguration);
});
}
}
集线器ServerHub类
public class ServerHub : Hub
{
private static ICacheManager<object> _cacheManager;
//sendMsg的名字是用来让前端js调用的名字
public void sendMsg(string message)
{
if (_cacheManager == null)
{
_cacheManager = CacheFactory.Build<object>(settings =>
{
settings
//cachemanager的名字
.WithSystemRuntimeCacheHandle("InProcess")
//设置缓存过期时间
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(10))
//缓存对应的redis配置
.And.WithRedisConfiguration("redis", config =>
{
config.WithAllowAdmin()
.WithEndpoint("127.0.0.1", 6379)
.WithDatabase(3);
})
//
.WithRedisCacheHandle("redis", true);
});
}
//添加key
_cacheManager.Put("apple", "苹果", "firut");
_cacheManager.Put("pear", "梨", "firut");
_cacheManager.Put("balana", "香蕉", "firut");
_cacheManager.Put("cat", "猫", "animal");
_cacheManager.Put("dog", "狗", "animal");
_cacheManager.Put("pig", "猪", "animal");
_cacheManager.Put("richard", "董志海");
var getKeyValue = _cacheManager.Get("apple");//取值结果为null,需配合region来取值
var getRegion = _cacheManager.Get("apple", "firut");
var getKeyValue1 = _cacheManager.Get("richard");
//定义的类必须支持可序列话
var model = new Name()
{
EngName = "neil",
ChnName = "邱尘"
};
_cacheManager.Put("Neil", model);
var getKeyValue2 = _cacheManager.Get<Name>("Neil");
#region 不配合CacheManager使用
//var config = ConfigurationOptions.Parse("127.0.0.1:6379");
//var client = ConnectionMultiplexer.Connect(config);
//client.GetDatabase(0).ListLeftPush("first", message);
//var msg = client.GetDatabase(0).ListRightPop("first");
client.GetDatabase(1).ListLeftPush("SignalrAndRedis", "FirstDemo");
//client.GetDatabase(1).StringSet("SignalrAndRedis1", "FirstDemo1");
client.GetDatabase(2).StringSet("SignalrAndRedis", "FirstDemo");
//var msg2 = client.GetDatabase(0).HashGetAll("myhash");
//var dd = msg2.ToDictionary()["field1"];
#endregion
//sendMessage是调用前端js,function的方法名,前端也设置了两个参数
Clients.All.sendMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
}
}
[Serializable]
public class Name
{
public string EngName { get; set; }
public string ChnName { get; set; }
}
SignalR使用的Html界面如下
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SignalR实时通讯</title>
<meta charset="utf-8" />
<script src="Scripts/jquery-1.6.4.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.3.min.js"></script>
<script src="signalr/hubs"></script>
<script>
$(function () {
//引用自动生成的集线器代理
var chat = $.connection.serverHub;
//定义服务器调用的客户端sendMessage来显示新消息
chat.client.sendMessage = function (name, message)
{
//向页面添加消息
$("#messageBox").append('<li><strong style="color:green">'+htmlEncode(name)+'</strong>:'+htmlEncode(message)+'</li>');
}
//设置焦点到输入框
$('#message').focus();
//开始连接服务器
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
//调用服务器端集线器的Send方法
chat.server.sendMsg($('#message').val());
//清空输入框信息并获取焦点
$("#message").val('').focus();
})
})
});
//为显示的消息进行html编码
function htmlEncode(value)
{
var encodeValue = $('<div/>').text(value).html();
return encodeValue;
}
</script>
</head>
<body>
<input type="text" id="message" />
<input type="button" id="sendmessage" value="Send" />
<input type="hidden" id="displayname" />
<ul id="messageBox"></ul>
</body>
</html>