开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Caching】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/75/detail/15833
Caching (一)
内容介绍:
一、Memcached
二、MemCached - Storage Commands
三、MemCached - Memory Management
四、Redis
五、Clusterina
一、Memcached
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.
Memcached is simple yet powerful.
Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches.
Its API is available for most popular languages.
At heart it is a simple Key/Value store.
在 Memcached 内存里面存数据,存的是 key value,给它一个 key,把要存储的东西全部当成 value 存,如果给key,给个对象,就可以放到的缓存里,把对象存进去,通过 key 把它拿出来,用量目前看到的比较少,网站上更新的也不快。
Installing memcached with Homebrew and Lunchy
Step 1 - Install Homebrew
$ ruby -e "$(curl -fsSL https:/ /raw.github.com/Homebrew/homebrew go/install)"
Step 2 Install memcached
$ brew install Memcached
Step 3 - Install Lunchy
$ gem install lunchy
Step 4 Start/Stop memcached
$ mkdir ~ /Library/LaunchAgents
$ cp /usr/local/Cellar/memcached/$version/homebrew.mxcl.memcached.plist
~/Library/LaunchAgents/
$ lunchy start memcached
$ lunchy stop memcached
从网站上如何安装,在 linux memcached 容易一点,下载,安装好,通过 lunch 的方法启动和关闭,启动之后界面很简单。
应用服务器可以访问 memcached,memcached 还可以有集群,启动的时候可以指定在若干个机器上启动多个进程,在一个机器上要求的端口号不一样,在多个机器上可以端口号一样,未来应用在写程序的时候,首次访问的时候只从数据库里读,再把数据返回给客户端的时候,同时还要把它写入到 memcached 的里面,第二次以及以后的每一次读取,都是直接从 memcached 里面读。
例子是 springboot,configuration 类,在 spring 框架里面凡是用 Configuration 标注过的东西,在启动的时候,加它当配置文件做,只要引入 memcached 的包,就可以得到创建有关 memcached 的配置类,在里面实现方法defaultMemcachedClient,获取一个 memcachedClient 的对象,memcached 是单独的进程在里面,tomcat 里好多 springboot 不同的应用就是 memcached 的客户端,在程序里面 CacheConfiguration 类,指定 url 和端口号,默认是112.11,创建 cachefactory 用到配置,在上面设置地址,内容可以当做标准的类,唯一要改的是地址,看是否需要,如果不需要,默认即可。
在实体类,定义 person 类,有 age first time last name,其它都是用 jpa 描述,JsonlgnoreProperties 和JsonldentitvInfo 防止 person 和 event 做两个类之间的关联循环依赖的问题,下面都没变,
加内容跟 cachefactory 相关,从读的时候,要从 cache 里面读,k 是 integer id,用 id 读,通过 getone id 获取人时,会先到 memcached 里面,读的时候如果读不到才会到数据库里面读,真正调用 spring person repository,到数据库里读,如果读到了会把它扔回到 memcached 里面,memcached 里面再用 k value 存储,真正存进去有区别。
其它什么都没改,跟 Spring jpa 一样。
pom.xml
com.google.code.simple-spring-memcached
xmemcached-provider
4.1.3
管理的时候,引入 memcached 的包,版本是4.1.3,包里面有和 spring 集合的东西,如果不用 spring 用别的,可以找其他的包。
右边是完整的工程,多加的 memcached 的配置类,在 dao 实现类,先从 memcached 里面读,跑例子,加 Alpha 缓存。将 Alpha 扔到 memcached 里面,integer id 出来的效果。
S
tats
cache dump
122
ITEM Alpha:1 [1056 b; 1583655630 s ]
ITEM Alpha:2 [1056 b; 1583655525 s ]
打开 memcached,因为要访问数据库,加了其它的东西,最主要和 memcached 相关的依赖加进来
com. google. code . s imple spring-memcached
xmemcached-provider
4.1.3
在所有的代码里面只有一个地方做了修改,就是在 dao 实现类里面,从内存里面读,将来存到 memcached 里面后,k都是 alpha:1,人的主键是1,所以存进去就是 alpha:1,有 person,event 往里放,namespace 不一样,k 就不一样,这是 springboot 的例子,只要 spring 跑起来就可以,在例子里面找 id 为1的人,person 为1,要到 telnet 上面,可以看内存缓存里面现在有的东西,现在有一个 alpha 为1的,再找 id 为2的人,liubei,在 memcached 里面再看一下里面的内容,有两个人,其中一个人是 id 为1的,如果在2里面再找一遍,实际上就是第二次在访问,在 memcached 里面访问的,log 写的比较少,例子是如何用 memcached 写代码,配置的类和 memcached 放在一起,上面只要加了configuration,启动的时候会扫描整个的包,看到 configuration 类,就会加载里面的内容,作为配置项目。很多次访问的时候,只从数据库里面找两次,分别把它们扔到 memcached 里面。
二、MemCached - Storage Commands
set
Most common command. Store this data, possibly overwriting any existing data. New items are at the top of the LRU.
add
Store this data, only if it does not already exist. New items are at the top of the LRU. If an item already exists and an add fails, it promotes the item to the front of the LRU anyway.
replace
Store this data, but only if the data already exists. Almost never used, and exists for protocol completeness (set, add, replace, etc)
append
Add this data after the last byte in an existing item. This does not allow you to extend past the item limit. Useful for managing lists.
prepend
Same as append, but adding new data before existing data.
cas
Check And Set (or Compare And Swap). An operation that stores data, but only if no one else has updated the data since you read it last. Useful for resolving race conditions on updating cache data.
get
Command for retrieving data. Takes one or more keys and returns all found items.
gets
An alternative get command for using with CAS. Returns a CAS identifier (a unique 64bit number) with the item. Return this value with the cas command. If the item's CAS value has changed since you gets'ed it, it will not be stored.
delete
Removes an item from the cache, if it exists.
incr/decr
Increment and Decrement. If an item stored is the string representation of a 64bit integer, you may run incr or decr commands to modify that number. You may only incr by positive values, or decr by positive values. They does not accept negative values.
If a value does not already exist, incr/decr will fail.
类似于控制台,处理缓存。类似于sql,只不过它更简单,k-v,对里面进行操作等。
MemCached
memcached also allows you to make better use of your memory.
Each node is completely independent (top).
Each node can make use of memory from other nodes (bottom)
memcached 是利用操作的方式进行利用,app 有三个进程,从数据库里面,memcached,db,app 是从数据库抓出来扔到 memcached 里面,每次都在 memcached 里面找,如果没有就从数据库里面找,这是读,写有两种方案,一种是直接写到数据库里,写完之后马上做一次读,重新刷新 memcached,memcached 删掉重新做一次读操作,或者连读操作都不用做,只要往数据库里写,直接把 memcached 对象给删掉,下一次在访问的时候,因为没有,所以会到数据库里重新抓一次,新的状态就会读回来,另外一种比较好的方式是每一次写的时候,应该先往 memcached 里面写,写成功再往数据库里写,两个同时成功,事情做完,否则就认为整个事务失败,memcached 和 写数据库两个动作定义成事务,只要用缓存,比如 用 redis,写操作是一样的,都是要先写缓存再写数据库或者先写数据库再写缓存,两个操作是一个事务不能分开,这样才能保证以后读数据的时候,从内存里面读到。
可以保证在数据库里面的是一样的,只要有写操作就把从 memcached 里面删掉,一个比较好的方式,两个都可以,比较,后面的方式是写数据库之后就把对象从 memcached 里面删掉,方式比较可靠而且不太复杂,memcached 充分利用内存的原因是 memcached 可以把机器上内存充分利用起来,比如在机器上跑 tomcat 又跑另外一个 tomcat,两个应用内嵌有两个 tomcat,但是各自有64兆的内存,最多用自己64兆,哪怕一边的不够,一边闲着,也没办法,但是有了memcached 之后,可以迭代缓存,缓存是从 memcached 或者 spring 里面配置的缓存,
把缓存省出来,全部放到 memcached 中,两个应用服器都到 memcached 里面读,并存的缓存的使用率就会更高一些,不会出现左边的64兆用完,没有用的,右边的一点都没用空着,这就是 memcached 带来的好处。