[MVC学习笔记]6. 接纳Memcache+Cookie解决分布式系统共享登录状态

3月14日,亚马逊(Amazon)揭橥推出移动设备信息推送服务“Amazon SNS Mobile
Push”。亚马逊(Amazon)曾在二零一零年推出新闻推送服务,但仅局限于通过SMS或邮件公告收件人。现在该事情曾经支撑iOS、Android、Kindle
Fire等活动平台。

    (2)进入cmd窗口,运行Memcached.exe -d
install安装服务,安装后打开服务窗口查看服务是或不是安装成功。

  图片 1

 

此外,个推还提供增量更新服务。应用接入个推SDK后,当开发者在个推后台提交新本羊时,个推自动向用户推送一条消息,通告用户下载更新。而且用户下载新本马时,只下载差量部分,无需下载整个安装包。

3.
改变登录校验控制器FilterController的OnActionExecuting方法,使其校验格局改为从Memcache服务器中读取库克ie中值为键的目的:

其余,OPPOPush可按照地理地点触发推送信息。开发者在地形图上划定区域,音讯会自动推送到进入该区域的用户手机上。

      大家利用MemCache+Cookie方案来缓解分布式系统共享登录状态的题材。

华为Push

下边我们做方案的现实性完成

亚马逊推送服务

    (3)直接在劳务管理中启动服务,或者使用cmd命令 net start “Memcache
Server”

云推送全面扶助iOS、Android平台。百度云推送服务支撑推送三种类型的音讯:公告、透传音信及富媒体,扶助单条最大4K的音讯推送,其基础的新闻推送服务永久免费。而且它援救向具有用户或依照标签分类向特定用户群体推送信息。开发者可自定义内容、后续行为、样式模板等。

    (2)C#中操作Memcache的代码示例

  图片 2

图片 3

个推

图片 4

  图片 5

1.
率先在Common层中引入Memcached.ClientLibrary.dll,并封装Memcache的扶植类,MemcacheHelper

Urban Airship底层用的是APNs,restful style
api/JSON封装数据,对开发者相比友好。开发者每月有100万条的免费额度,不过在100万条的额度用完后,你会发现,相对于其竞争对手Parse来说,Urban
Airship的价钱稍贵。Parse为0.07加元/千条,而Urban Airship是0.001欧元/条。

     先简单介绍一下Memcache的用法

Urban
Airship

2.
变更用户登录方法UserLogin,用户登录成功后生成GUID,将此GUID存入Cookie并以GUID为键将登录用户音讯系列化存入Memcache服务器。

Appoxee的一各个工具得以利用Push新闻,唤醒用户、交叉推广别的应用。Appoxee立异的推送文告管理功用可扶助开发者自动调度并依据特殊参数推送文告,如推送富文本新闻,或按照用户的时区推送通知等。

  1. 下载安装Memcache(Windows平台)

个推,中国最成功的SaaS服务商之一,为移动开发者提供推送服务,可以援助开发者在采用推送功用上节省开发开支,并确保用户推送品质、节省用户流量,而且帮衬富文本。个推近期一度与博客园、百度、Taobao等互连网巨头合营,飞速饭馆管家、唱呢、啪啪、应用汇等应用也援引了个推的推送服务。

     
Memcache服务器本身就是一个Socket服务端,内部数据采用键值对的款型储存在服务器的内存中,本质就是一个巨型的哈希表。数据的去除采纳惰性删除机制。尽管Memcache并不曾提供集群效益,不过透过客户端的驱动程序很不难就可以完结Memcache的集群配置。

国外针对大气应用做了一个总括,发现平均一个利用一般5个月的用户留存率只有15%,但做了Push后留存率达到30%,进步一倍。纵然Push对升官利用的用户黏性有益,但必要投入一定的开发费用,所以广大开发者把目光投向第三方推送服务。以下推荐多少个国内外比较出名的第三方推送服务商,帮您“Push
your notification out, pull your users back”。

String[] serverlist = { "192.168.1.100:11211",
"192.168.1.101:11211"  };
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.GetInstance("test");
pool.SetServers(serverlist);
pool.Initialize();
mc = new MemcacheClient();
mc.PoolName = "test";
mc.EnableCompression = false;
pool.Shutdown();//关闭连接池

 

using Memcached.ClientLibrary;
using System;

namespace PMS.Common
{
   public class MemcacheHelper
    {
       private static readonly MemcachedClient Mc = null;

       static MemcacheHelper()
       {
           //最好放在配置文件中
           string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" };

           //初始化池
           var pool = SockIOPool.GetInstance();
           pool.SetServers(serverlist);

           pool.InitConnections = 3;
           pool.MinConnections = 3;
           pool.MaxConnections = 5;

           pool.SocketConnectTimeout = 1000;
           pool.SocketTimeout = 3000;

           pool.MaintenanceSleep = 30;
           pool.Failover = true;

           pool.Nagle = false;
           pool.Initialize();

           // 获得客户端实例
           Mc = new MemcachedClient {EnableCompression = false};
       }
       /// <summary>
       /// 存储数据
       /// </summary>
       /// <param name="key"></param>
       /// <param name="value"></param>
       /// <returns></returns>
       public static bool Set(string key,object value)
       {
          return Mc.Set(key, value);
       }
       public static bool Set(string key, object value,DateTime time)
       {
           return Mc.Set(key, value,time);
       }
       /// <summary>
       /// 获取数据
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       public static object Get(string key)
       {
           return Mc.Get(key);
       }
       /// <summary>
       /// 删除
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       public static bool Delete(string key)
       {
           return Mc.KeyExists(key) && Mc.Delete(key);
       }
    }
}

  图片 6

            使用stats指令查看当前Memcache服务器状态

金立Push除了扶助公告栏音信、富媒体音信,还辅助透传信息,以透传格局将自定义的情节发送给应用。开发者的利用自主解析自定义的始末,并触及相关动作。利用此意义让开发者可完结IP呼叫、好友诚邀等功用,完全自由发挥。

     
为了缓解单机处理的瓶颈,增强软件的可用性,大家须要将软件布署在多台服务器上启用多少个二级子域名以频道化的法子,依据工作职能将网站分布布局在单独的服务器上,或通过负载均衡技术(如:DNS轮询、Radware、F5、LVS等)让三个频段共享一组服务器。当大家将网站先后分部到多台服务器上后,由于Session受完毕原理的局限,不可能跨服务器同步立异Session,使得登录状态难以通过Session共享。

极光推送接济iOS、Android四个阳台,其SDK的放到相比简单,近年来支撑Portal上推送,也接济API调用。开发者可以推送自定义的新闻内容。JPush
SDK把内容完全转给开发者应用程序,由开发者应用程序去处理自定义消息。同时,极光推送能以图表的花样直观展现推送效果,比如推送到达数、用户点击等。方今,去何方网、保卫萝卜、虾米网、中国移动等店铺都利用了极光推送的劳动。

 

  图片 7

     

百度开放云

    (1)在程序中添加
Memcached.ClientLibrary.dll
的引用

开发者每个月使用亚马逊的推送服务推送的前100万次音信是免费的,之后以“百万次”为单位开展收费,依据公告格局不一致,收费为0.06至2.00英镑间不等。

     

  图片 8

    (4)使用Telnet连接受Memcache控制台,验证服务是还是不是健康 telnet
127.0.0.1 11211

2月26日,百度公布将面向开发者提供的劳务专业定名为“百度绽放云”,向开发者提供开发、测试、计算工具、云能力技术开发接口等一种类服务,其中也囊括云推送。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    //if (Session["user"] == null)
    if (Request.Cookies["sessionId"] != null)
    {
        var sessionId = Request.Cookies["sessionId"].Value;
        //根据该值查Memcache.
        var obj = MemcacheHelper.Get(sessionId);
        if (obj == null)
        {
            filterContext.Result = Redirect("/Login/Index");
            return;
        }
        var user = SerializeHelper.DeserializeToObject<User>(obj.ToString());
        LoginUser = user;
        //模拟出滑动过期时间.
        MemcacheHelper.Set(sessionId, obj, DateTime.Now.AddMinutes(20)); 
    }
    else
        filterContext.Result = Redirect("/Login/Index");
}

现年十一月,聚能推上线单机公司版,将推送技术包装独立给开发者。聚能推面向iOS、Android平台,支持群推、在线推、离线推等各个推送形式。同时,开发者在拔取聚能推的推送服务时,能够对每一个使用自定义多达128个标签。依据标签开发者可以进一步精准地将信息推送到用户的手机中。集团级用户的所有数据均存储在客户自己的服务器,免除了数额存储在第三方服务商而产生的多寡外泄难题。

    (1)将先后解压到磁盘任意地方

Appoxee采取阶段性定价,用户量在25万之内普通客户可防止费使用,Silver级别客户在可以分享数据解析、标签API等愈来愈多职能的同时,须求每月缴纳500加元。若是开发者必要更精细的推送服务、后台管理与数量解析服务,还可议价。

public ActionResult UserLogin()
{
    #region 验证码校验
    var validateCode = Session["validateCode"] != null ? Session["validateCode"].ToString() : string.Empty;
    if (string.IsNullOrEmpty(validateCode))
        return Content("no:验证码错误!!");
    Session["validateCode"] = null;
    var txtCode = Request["ValidateCode"];
    if (!validateCode.Equals(txtCode, StringComparison.InvariantCultureIgnoreCase))
        return Content("no:验证码错误!!");
    #endregion

    var userName = Request["UserName"];
    var userPwd = Request["PassWord"];
    //查询用户是否存在
    var user = UserService.LoadEntities(u => u.UserName == userName && u.PassWord == userPwd).FirstOrDefault();
    if (user == null) return Content("no:登录失败");

    //产生一个GUID值作为Memache的键.
    var sessionId = Guid.NewGuid().ToString();
    //将登录用户信息存储到Memcache中。
    MemcacheHelper.Set(sessionId, SerializeHelper.SerializeToString(user), DateTime.Now.AddMinutes(20));
    //将Memcache的key以Cookie的形式返回给浏览器。
    Response.Cookies["sessionId"].Value = sessionId;
    return Content("ok:登录成功");
}

  图片 9

  1. 次第中的用法

Appoxee

  图片 10

极光推送

聚能推

发表评论

电子邮件地址不会被公开。 必填项已用*标注