精华内容
下载资源
问答
  • Django缓存系统

    千次阅读 2017-11-22 19:35:49
    为什么要做django缓存? 在动态网站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面。...Django提供了自己的缓存系统,可以自己保存动态网页

    为什么要做django缓存?

    在动态网站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面。

    这会消耗大量的资源,当访问用户量非常大时,就要考虑这个问题了。

    缓存就是为了防止重复计算,把那些消耗了大量资源的结果保存起来,下次访问时就不用再次计算。

    Django缓存系统:

    Django提供了自己的缓存系统,可以自己保存动态网页,为了避免在需要的时候重新计算。

    Django缓存架构可以缓存:特定视图的输出,模板的一部分,整个网站。

    在Django项目中使用缓存:

    在数据库中设置缓存:

    配置项目的settings.py文件,添加代码:

    CACHES = {
       'default': {
          'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
          'LOCATION': 'my_table_name',
       }
    } 
    创建缓存表

    python manage.py createcachetable
    在文件系统中设置缓存:

    配置项目的settings.py文件,添加代码:

    CACHES = {
       'default': {
          'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
          'LOCATION': '/var/tmp/django_cache',
       }
    }
    在本地内存中设置缓存:

    配置项目的settings.py文件,添加代码:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
            'LOCATION': 'unique-snowflake'
        }
    }
    缓存整个网站:

    缓存整个网站可以通过编辑项目settings.py的MIDDLEWARE_CLASSES选项来完成,注意顺序,先更新,再获取。

    MIDDLEWARE_CLASSES = (
       'django.middleware.cache.UpdateCacheMiddleware',
       'django.middleware.common.CommonMiddleware',
       'django.middleware.cache.FetchFromCacheMiddleware',
    )
    还有一些通用设置:
    CACHE_MIDDLEWARE_ALIAS = 'default'    #用来存储的缓存别名
    CACHE_MIDDLEWARE_SECONDS = 0  #所有页面默认缓存时间,默认600
    CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com'  #关键的前缀,当多个站点使用同一个配置的时候,
    这个可以设置可以避免发生冲突,一般设置为网站域名
    CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #那么只有匿名的请求会被缓存,这是一个禁用缓存非匿
    名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件


    展开全文
  • 基于redis的缓存系统设计

    千次阅读 2019-02-13 12:17:10
    基于redis的缓存系统设计1 缓存的目的2 缓存系统设计写入 key读取 keyC语言参考 1 缓存的目的 使用缓存系统的目的是为高并发的访问提供高质量的、实时的反馈。一般的缓存系统,都是按照 key-value 去查询缓存层...

    1. 缓存的目的

    使用缓存系统的目的是为高并发的访问提供高质量的、实时的反馈。一般的缓存系统,都是按照 key-value 去查询缓存层(如 redis),如果 key 不存在,就应该去后端持久层DB(如 HBase,MySQL)中查找 。这个时候,如果请求的并发量很大,就会对后端的DB系统造成很大的压力。这就叫做缓存穿透。

    造成的原因

    1.业务自身代码或数据出现问题
    2.一些恶意攻击、爬虫造成大量空的命中,此时会对数据库造成很大压力
    3.缓存崩溃

    解决方法

    如果一个查询返回的数据为空,不管是数据不存在还是系统故障,我们仍然把这个结果进行缓存,但是设置一个较短的过期时间。

    2. 缓存系统设计

    这里假定使用 redis 作为缓存层,hbase 作为 DB 层,kafka 作为队列层。每层的软件正好符合其特性。以下分写入和读取2个客户端的操作加以说明。由于业务的不同,对数据持久化的强度要求也不同。比如充值,购买等行为,要求强持久性(2.2),对速度和性能的要求就相应降低。而对话,聊天,游戏互动等行为,要求强实时性(2.1),对速度要求极高,相应地对持久化可靠性要求就可以低一些。

    (更安全的设计是保证数据的强一致性,这是通过关系数据库的分布式事务来实现的:即在某个帐号的一笔事务期间,同时只能出现一个操作。不在本讨论范围。)

    2.1 强实时性系统的设计

    强实时性侧重于数据读写的高并发和高速,允许少量的脏写和脏读。比如操作某个用户的游戏道具。分为写入和读取2个场景讨论。

    写入 key

    • 服务进程W写入key-value 到 redis,同时将 key 记录到 kafka 的某个 topic(A1)。

    另外的进程P订阅 kafka 的 topic(A1) 消息,得到 key,然后从 redis 里面取出 key-value,写入 hbase。可以设置一个小的时间段,合并相同的 key,批处理写入 hbase。

    由于hbase中的k-v值与redis的k-v值存在不一致的可能,此时成为脏写,即允许持久层中的数据依极小的概率与缓存层不一致。

    读取 key

    • 服务进程读 redis 某个 key-value,如果存在 key,直接返回其 value 给调用者。
    • 服务进程读 redis 某个 key-value,如果不存在 key,将 key 记录到 kafka 的某个 topic(A2)。可以返回null给调用者或者直接到hbase中读取(缓存穿透,一般当key不存在时,需要穿透一次)。

    另外的进程Q订阅 kafka 的 topic(A2) 消息,得到 key,然后到 hbase 里取 key-value,将其写入 redis。 (如果 hbase中不存在这样的key,也要写入redis,并设置一个较短的过期时间,如 5 分钟。)

    强实时性的设计存在的问题

    如果同时写入和读取某个 key,由于进程Q也包含了写入redis操作,会造成写入不一致的情况(多个进程同时写同一个 key 到 redis 中)。需要对W和Q 的 key 写入操作设置事务隔离,而 redis 支持基于 key 的事务操作(watch->multi->…->exec/discard)。

    2.2 强持久性系统的设计

    强持久性侧重于数据落地稳定可靠,允许少量的误读。比如操作某个用户的积分。依旧分为写入和读取2个场景讨论。

    写入 key

    • 服务进程更改key-value 到后端hbase存储中。同时将 key 记录到 kafka 的某个 topic(B1)。

    另外的进程X订阅 kafka 的 topic(B1) 消息,得到 key,然后从 hbase 里面取出 key-value,写入 redis。

    读取 key

    • 服务进程读 redis 某个 key-value,如果存在 key,直接返回其 value 给调用者。此时读到的 value 也许和 hbase中存储的不一致,称为脏读
    • 服务进程读 redis 某个 key-value,如果不存在 key,将 key 记录到 kafka 的某个 topic(B2)。可以返回null给调用者或者直接到hbase中读取(缓存穿透,一般当key不存在时,需要穿透一次)。

    另外的进程Y订阅 kafka 的 topic(B2) 消息,得到 key,然后从 hbase 里面取出 key-value,写入 redis。

    强持久性设计存在的问题
    强持久性要求永久保存的数据一定是准确无误的。尽管可以读取错误,但是数据本身一定是正确的。写入的效率依赖后端的性能。

    3. C语言参考

    下面列出了用 C/C++ 语言调用kafka、redis、hbase的开源库。

    librdkafka
    hiredis
    libhbase2

    展开全文
  • 在一个高并发的分布式系统中,缓存系统是必不可少的一部分,大多数情况下,我们需要设计一个多级缓存系统到生产中使用,那么如何设计呢?这也是笔者在前一段时间的面试中,被问到的一个问题,虽然当时这道题过了,...

    在一个高并发的分布式系统中,缓存系统是必不可少的一部分,大多数情况下,我们需要设计一个多级缓存系统到生产中使用,那么如何设计呢?这也是笔者在前一段时间的面试中,被问到的一个问题,虽然当时这道题过了,但是面试结束之后对自己的回答不是很满意,所以,再反复思考之后决定分享下自己的设计思路。欢迎留言批评指正。

    首先我们需要明白,什么是一个多级缓存系统,它有什么用。所谓多级缓存系统,就是指在一个系统 的不同的架构层级进行数据缓存,以提升访问效率。

    我们都知道,一个缓存系统,它面临着许多问题,比如缓存击穿,缓存穿透,缓存雪崩,缓存热点等等问题,那么,对于一个多级缓存系统,它有什么问题呢?

    1. 缓存热点:多级缓存系统大多应用在高并发场景下,所以我们需要解决热点Key问题,如何探测热点key?
    2. 数据一致性:各层缓存之间的数据一致性问题,如应用层缓存和分布式缓存之前的数据一致性问题。
    3. 缓存过期:缓存数据可以分为两大类,过期缓存和不过期缓存?如何设计,如何设计过期缓存?

    在这之前,我们先看看一个简单的多级缓存系统的架构图:
    在这里插入图片描述
    整个多级缓存系统被分为三层,应用层nginx缓存,分布式redis缓存集群,tomcat堆内缓存。整个架构流程如下:

    1. 当接收到一个请求时,首先会分发到nginx集群中,这里可以采用nginx的负载均衡算法分发给某一台机器,使用轮询可以降低负载,或者采用一致性hash算法来提升缓存命中率。
    2. 当nginx层没有缓存数据时,会继续向下请求,在分布式缓存集群中查找数据,如果缓存命中,直接返回(并且写入nginx应用缓存中),如果未命中,则回源到tomcat集群中查询堆内缓存。
    3. 在分布式缓存中查询不到数据,将会去tomcat集群中查询堆内缓存,查询成功直接返回(并写入分redis主集群中),查询失败请求数据库;堆内缓存。
    4. 如果以上缓存中都没有命中,则直接请求数据库,返回结果,同步数据到分布式缓存中。

    在简单了解了多级缓存的基本架构之后,我们就该思考如何解决上面提到的一系列问题。

    缓存热点

    缓存热点,是一个很常见的问题,比如“某某明星宣布结婚”等等,都可能产生大量请求访问的问题,一个最麻烦也是最容易让人忽视的事情就是如何探测到热点key,在缓存系统中,除了一些常用的热点key外,在某些特殊场合下也会出现大量的热点key,我们该如何发现呢?有以下策略:

    1. 数据调研。可以分析历史数据以及针对不同的场合去预测出热点key,这种方式虽然不能百分百使得缓存命中,但是却是一种最简单和节省成本的方案。
    2. 实时计算。可以使用现有的实时计算框架,比如storm、spark streaming、flink等框架统计一个时间段内的请求量,从而判断热点key。或者也可以自己实现定时任务去统计请求量。

    这里我们着重讨论一下第二种解决方案,对于热点key问题,当缓存系统中没有发现缓存时,需要去数据库中读取数据,当大量请求来的时候,一个请求获取锁去请求数据库,其他阻塞,接着全部去访问缓存,这样可能因为一台服务器撑不住从而宕机,比如正常一台服务器并发量为5w左右,产生热点key的时候达到了10w甚至20w,这样服务器肯定会崩。所以我们在发现热点key之后还需要做到如何自动负载均衡。

    结合以上问题我们重新设计架构,如下图所示:
    在这里插入图片描述
    我们将整个应用架构分为应用层,分布式缓存、系统层以及数据层。

    在应用层,我们采用nginx集群,并且对接实时计算链路,通过flume监控nginx日志,将数据传输到kafka集群中,然后flink集群消费数据进行统计,如果统计 结果为热点key,则将数据写入zookeeper的节点中,而应用系统通过监控znode节点,读取热点key数据,去数据库中加载数据到缓存中并且做到负载均衡。

    实际上,对于应用系统中的每一台服务器,还需要一层防护机制,限流熔断,这样做的目的是为了防止单台机器请求量过高,使得服务器负载过高,不至于服务器宕机或者大量请求访问数据库。简单思路就是为每一台服务器设计一个阀值,当请求量大于该值就直接返回用户空白页面或者提示用户几秒后刷新重新访问。

    数据一致性

    数据一致性问题主要体现在缓存更新的时候,如何更新缓存,保证数据库与缓存以及各层缓存层之间的一致性。

    对于缓存更新问题,先写缓存还是先写数据库,这里省略若干字。之前的文章介绍过,有兴趣的读者可以翻阅。

    在单层缓存系统中,我们可以先删除缓存然后更新数据库的方案来解决其数据一致性问题,那么对于多级缓存呢?如果使用这种方案,我们需要考虑,如果先删除缓存,那么需要逐层去做删除操作,那么这一系列操作对系统带来的耗时也是和可观的。

    如果我们使用分布式事务机制,就需要考虑该不该将写缓存放入事务当中,因为我们更新分布式缓存,需要走网络通信,大量的请求将导致网路抖动甚至阻塞,增加了系统的延迟,导致系统短时间内不可用。如果我们不将写缓存这一操作放入事务当中,那么可能引起短时间内数据不一致。这也就是分布式系统的CAP理论,我们不能同时达到高可用和一致性。那么该如何抉择呢?

    这里我们选择保证系统的可用性,就一个秒杀系统来讲,短暂的不一致性问题对用户的体验影响并不大(当然,这里不涉及支付系统),而可用性对用户来说却很重要,一个活动可能在很短的时间内结束,而用户需要在这段时间内抢到自己心仪的商品,所以可用性更重要一些(这里需要根据具体场景进行权衡)。

    在保证了系统的可用性的基础上,我们该如何实现呢?如果实时性要求不是很高,我们可以采用全量+增量同步的方式进行。首先,我们可以按照预计的热点key对系统进行缓存预热,全量同步数据到缓存系统。接着,在需要更新缓存的时候,我们可以采用增量同步的方式更新缓存。比如我们可以使用阿里Canal框架同步binlog的方式进行数据的同步。

    缓存过期

    缓存系统中的所有数据,根据数据的使用频率以及场景,我们可以分为过期key以及不过期key,那么对齐过期缓存我们该如何淘汰呢?下面有常用的几种方案:

    1. FIFO:使用FIFO算法来淘汰过期缓存。
    2. LFU:使用LFU算法来淘汰过期缓存。
    3. LRU:使用LRU算法来淘汰过期缓存。

    以上几种方案是在缓存达到最大缓存大小的时候的淘汰策略,如果没有达到最大缓存大小,我们有下面几种方式:

    1. 定时删除策略:设置一个定时任务,在规定时间内检查并且删除过期key。
    2. 定期删除策略:这种策略需要设置删除的周期以及时长,如何设置,需要根据具体场合来计算。
    3. 惰性删除策略:在使用时检查是否过期,如果过期直接去更新缓存,否则直接返回。

    本篇文章就介绍这里,以上是自己的一些技术总结,欢迎留言批评指正。

    展开全文
  • memcached搭建缓存系统

    千次阅读 2014-09-11 16:34:12
    Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。 二、适用场合 1.分布式应用。由于memcached本身基于分布式的系统,所以尤其适合...

    memcached搭建缓存系统

    一、概念

    Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。

    二、适用场合

    1.分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。

    2.数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。

    3.服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。

    三、不适用场合

    那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源

    四、Memcached的工作机制

      Memcached通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,虽然和数据库是独立的,但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。

    五、windows下的安装

    这里介绍windows环境的安装。

    1.下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached (下载地址:http://download.csdn.net/detail/huwei2003/9458650 )

    2.在cmd下输入 'c:\memcached\memcached.exe -d install' 安装

    3.再输入: 'c:\memcached\memcached.exe -d start' 启动。

    以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

    以上可以通过一个批处理文件来一次性完成,如下

    echo start install memcached
    cd D:\dbtech\memcached\memcached-1.2.6-win32-bin\
    D:\dbtech\memcached\memcached-1.2.6-win32-bin\memcached.exe -d install
    echo start memcached service
    D:\dbtech\memcached\memcached-1.2.6-win32-bin\memcached.exe -d start
    echo end
    pause

    把这些放在一个txt里,把后缀改成bat,再运行(win7下要以管理员身份运行),即可完成安装和启动,打开服务,可看到"memcached Server"该服务已启动

    在命令行 telnet ip 11211 进入后输入 stats 可以看到信息 如下:


    stats
    STAT pid 2756
    STAT uptime 180
    STAT time 1457677147
    STAT version 1.4.13
    STAT libevent 2.0.21-stable
    STAT pointer_size 64
    STAT curr_connections 15
    STAT total_connections 16
    STAT connection_structures 16
    STAT reserved_fds 20
    STAT cmd_get 1
    STAT cmd_set 1
    STAT cmd_flush 0
    STAT cmd_touch 0
    STAT get_hits 1
    STAT get_misses 0
    STAT delete_misses 1
    STAT delete_hits 0
    STAT incr_misses 0
    STAT incr_hits 0
    STAT decr_misses 0
    STAT decr_hits 0
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 144
    STAT bytes_written 1060
    STAT limit_maxbytes 67108864
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 0
    STAT hash_power_level 16
    STAT hash_bytes 524288
    STAT hash_is_expanding 0
    STAT expired_unfetched 0
    STAT evicted_unfetched 0
    STAT bytes 89
    STAT curr_items 0
    STAT total_items 0
    STAT evictions 0
    STAT reclaimed 0
    END

    再用其它工具写入缓存可以看到

    STAT curr_items 1
    STAT total_items 1

    有变化 


    六、客户端

    Memcached本身是使用C开发的,客户端可以是php、C#、或者java。我是做java的,所以这里只介绍基于java的客户端。

    我在网上看到基于java的客户端有两个

    1.java_memcached-release_2.6.3

    1)简介

    这是比较通用的Memcached客户端框架。具体原创不详。

    2)依赖的jar

    A.commons-pool-1.5.6.jar

    B.java_memcached-release_2.6.3.jar

    C.slf4j-api-1.6.1.jar

    D.slf4j-simple-1.6.1.jar

    2.alisoft-xplatform-asf-cache-2.5.1

    1)简介

    这个东东是阿里软件的架构师岑文初进行封装的。里面的注释都是中文的,比较好。

    2)依赖的jar

    A.alisoft-xplatform-asf-cache-2.5.1.jar

    B.commons-logging-1.0.4.jar

    C.hessian-3.0.1.jar

    D.log4j-1.2.9.jar

    E.stax-api-1.0.1.jar

    F.wstx-asl-2.0.2.jar

     七 Memcached在.NET中的应用

      一.Memcached服务器端的安装(此处将其作为系统服务安装)

      下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)

      下载地址:http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip

      1.解压缩文件到c:\memcached

      2.命令行输入 c:\memcached\memcached.exe -d install'

      3.命令行输入 c:\memcached\memcached.exe -d start ,该命令启动 Memcached ,默认监听端口为 11211

      通过 memcached.exe -h 可以查看其帮助,查看memcache状态,telnet 192.168.0.98 11211。输入stats查询状态

       stats

       STAT pid 8601

       STAT uptime 696

      STAT time 1245832689

       STAT version 1.2.0

       STAT pointer_size 64

       STAT rusage_user 0.007998

       STAT rusage_system 0.030995

       STAT curr_items 1

       STAT total_items 1

       STAT bytes 76

       STAT curr_connections 2

       STAT total_connections 4

       STAT connection_structures 3

       STAT cmd_get 1

       STAT cmd_set 1

       STAT get_hits 1//命中次数

       STAT get_misses 0 //失效次数

       STAT bytes_read 97

       STAT bytes_written 620

       STAT limit_maxbytes 134217728

       END

       -d选项是启动一个守护进程

       -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB

       -u是运行Memcache的用户

       -l是监听的服务器IP地址,如果有多个地址的话,我这里假定指定了服务器的IP地址为本机ip地址

      -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口

       -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定

       -P是设置保存Memcache的pid文件

      二..NET memcached client library(memcached的.NET客户端类库)

      下载memcached的.NET客户端类库,下载地址:https://sourceforge.net/projects/memcacheddotnet/里面有.net1.1 和 .net2.0的两种版本,里面还有.NET应用memcached的例子。

      三.应用

      1.新建ASP.NET站点,将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll添加到web引用。

      2.为了进行后续的测试,我们创建两个aspx页面,memcache.aspx和nomemcache.aspx,memcache.aspx是使用MemcacheClient类加入了缓存机制的页面。nomemcache.aspx是没有加入缓存机制的页面,直接连接的数据库。一会我们通过观察数据库事件和进行压力测试来测试在压力测试的情况下应用程序的性能。

      3.memcache.aspx.cs中添加对Memcached.ClientLibrary.dll的引用,即:using Memcached.ClientLibrary;Page_Load()中加入如下代码。

      protected void Page_Load(object sender, EventArgs e)

      {

      string[] serverlist = new string[] { "127.0.0.1:11211" };

      string poolName = "MemcacheIOPool";

      SockIOPool pool = SockIOPool.GetInstance(poolName);

      //设置连接池的初始容量,最小容量,最大容量,Socket 读取超时时间,Socket连接超时时间

      pool.SetServers(serverlist);

      pool.InitConnections = 1;

      pool.MinConnections = 1;

      pool.MaxConnections = 500;

      pool.SocketConnectTimeout = 1000;

      pool.SocketTimeout = 3000;

      pool.MaintenanceSleep = 30;

      pool.Failover = true;

      pool.Nagle = false;

      pool.Initialize();//容器初始化

      //实例化一个客户端

      MemcachedClient mc = new MemcachedClient();

      mc.PoolName = poolName;

      mc.EnableCompression = false;

      string key = "user_info";//key值

      object obj = new object();

      if (mc.KeyExists(key)) //测试缓存中是否存在key的值

      {

      obj = mc.Get(key);

      User user2 = (User)obj;

      Response.Write("
    " + user2.Name + "," + user2.Pwd + "
    ");

      }

      else {

      string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

      SqlConnection conn = new SqlConnection(conStr);

      conn.Open();

      string sql = "Select * From T_User Where id=1";

      SqlCommand cmd = new SqlCommand(sql, conn);

      SqlDataReader dr = cmd.ExecuteReader();

      User user = new User();

      while (dr.Read())

      {

      user.Name = dr["name"].ToString();

      user.Pwd = dr["pwd"].ToString();

      }

      dr.Close();

      conn.Close();

      mc.Set(key, user, System.DateTime.Now.AddMinutes(2)); //存储数据到缓存服务器,这里将user这个对象缓存,key 是"user_info1"

      Response.Write("
    姓名:" + user.Name + ",密码:" + user.Pwd + "
    ");

      }

      }

      4.nomemcache.aspx是没有加缓存机制的直接连接数据库的页面。nomemcache.aspx.cs中的代码:

      protected void Page_Load(object sender, EventArgs e)

      {

      string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

      SqlConnection conn = new SqlConnection(conStr);

      conn.Open();

      string sql = "Select * From T_User Where id=2";

      SqlCommand cmd = new SqlCommand(sql, conn);

      SqlDataReader dr = cmd.ExecuteReader();

      User user = new User();

      while (dr.Read())

      {

      user.Name = dr["name"].ToString();

      user.Pwd = dr["pwd"].ToString();

      }

      dr.Close();

      conn.Close();

      Response.Write("
    姓名:" + user.Name + ",密码:" + user.Pwd + "
    ");

      }

      }

      5.测试

      测试memcache.aspx页面,该测试的主要目的是访问memcache.aspx页面,看是否看该页面走的是memcached而非访问的数据库(第一次是访问数据库)。首先,我们运行memcache.aspx页面,通过Sql Server Profiler来查看运行memcache.aspx页面对数据库的操作情况。第一次运行memcache.aspx的时候,Sql Server Profiler里面显示memcache.aspx对数据库的操作,即执行了Select * From T_User Where id=1。


      memcache.aspx页面上第一次运行的时候显示如下信息:

      通过读取数据库得到的数据:

      姓名:lucy,密码:lucy。


      接着我们刷新memcache.aspx页面,页面上还显示上述信息:

      通过读取缓存得到的数据:

      姓名:lucy,密码:lucy

      但从Sql Server Profiler观察,memcache.aspx页面没有对数据库进行任何操作。说明我们第二次访问该页面是读取的缓存,接着不停的刷新页面,都显示的是通过读取缓存得到的数据。直到到达缓存失效时间。

      测试nomemcache.aspx,我们运行nomemcache.aspx页面,每刷新一次(包括第一次),Sql Server Profiler都记录了,nomemcache.aspx页面对数据库进行的操作,即之行了Select * From T_User Where id=2语句。说明每访问一次该页面,都要进行一次数据库的访问操作。

    注意:memcached存储object时,如果是自定义的类,必须是可序列化的,即要有[Serializable] 这个属性,否则存储不了,取出来也是null


      四.压力测试以及性能分析

      这里我们使用Microsoft Web Application Stress Tool对web进行压力测试,Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具。透过这套功能强大的压力测试工具,您可以使用少量的客户端计算机仿真大量用户上 线对网站服务所可能造成的影响,在网站实际上线之前先对您所设计的网站进行如同真实环境下的测试,以找出系统潜在的问题,对系统进行进一步的调整、设置工 作。就是因为这些特性,才使它具备了DOS轰炸的功能。

      1、工具简单设置

      打开Web Application Stress Tool,很简洁的一个页面,上面是工具栏,左下方是功能选项,右下方是详细设置选项。在对目标Web服务器进行压力测试之前,先对它进行一些必要的设置。

      (1).在“settings”的功能设置中(如下图),一个是Stress level (threads)这里是指定程序在后台用多少线程进行请求,也就是相当于模拟多少个客户机的连接,更加形象的就是说设置多少轰炸的线程数。一般填写 500~1000,因为这个线程数是根据本机的承受力来设置的,如果你对自己的机器配置有足够信心的话,那么设置的越高,轰炸的效果越好。


      (2).在“Test Run Time”中来指定一次压力测试需要持续的时间,分为天、小时、分、秒几个单位级别,你根据实际情况来设置吧!这里面设置测试时间为1分钟。

      (3).其余的选项大家可以根据自己的情况设置。

      2、压力测试

      步骤1:在工具中点右键,选择Add命令,增加了一个新的测试项目:memcache,对它进行设置,在主选项中的server中填写要测试的服务器的IP地址,这里我们是在本机上进行测试,所以填写localhost。在下方选择测试的Web连接方式,这里的方式Verb选择 get,path选择要测试的Web页面路径,这里填写/WebMemCache/memcache.aspx,即加入缓存的memcache.aspx页面(如下图)。


      步骤2:在“Settings”的功能设置中将Stress level (threads)线程数设置为500。完毕后,点工具中的灰色三角按钮即可进行测试(如下图)。


      同理,我们在建一个nomemcach的项目用来测试nomemcache.aspx页面。Memcach和nomemcach测试完毕后,点击工具栏上的Reports按钮查看测试报告:


      3.性能分析

      Memcache.aspx的测试报告:

      Overview

      ================================================================================

      Report name: 2009-7-20 10:52:00

      Run on: 2009-7-20 10:52:00

      Run length: 00:01:12

      Web Application Stress Tool Version:1.1.293.1

      Number of test clients: 1

      Number of hits: 2696

      Requests per Second: 44.93

      Socket Statistics

      --------------------------------------------------------------------------------

      Socket Connects: 3169

      Total Bytes Sent (in KB): 646.80

      Bytes Sent Rate (in KB/s): 10.78

      Total Bytes Recv (in KB): 2019.37

      Bytes Recv Rate (in KB/s): 33.65

      Socket Errors

      --------------------------------------------------------------------------------

      Connect: 0

      Send: 0

      Recv: 0

      Timeouts: 0

      RDS Results

      --------------------------------------------------------------------------------

      Successful Queries: 0

      Page Summary

      Page Hits TTFB Avg TTLB Avg Auth Query

      ================================================================================

      GET /WebMemCache/memcache.aspx 2696 1.94 1.95 No No

      Nomemcache.aspx的测试报告:

      Overview

      ================================================================================

      Report name: 2009-7-20 10:54:01

      Run on: 2009-7-20 10:54:01

      Run length: 00:01:12

      Web Application Stress Tool Version:1.1.293.1

      Number of test clients: 1

      Number of hits: 2577

      Requests per Second: 42.95

      Socket Statistics

      --------------------------------------------------------------------------------

      Socket Connects: 2860

      Total Bytes Sent (in KB): 589.32

      Bytes Sent Rate (in KB/s): 9.82

      Total Bytes Recv (in KB): 1932.75

      Bytes Recv Rate (in KB/s): 32.21

      Socket Errors

      --------------------------------------------------------------------------------

      Connect: 0

      Send: 0

      Recv: 0

      Timeouts: 0

      RDS Results

      --------------------------------------------------------------------------------

      Successful Queries: 0

      Page Summary

      Page Hits TTFB Avg TTLB Avg Auth Query

      ================================================================================

      GET /WebMemCache/nomemcache.aspx 2577 4.75 4.79 No No

      从测试报告上看出memcache.aspx页面在一分钟内的Hits(命中次数)2696,平均TTFB是(Total Time to First Byte)1.94,平均TTLB(Total Time to Last Byte)是1.95。这些参数都低于nomemcache.aspx。另外memcache.aspx的Requests per Second(每秒请求的次数)是 44.93高于nomemcache.aspx页面的42.95.这些参数都说明memcache.aspx页面的执行性能要高于nomemcache.aspx页面。缓存起到了提高性能的作用。当然我这里面进行的测试只是模拟500个用户在1分钟内的访问对Web服务器性能的影响。

      总结

      本文简单介绍了Memcached的基本原理,特点以及工作方式,接下来介绍了Windows下Memcached服务器端程序的安装方法、在.NET应用程序中使用.NET memcached client library。接下来通过运行分析程序来了解memcached的工作原理机制,最后通过压力测试工具对没有加入Memcached机制的页面和加入Memcached页面进行了压力测试,对比加入Memcached机制前后Web应用程序的性能。了解Memcached内部构造, 就能知道如何在应用程序中使用memcached才能使Web应用的速度更上一层楼。提升web应用程序的性能和访问速度。


    附:linux下memcached安装部署

    下载安装
    下载了,我到了其官方(http://memcached.org/),目前最新的下载版本是1.4.24

    还要再安装libevent这个软件,从官方(http://monkey.org/~provos/libevent/)下载,目前最新的稳定版是2.0.22

    下载后,将其上传到了/home/apps/下面
    执行以下命令

    cd /home/apps
    tar zxvf memcached-1.4.24.tar.gz
    tar zxvf libevent-2.0.22-stable.tar.gz

    #安装libevent

    cd /home/apps/libevent-2.0.22-stable
    ./configure --prefix=/home/memcached/libevent-2.0.22-stable
    make
    make install

    #安装memcache

    cd /home/apps/memcached-1.4.24
    ./configure --prefix=/home/memcached/memcached-1.4.24 --with-libevent=/home/memcached/libevent-2.0.22-stable
    make 
    make install

    可能存在的问题
    1 启动memcache服务
    进入bin目录,执行:./memcached -d -m 1024 -u blue,但是系统说有一个共享库没有加载,共享库的名称为:libevent-1.4.so.2

    首先要查看一下memcached 这个命令用到的链接库地址在哪儿。执行如下命令可以查看:

    LD_DEBUG=libs /usr/local/memcached/bin/memcached -v

    显示出memcache从哪些地方找libevent-1.4.so.2这个文件,所以,我们只有将libevent-1.4.so.2这个文件指定到上面任意一个目录即可。这里我们将其指定到/lib64/下面。做一个软连接即可。命令如下:

    ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2

    在启动一下memcache服务:./memcached -d -m 1024 -u blue就可以了

    本次安装没有出现上述的问题,安装玩启动即可成功

    制作开机自启动

    把下面的内容存入 /etc/init.d/memcached 
    vi /etc/init.d/memcached
    ==begin==
    #!/bin/sh  
    #  
    # memcached:    MemCached Daemon  
    #  
    # chkconfig:    - 90 25 
    # description:  MemCached Daemon  
    #  
    # Source function library.
    . /etc/rc.d/init.d/functions  
    . /etc/sysconfig/network  


    #[ ${NETWORKING} = "no" ] && exit 0 
    #[ -r /etc/sysconfig/dund ] || exit 0 
    #. /etc/sysconfig/dund  
    #[ -z "$DUNDARGS" ] && exit 0 


    MEMCACHED="/home/memcache/memcached-1.4.24/bin/memcached" 
    SERVER_PORT="11211"
    [ -f $MEMCACHED ] || exit 1 


    start()  
    {  
            echo -n $"Starting memcached: " 
            daemon $MEMCACHED -u root -d -m 2048  -p $SERVER_PORT -P /tmp/memcached.pid -vv >> /tmp/memcached.log 2>&1 
            echo  
    }  
    stop()  
    {  
            echo -n $"Shutting down memcached: " 
            killproc memcached  
            echo  
    }
     
    # See how we were called.  
    case "$1" in  
      start)  
            start  
            ;;  
      stop)  
            stop  
            ;;  
      restart)  
            stop  
            sleep 3 
            start  
            ;;  
        *)  
            echo $"Usage: $0 {start|stop|restart}" 
            exit 1 
    esac  
    exit 0
    ==end==
    chmod 777 /etc/init.d/memcached
    chkconfig --add memcached  #添加memcached到服务项
    chkconfig --level 2345 memcached on  #设置开机启动

    /etc/init.d/memcached start 启动服务

    检查服务:

    1、查看启动的memcache服务:
    netstat -lp | grep memcached
    2、查看memcache的进程号(根据进程号,可以结束memcache服务:“kill -9 进程号”)

    ps aux | grep memcached  

    查看日志
    tail -200 /tmp/memcached.log
    注:日志输出实在启动脚本里配置的
    daemon $MEMCACHED -u root -d -m 2048  -p $SERVER_PORT -P /tmp/memcached.pid -vv >> /tmp/memcached.log 2>&1


    展开全文
  • javascript 缓存系统

    千次阅读 2009-12-29 19:20:00
    模仿jQuery,设计了一个缓存系统。像jQuery.data这样的东西,Prototype与mootools也有,目的都是用来辅助事件系统,用来缓存其中生成的数据,而非缓存普通函数上次计算的结果。Prototype利用了它的Hash类,...
  • 基于Redis缓存系统的设计与实践

    千次阅读 2017-12-31 23:54:21
    redis缓存系统设计与实践
  • javaweb项目搭建ehcache缓存系统

    千次阅读 2016-10-29 14:12:13
    接下来就以用户缓存为例,基于javaweb项目来搭建ehcache缓存系统。 主要涉及核心原理和实现要点:项目是基于spring框架来统一管理和配置bean的,所以在spring中配置缓存,定义EhCacheManagerFactor
  • 云客Drupal源码分析之缓存系统Cache

    千次阅读 2016-09-30 15:44:59
    在介绍drupal8的缓存系统前我们先了解一下缓存系统的本质及特性,缓存的存在依赖于两个目的:节省资源和提高速度,起不到这两作用则缓存没有存在的必要,当一个结果需要进行大量计算才能得到,而它又不会频繁更新...
  • Memcached和Redis数据缓存系统

    千次阅读 2016-07-27 00:11:52
    1.1 Memcached介绍Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。1.2 Memcached...
  •  Tair 是一个类似于map的key/value结构存储系统(也就是缓存系统),具备标准的特性是:高性能、高扩展、高可靠,也就是传说中的三高产品,支持分布式集群部署。官网说目前支持java和c这两个版本。   适用场景是...
  • 15分钟搭建一个简单的Java缓存系统

    千次阅读 2016-11-09 21:01:12
    这里分享一个java系统快速搭建缓存系统的一点经验,只需要15分钟时间,按部就班就可以搭建一个小而灵活的缓存系统。可以根据自己的业务复杂性再进行扩展。最近做一个小项目,需要灵活配置,场景是这样的:很多系统会...
  • php redis 实现全页缓存系统

    千次阅读 2018-10-24 12:03:30
    php redis 实现全页缓存系统 之前的一个项目说的一个功能,需要在后台预先存入某个页面信息放到数据库,比如app的注册协议,用户协议,这种.然后在写成一个php页面,app在调用接口的时候访问这个页面.当时我就发现一个...
  • Java缓存一般用于应用系统数据,数据量较小。也可保存一般字典数据。 memcache缓存一般用于业务数据。数据量较大。 创建javaweb系统可采用java缓存与memcache缓存相结合方式。
  • 前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则...
  • 数据缓存系统-memcached介绍

    千次阅读 2012-12-19 17:01:42
    memcached就是一个开源的缓存系统,它开始是为网站缓存而开发的,它基于key-value这一通用的数据结构,采用C++开发。 二、事件通知机制 memcached基于libevent,因此在安装时,必须先安装libevent。对libevent,...
  • Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS、NoSQL和HDFS,还支持Write-Through和Read-Through、Write-Behind Caching等可选功能。
  • memcached缓存系统的简介与安装

    千次阅读 2013-06-25 17:46:21
    emcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力从而大大提高读取速度。 Memcached 是一个高性能的分布式内存对象缓存系统,用于...
  • php分布式缓存系统 Memcached 入门

    千次阅读 2011-08-17 00:14:51
    Memcached 是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存来存取数据要比从磁盘...
  • 作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术!架构师社区合伙人!首先我们需要明白,什么是一个多级缓存系统,它有什么用。所谓多...
  • 在.Net C#中使用分布式缓存系统Memcached
  • 缓存系统的设计 第一次设计 第二次设计 第三次设计 缓存系统的实现 缓存文件的命名 播放器的初始化 计算可读字节 标记已缓存区间 音频播放 Seek操作 清理缓存 流程图 示例程序 播放和暂停 更新定时器 前进和后退 ...
  • 阿里妹导读:本文以双11面临的挑战为背景,从Tair(阿里自研高速缓存系统)发展和应用开始谈起,重点分享了性能优化方面的实践,最后对缓存热点难题给出了解决方案,希望能对大家的工作有所启发。本文作者为宗岱,...
  • Django支持使用Memcached和Redis这两种流行的内存型数据库作为缓存系统。我们今天来看Memcached和Redis的区别和性能对比。redis和memcached的区别1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过...
  • 简单地缓存系统:当有线程来取数据时,如果该数据存在我的内存中,我就返回数据;如果不存在我的缓存系统中,那么就去查数据库,返回数据的同时保存在我的缓存中。 其中涉及到读写问题:当多个线程执行读操作时(都...
  • 本文充分的介绍了 EhCache 缓存系统对集群环境的支持以及使用方法。 EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheP
  • ATS缓存系统

    2014-09-26 21:46:41
    推荐一款目前国内唯一一家使用ATS实现的线上huanc
  • 多线程---缓存系统

    千次阅读 2012-02-13 21:50:35
    首先解释下缓存系统:  在程序运行过程中,有些数据我们不会经常修改,例如数据库中性别字段,但是我们却经常使用,如果每次都从数据库中获取,那么将会降低程序性能。那么我们可以在内存中分配一个区域专门存放...
  • 缓存系统的设计和问题

    千次阅读 2018-08-29 16:18:14
    选择合适的进程缓存 ... 比较适合缓存比较固定不变的元素,且缓存的数量较小的 jdk自带的,使用方便 可以用来缓存反射的Method, Field等 LRUMap  依赖common-collections包 淘汰算法淘汰数据 Ehcac...
  • 1、实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序。 2、实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient 内容:以Memcached的Java Spy...
  • Java开源缓存系统的介绍

    千次阅读 2005-01-07 12:57:00
    几种java开源缓存系统的性能比较:以下是几个著名java开源缓存系统的介绍:OSCacheOSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,991
精华内容 25,596
关键字:

缓存系统