因为商品分类是内部员工管理的,可以增加编辑后推送到Memcached内存里。
2、 热点缓存(难)
热 点缓存一般是指用户更新的商品,例如淘宝的卖家,当卖家新增商品后,淘宝网的程序就会把商品写入数据库,然后读取写入的数据,把这部分数据,放入 Memcached内存中,下一次访问这个商品的请求直接从Memcached内存中取走了。这种方法用来缓存网站的热点数据,既Memcached中经 常被访问的数据。
特别提示:这个过程可以通过程序实现,也可以在数据库上安装Memcache插件,直接由数据库出发更新内容到Memcached中。
淘宝、京东、小米等电商双11、秒杀抢购场景:
如果碰到双11、秒杀高并发的业务场景,必须要实现预热Memcached。
先把数据放入内存预热,然后再逐步动态更新,先读取缓存,如果缓存里没有对应的数据,再去读取数据库,然后把读到的数据放入缓存,如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然对于百万级别并发还有很多其他的工作要做。
所 有的网站动态数据都是保存在数据库当中的,每次频繁的存取数据库,会导致数据库性能急剧下降,无法同时服务更多的用户,比如MySQL特别频繁的锁表,那 么,就可以让Memcached来分担数据库的压力,增加memcached服务的好处除了可以分担数据库的压力,增加memcached架构也无需改动 整个网站架构,只需要修改程序让程序首先来读取Cache查询数据就好了,当然别忘了,更新数据时也要更新缓存。
4.1.6Memcached服务在大型站点中的应用
大型网站的设计原则
几乎所有的网站,当访问量增大时,在整个网站集群结构最先出现的瓶颈的几乎都是数据库角色以及存储角色的服务器,在工作中我们是尽量把用户的请求往整个网站架构的前面推,既当用户请求数据时,越是在靠近用户端把数据返回效果就越好-
分布式Memcached缓存服务架构
由于单台Memcached服务器的内存容量是有限的,并且单台也存在单点故障,因此,就需要将多个Memcached服务器组合起来提供服务,那么怎么组合效率才更高呢?
1. cache服务使用常规负载均衡模式的问题
2. 分布式缓存集群
a) Memcache支持分布式集群,其中方法之一就是在客户端应用程序上进行改造。例如:可以根据key适当进行有规律的封装,比如以用户为主的网站来说,每个用户都有 UserID,那么可以按照固定的id来进行提取和存取,如果1开头的用户保存在第一台memcache服务器上,以2开头的用户的数据保存在第二台 mecache服务器上,存取数据都按照UserID来进行相应的转换和存取。
但是这个有缺点,就是需要对UserID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据在iji的实际业务来进行考虑,或者去想更合适的方法
b) 在应用服务器上通过程序及URL_HASH,一致性哈希算法驱访问Memcached服务,所有Memcached服务器的地址池可以简单的配在每个程序的配置文件里。
c) 可以用Nginx的分支tengine实现对Mc的负载均衡,和普通web应用服务相比,这里的重点是调度算法,Mc服务一般会选择hash或一致性hash算法
i. 完整缓存,如果是多台就直接负载均衡。特点所有缓存数据都一样。百度的memcached TB 级别。一台机器的内存没那么大。就必须分布式。
ii. 热点缓存、分布式缓存
分布式缓存集群设计思想
1) 每一台MC服务器的内容都是不一样的,这些服务器内容加起来接近整个数据库的容量。
2) 通过在客户端程序或者MC的负载均衡器上用HASH算法,让同一内容都分配到一个MC服务器、
3) 普通的HASH算法对于节点宕机会带来大量的数据流动(失效),可能会引起雪崩效应
4) 一致性哈希算法(还可以带虚拟节点)可以让节点宕机对节点的数据流动(失效)降到最低。
分布式Memcached缓存集群调度算法
取模计算Hash
优点:简单、分散性优秀
缺点:添加/移除服务器时,缓存重组代价巨大,影响命中率
例:26个字母有三个节点增加一个节点,命中率下降了23%
Consistent Hash(一致性哈希算法)
Consistent hashing是一种算法,简单的说,在移除以及添加一个cache节点时,它能够尽可能小的改变已存在key的映射关系,尽可能让缓存服务器影响最小。
通常的hash算法都是讲value映射到一个32位的key值,既0-232-1次方的数组空间;可以将这个空间想象成一个首(0)尾(232-1)相接的圆环,如下面图所示:
Memcached的特性
Memcached作为高并发、高性能的缓存服务,具有如下特征:
C/S模式架构
Memcached是一套C/S模式架构的软件,由C语言编写,总共2000多行代码。
协议简单
Mmecached的协议实现比较简单,使用的是基于文本行的协议,能通过telnet/nc直接操作Memcached服务存取数据。
支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。
简单的说,libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。
Memcached就是利用这个库进行异步事件处理,关于这个库的更详细内容,有兴趣的读者可以查看相关文档
Key/value键值对数据类型
被缓存的数据以key/value键值对形式存在的。
全内存缓存,效率高
Memcached有一套自己管理内存的方式,这套管理方式非常高效,既全部数据都存放于Memcached服务实现分配的内存中,无持久性存储的设计,和系统的内存一样,重启系统或Memcached服务,Memcached内存中的数据既丢失。
如果希望重启后,数据依然能保留,那么就使用memcachedb以及redis这样的持久性内存缓存系统,当然还有常见的NOSQL软件如redis。
支持分布式集群
Memcached多个分布式集群节点是互不通信的,每一台服务器都是独立存取数据,他们之间不共享任何数据信息,并且数据内容也应该是不一致的。通过对客户端访问程序的设计,让Memcached具有分布式,支持海量缓存和大规模应用。
利用客户端程序实现Mc分布式的简单代码。
Memcached工作原理与机制
Memcached工作原理介绍
Memcached是一套C/S模式架构的软件,在服务端启动memcached服务守护进程,可以指定监听的IP地址、端口号、并发访问连接数以及分配多少内存来处理客户端的请求的参数。
Socket事件处理机制
Memcached 软件是由C语言来实现的,全部代码仅有2000多行,采用的是异步epoll/kqueue非阻塞I/O网络模型,其实现方式是基于异步的 libevent事件单进程、单线程模式。使用libevent作为事件通知机制,多个服务端可以协同工作,但这些服务器端之间是没有任何通信联系,每个 服务器端只对自己的数据进行管理,应用程序通过制定缓存服务器的IP地址和端口,就可以连接memcahed服务相互通信。
数据存储机制
需 要被缓存的数据以key/value键值对的形式保存在服务器端预分配的内存区中,每个被缓存的数据都有唯一的标识key,操作Memcached中的数 据通过这个唯一标识的key进行,缓存到Memcached中的数据仅放置在Memcached服务预分配的内存中,而非存储在Memcached所在的 磁盘上,因此存取的速度非常之快。
4.2.1安装 libevent(C6.4)
[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.4 (Final)
[root@localhost ~]# uname -rm
2.6.32-358.el6.i686 i686
安装Memcached前需要安装libevent(c的程序库)
mdkir /home/lyy/tools
cd /home/lyy/tools
wgethttp://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
ls libevent-1.4.13-stable.tar.gz
tar –zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure
Make
Make install
cd …/
安装Memcached
wget http://memcached.org/files/memcached-1.4.31.tar.gz
tar zxvf memcached-1.4.31.tar.gz
cd memcached-1.4.31
./configure
Make
Make install
cd …/
测试memcached是否安成功
which memcached
memcached –h //查看有没有结果 如果报错(libevent-1.4.so.2) No suchfile or directory这个是因为找不到共享库
Find / -name “libevent-1.4.so.2”
找到路径为:
/usr/local/lib/libevent-1.4.so.2
vim /etc/ld.so.conf
加入路径:/usr/local/lib
保存退出
Ldconfig 让其生效
启动memcached
memcached -m 16 -p 11211 -d -c 8192 -u root
memcached相关启动参数说明:
-m 指定分配的内存区的大小 16M
-p Memcached监听的端口 默认是11211,保存PID到指定文件
-d以守护程序(daemon)方式运行
-c 连接数 1024 8192
-u root运行memcached的用户,指定用户,如果当前为root,需要使用此参数指定用户
-l 执行监听的服务区ip地址
检查是否有memcached进程
复习的面试资料
这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
- 第一部分:Java基础-中级-高级
- 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)
- 第三部分:性能调优(JVM+MySQL+Tomcat)
- 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)
- 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)
- 第六部分:其他:并发编程+设计模式+数据结构与算法+网络
进阶学习笔记pdf
- Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法)
- Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis)
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
链图片转存中…(img-uYGS0Gm3-1714432798823)]
[外链图片转存中…(img-1kMCxGs9-1714432798823)]
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
[外链图片转存中…(img-qc9Oqhpj-1714432798823)]
[外链图片转存中…(img-iTMEq5Rf-1714432798824)]
[外链图片转存中…(img-RK7hAyD1-1714432798824)]
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外链图片转存中…(img-mxhBjQ0c-1714432798824)]
[外链图片转存中…(img-SX3OoXOF-1714432798824)]