当前位置: 澳门新濠3559 > 操作系统 > 正文

为什么商品分类数据可事先放到缓存,它是一套

时间:2019-12-26 00:20来源:操作系统
介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用。它是通过预分配

介绍

它是一套数据缓存系统或软件

用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用。它是通过预分配指定的内存空间来存储数据

Memcached原理与应用

标签: linux


笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流

定义

它是一个开源的、高性能的,具有分布式内存对象的缓存系统,它一般用来存储经常读取的对象或数据,如同web服务器会将一些内容缓存到客户端本地一样

1.Memcached是什么

  • 高性能
  • 支持高并发
  • 分布式内存缓存系统
  • 协议简单且部署方便

    服务端软件名字如: Memcached-1.4.24.tar.gz
    客户端软件的名字形如: Memcache-2.25.tar.gz


mysql已经有cache了,为啥还要在它前面加一层memcached?

memcached是一个key/value系统,系统相对于MySQL简单很多,虽然MySQL也有cache,但是数据库的SQL解析会耗费性能,查询慢于memcached,另外MySQL的cache设计得更加复杂,因为要考虑事务,日志,存储引擎等模块,它的性能也没有memcached好

为什么商品分类数据可事先放到缓存,它是一套数据缓存系统或软件。memcached只做一件事情,简单高效,在cache上比MySQL强,这应该容易理解

2.作用和原理

  • 多数Web应用都将数据保存到关系型数据库中,如MySQL,Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会出现加重、响应缓慢、导致网站打开延迟等问题。所以Memcached的主要目的是通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态Web应用的速度、提高网站架构的并发能力和可扩展性。

  • 通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直新年好高并发访问,从而达到提升大规模网站集群中动态服务的并发访问能力

  • web服务器读取数据时先读memcached服务器,若memcached没有,则向数据库请求数据,然后web再把请求到的数据发送到memcached

memcached的应用场景

数据库的前端缓存应用:让它来分担数据的并发压力,当数据更新时,可以使程序通知缓存进行更新

session会话共享的共享存储

常见内存缓存服务软件对比

软件 类型 主要作用
Memcached 纯内存型 常用于缓存网站后端的各类数据,例如数据库中的数据
Redis、Memcachedb(新浪开发) 可持久化存储,即使用内存,也会使用磁盘存储 1、缓存后端数据库的查询数据。 2、作为关系数据库的重要补充。
Squid、Nginx 内存或内存加磁盘缓存 主要用一缓存web前端的服务内容

memcached应用中的工作流程

它是一种内存缓存,可通过API的方式读取内存中缓存的这些数据,当用户需要读取数据时,会首先访问memcached内存缓存,如果缓存中有数据就直接返回给前端的应用程序,如果没有,再转发给后台端的服务器,这时服务器除了返回数据给用户,还会将数据更新给memcached缓存。

如果实际生产环境中,缓存服务器需要重启(或者断电),那么缓存中的数据将会丢失,那么这时后端的服务器
并发压力会增大,可能会导致后端的服务器也跟着宕机,无法提供服务,
那么这时我们的处理流程是这样的:
首先从负载均衡中将 WEB 应用停掉----->让负载均衡不再转发数据给 WEB---->接着启动缓存服务器-------->
通过程序把数据库的内容初始化到缓存服务器中------->然后将 web 应用启用------->重启数据库服务器

  图片 1

1、设置缓存(expires)和 deflate 压缩,可以将一些内容直接缓存在用户端的本地,下次访问直接调用本地
2、 CDN 缓存静态内容(html、图片等),当用户请求这些内容时直接调用 CDN 的内容,不再请求后端服务器了
3、 Apache 和 Nginx 静态服务器提供静态内容(通过异步消息队列生成静态内容)
4、 PHP 和 JAVA 动态内容
5、数据库的 memcached 缓存服务器
6、数据库服务器(MYSQL)
7、数据库的存储服务器

应用场景

特性

协议简单:协议使用比较简单,使用基于文本行的协议

基于libevent的事件处理

1.完整数据缓存

例如:电商的商品分类功能不会经常变动,就可以事先放到Memcached里,然后对外提供数据访问,即"数据预热"。
这时只需要读取缓存而无需读取数据,数据库访问压力大大降低了。
***
为什么商品分类数据可事先放到缓存?
因为商品分类几乎都是由内部人员管理的,如需更新数据,更新数据库后,就可以把数据同时更新到Memcached里。 商品分类更新频率不是很大。 如果把商品分类数据做成静态化文件,然后,通过在前端WEB缓存或者使用CDN加速效果更好。

memcached软件的工作原理

它是一套C/S模式架构的软件,在服务器端启动服务守护进程,可以为memcached服务器指定监听的IP地址、端口号、并发访问连接数以及分配多少内存来处理客户的请求参数

需要被缓存的数据以key/value键值对的形式在服务器端预分配的内存区中,每个被缓存的数据都有唯一的标识key

2.热点数据缓存

热点数据缓存一般是用于由用户更新的商品,如淘宝卖家,当卖家新增商品后,网站程序就会把商品写入后端数据库,同时把这部分数据放入Memcache内存中,下一次访仍这个商品的请求就直接从Memcached中取走。这种方法用来缓存网站热点数据,即利用Memcached缓存经常被访问的数据。

这个过程可以通过程序实现,也可在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,相当于Memcached是MySQL从库.

安装与配置

[root@cairui ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@cairui ~]# uname -r
2.6.32-696.6.3.el6.x86_64

libevent安装

[root@cairui software]# tar xf libevent-2.1.8-stable.tar.gz 
[root@cairui software]# cd libevent-2.1.8-stable
[root@cairui libevent-2.1.8-stable]# ./configure 
[root@cairui libevent-2.1.8-stable]# make
[root@cairui libevent-2.1.8-stable]# make install

安装memcached

[root@cairui libevent-2.1.8-stable]# yum install memcached
[root@cairui libevent-2.1.8-stable]# find / -name memcached
/etc/sysconfig/memcached
/etc/rc.d/init.d/memcached
/usr/bin/memcached
/var/run/memcached

配置ld.so.conf路径防止启动时报错

[root@cairui lib]# echo "/usr/local/lib">>/etc/ld.so.conf
[root@cairui lib]# ldconfig 
[root@cairui lib]# which memcached
/usr/bin/memcached

几大电商双11秒杀场景:

在这种高并发情况下,必须先预热各种缓存,包括前端的Web缓存和后端数据库缓存。
先把数据放入内存预热,然后在逐步动态更新。先读取缓存,如果缓存里没有对应的数据,再云读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然,对于这种百万级别并发还有很多其它要做的。
***

memcached参数介绍

[root@cairui lib]# /usr/bin/memcached -h
memcached 1.4.4
-p <num>      TCP port number to listen on (default: 11211)  #指定监听端口
-U <num>      UDP port number to listen on (default: 11211, 0 is off)
-s <file>     UNIX socket path to listen on (disables network support)
-a <mask>     access mask for UNIX socket, in octal (default: 0700)
-l <ip_addr>  interface to listen on (default: INADDR_ANY, all addresses)  #指定监听地址
-d            run as a daemon  #后台模式启动
-r            maximize core file limit  #最大的文件字符集
-u <username> assume identity of <username> (only when run as root)  #指定用户
-m <num>      max memory to use for items in megabytes (default: 64 MB)  #分配内存区大小
-M            return error on memory exhausted (rather than removing items)
-c <num>      max simultaneous connections (default: 1024)  #最大并发数
-k            lock down all paged memory.  Note that there is a
              limit on how much memory you may lock.  Trying to
              allocate more than that would fail, so be sure you
              set the limit correctly for the user you started
              the daemon with (not for -u <username> user;
              under sh this is done with 'ulimit -S -l NUM_KB').
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)  #以very verbose模式启动
-vvv          extremely verbose (also print internal state transitions)
-h            print this help and exit
-i            print memcached and libevent license
-P <file>     save PID in <file>, only used with -d option  #设置保存memcached的PID
-f <factor>   chunk size growth factor (default: 1.25)
-n <bytes>    minimum space allocated for key+value+flags (default: 48)
-L            Try to use large memory pages (if available). Increasing
              the memory page size could reduce the number of TLB misses
              and improve the performance. In order to get large pages
              from the OS, memcached will allocate the total item-cache
              in one large chunk.
-D <char>     Use <char> as the delimiter between key prefixes and IDs.
              This is used for per-prefix stats reporting. The default is
              ":" (colon). If this option is specified, stats collection
              is turned on automatically; if not, then it may be turned on
              by sending the "stats detail on" command to the server.
-t <num>      number of threads to use (default: 4)
-R            Maximum number of requests per event, limits the number of
              requests process for a given connection to prevent 
              starvation (default: 20)
-C            Disable use of CAS
-b            Set the backlog queue limit (default: 1024)
-B            Binding protocol - one of ascii, binary, or auto (default)
-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)  

作为集群节点的session会话共享存储

即把客户端用户请求多个前端应用服务集群产生的session会话信息,统一存储到一个Memcached缓存中。
由于session会话数据是存储在内存中的,所以很快。

 配置memcached

[root@cairui lib]# memcached -p 11111 -u root -c 1024 -d
[root@cairui lib]# lsof -i:11111
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 17416 root   26u  IPv4  90768      0t0  TCP *:vce (LISTEN)
memcached 17416 root   27u  IPv4  90785      0t0  UDP *:vce 
[root@cairui lib]# netstat -lntup|grep mem
tcp        0      0 0.0.0.0:11111               0.0.0.0:*                   LISTEN      17416/memcached     
udp        0      0 0.0.0.0:11111               0.0.0.0:*                               17416/memcached     

 写入数据

[root@cairui ~]# printf "set key001 0 0 10rntest123456rn"|nc 127.0.0.1 11111  #写入数据
STORED
[root@cairui ~]# printf "get key001rn"|nc 127.0.0.1 11111  #查询数据
VALUE key001 0 10
test123456
END
[root@cairui ~]# printf "delete key001rn"|nc 127.0.0.1 11111  #删除数据
DELETED
[root@cairui ~]# printf "get key001rn"|nc 127.0.0.1 11111
END

正确关闭 memcached 服务
一般启动时最好指定下 PID
[root@LVS-2 ~]# memcached -p 11213 -u root -m 16m -c 1024 -d -P /var/run/11213.pid #指定进程文件
[root@LVS-2 ~]# kill `cat /var/run/11213.pid`
提示:实际生产环境中,要布署 memcached 服务,做为数据缓存,内存的指定大小是根据业务来确定,是不是需要负载均衡?最好同开发一起讨论确定好,还有它还有分客户端与服务端
配置 session 会话共享存储
vi /applicaton/php/lib/php.ini
session.save_path = "/tmp"改成 memcached 服务器地址 tcp ://10.10.10.1:11211
session.save_handler = files(改成 memcached)
将所有的 WEB 服务器(WEB 服务器需要安装客户端)里的 PHP 配置文件改成上述配置,即可完成会话共享存储

3.特性

  • 协议简单

    基于文本行的协议,可通过telnet/nc等命令直接操作memcached服务存取数据。

  • 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制

    简而言之,libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。memcached就是利用这个libevent库进行异步事件处理。

  • key/value键值数据类型

    被缓存的数据以key/value键值形式存在的,例如:
    oldboy—>36,key=oldboy,value=36
    oldgirl—>28,key=oldgirl,value=28
    通过oldboy key可以获取到36值,同理通过oldgirl key可以获取28值。

  • 全内存缓存,效率高

    memcached管理内存的方式非常高效,即全部的数据都存放于memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或memcached服务时,memcached内存中的数据机会丢失。

如希望重启后,数据依然能保留,可采用redis——持久性内存缓存系统

当内存中缓存的数据容量达到服务启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。也可以存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。

  • 可支持分布式集群
    memcached没有像MySQL那样的主从复制方式,分布式memcached集群的不同服务器之间是互不通信的,每一个节点都是独立存取数据,并且数据内容也应该是不一样的。通过对Web应用端的程序设计或者通过支持hash算法的负载均衡换件,可以让memcached支持大规模海量分布式缓存集群应用。

memcached监控软件介绍

[root@LB01 vhost]# cd /web/www/
[root@LB01 www]# wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
[root@LB01 www]# tar zxf memadmin-1.0.12.tar.gz
无需安装,解压即可

  图片 2

图片 3

编辑:操作系统 本文来源:为什么商品分类数据可事先放到缓存,它是一套

关键词: