Signalr和Redis学习

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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值