Asp .Net Mvc开发(1)--分布式缓存(1)

Asp .Net 中缓存的种类

  1. 整页缓存
    缓存整个页面,并且设置刷新间隔时间(以s为单位)
    实现方式:通过OutputCache特性

  2. 部分页面缓存
    即局部页面缓存,指通过设定影响页面的参 数,此时的缓存存储页面的多个版本,一般情况需要按照参数值为这些页 面版本设置索引
    实现方式:Ajax局部刷新
    Ajax请求返回的结果分3种
    (1)json串 (2)文本 (3)分部视图

  3. 应用程序缓存
    所谓运用程序缓存,也叫数据缓存,指将需要大量服务器资源的对象 存储在内存中,在ASP.NET中,由Cache类来实现(Cache类的每个实例对 应具体的每个运用程序,其生存期依赖于运用程序的生存期,当然,如果 系统重启或者断电,则另当别论。)
    实现方式:使用Cache对象(命名空间System.Web.Caching)
    Cache对象的使用方式类似于Session

分布式缓存

1.为啥要使用分布式缓存
高并发环境下,例如淘宝双11秒杀,几分钟内上亿的用户涌入淘宝,这个时候如果访问不加拦截,让大量的读写请求涌向数据库,由于磁盘的处理速度与内存显然不在一个量级,服务器马上就要宕机。从减轻数据库的压力和提高系统响应速度两个角度来考虑,都会在数据库之前加一层缓存,访问压力越大的,在缓存之前就开始CDN拦截图片等访问请求。

并且由于最早的单台机器的内存资源以及承载能力有限,如果大量使用本地缓存,也会使相同的数据被不同的节点存储多份,对内存资源造成较大的浪费,因此,才催生出了分布式缓存。
2.应用场景

  • 页面缓存.用来缓存Web 页面的内容片段,包括HTML、CSS 和图片等;
  • 应用对象缓存.缓存系统作为ORM 框架的二级缓存对外提供服务,目的是减轻数据库的负载压力,加速应用访问;
  • 解决分布式Web部署的session同步问题,状态缓存.缓存包括Session 会话状态及应用横向扩展时的状态数据等,这类数据一般是难以恢复的,对可用性要求较高,多应用于高可用集群。
  • 并行处理.通常涉及大量中间计算结果需要共享;
  • 云计算领域提供分布式缓存服务。

Memcache

Memcache是一种高性能、分布式的内存对象缓存系统。

原理:
内存处理 内存分区解决内存碎片问题
memcache实现会对可用内存进行划分分区,每个区内分成若干块,同一个 区内块的大小固定。当进行数据存储,就会自动寻找适合的区存进块内。 最大的块是1M。比如第一个区内只存0.5M的块,第二个块只存0.6M的数 据,现在过来一个0.55M的数据就会存到第二个区内,占用0.6M的空间, 虽然块内有空间浪费,但是块与块之间没有缝隙。 惰性删除 memcache并没有提供数据监控机制,而是查询到某个数据,如果过期才会 删除。 如果内存满了,就会策略LRU闲置>过期>最少访问来清空删除数据 客户端实现分布式: 给memcache配置多个服务器ip,当需要查询时会寻找哪台服务器或者添加
一个数据时会保存到哪一个服务器上呢?memcache对key值进行哈希计算 然后对配置的服务器总数进行取余,余数是几就向第几台服务器进行操 作。这就导致了一个问题:当服务器数量发生变化时会导致部分数据丢失 (查询指向服务器错误)。想要这种影响降低到最低,可以使用一致性哈 希算法。 数据通信走的是socket。

Memcache的安装

1.下载一个安装包(http://pan.baidu.com/s/1gdKbp8R)
2.把下载的安装包解压,把它放到一个目录中,如D:\memcached
3. 用管理员身份打开cmd,进入memcached解压后存放的目录,运行命令:
memcached.exe -d install(安装)
4.测试是否安装成功
打开cmd,进入memcached解压后存放的目录,运行命令:
memcached -h
5. 启动memcached:
打开cmd,进入memcached解压后存放的目录,运行命令:
memcached.exe -d start
6. 连接Memcached
打开cmd,运行命令:
telnet 127.0.0.1 11211(本机)
即可连接Memcached。

异常处理 :可能会出现“telnet’不是内部或外部命令”的错误,这是因为系统 中默认没有安装telnet的缘故,可在“控制面板”->“程序”->“程序和 功能”->“打开或关闭Windows功能”中打开“Telnet客户端”。

MemcacheHelper

  public class MemcacheHelper
    {
        private static readonly MemcachedClient mc = null;
        static MemcacheHelper()
        {           //最好放在配置文件中           
            string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" };
                    //初始化池           
            SockIOPool 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();
            mc.EnableCompression = false;
        } 
        /// <summary>
        /// 存储数据
        /// </summary>
        /// <returns></returns>
        public static bool Add(string key,object value)
        {
            return mc.Set(key, value);
        }
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object Get(string key)
        {
            return mc.Get(key);
        }
        public static bool Delete(string key)
        {
            return mc.Delete(key);
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool Edit(string key,object value)
        {
            return mc.Replace(key, value);
        }
        }

测试用例

 static void Main(string[] args)
        {
            Student stu1 = new Student() { id = 1, Name = "张三" };
            bool result = MemcacheHelper.Add("stu1",stu1);
            Console.WriteLine("添加结果"+result);
            Console.WriteLine("获取学生1的信息");
            Student student1 = MemcacheHelper.Get("stu1") as Student;
            Console.WriteLine("他叫:"+student1.Name);
            
            
            Console.ReadLine();
        }

•在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
•Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有 限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存, 可以分多个端口开启多个Memcached进程 。

•最大30天的数据过期时间,设置为永久的也会在这个时间过期(绝对时 间)
•单个item最大数据是1MB,超过1MB数据不予存储 存储对象时,对象必须标记为可序列化 Memcached.ClientLibrary.dll和log4net.dll有版本对应关系。 目录中不用出现中文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值