memcache

news/2024/7/20 16:11:30 标签: memcached, 数据库, 内存管理

安装

1.服务器端安装(用于数据存储)memcached
2.客户端安装(作为扩展添加到某一开发环境)memcache

定义

高性能分布式内存缓存系统。通过缓存数据库的查询结果降低数据库的访问压力,提高动态web应用的稳定性和可扩展性。
实质:存储键值对的hashmap。
高性能来源:1k-v存储 o(1);2一致性hash实现分布式;3支持并发访问

工作流程

1.先检查客户端请求数据在不在m中;
2.若不在,查询数据库,同时将数据缓存到m中(需要程序实现);
3.每次更新数据库的同时更新m中数据;
4.分配给m的内存空间用完后,使用LRU(最近最少算法)+到期失效策略,先用后者。

缓存命令

set add(不能添加已经存在的键名) get  replace delete(m提供的一些方法)
应用场景
1.完整数据缓存 如电商商品分类功能
2.热点数据缓存

优点

1.部分容灾
假设只用一台memcache,如果这台memcache服务器挂掉了,那么请求将不断的冲击数据库,这样有可能搞死数据库,从而引发”雪崩“。
如果使用多台memcache服务器,由于memcache使用一致性哈希算法,万一其中一台挂掉了,部分请求还是可以在memcache中命中,为修复系统赢得一些时间。

2.容量问题
 一台memcache服务器的容量毕竟有限,可以使用多台memcache服务器,增加缓存容量。

3. 均衡请求
 使用多台memcache服务器,可以均衡请求,避免所有请求都冲进一台memcache服务器,导致服务器挂掉。

4.利用memcache分布式特性
使用一台memcache服务器,并没有利用memcache的数据分布式特性。

缺点

1.不能持久化存储
2.存储数据有限制:1M 【大于1M,认为就行分割】(内存碎片)
3.存储数据只能key-value
4.集群数据没有复制和同步机制 【崩溃不会影响程序,会从数据库中取数据

内存管理机制

前言:高效的内存管理方案不会直接使用malloc free调用,容易造成内存泄漏,频繁调用会产生内存碎片。

Mencached:拿空间换时间,因为是预先分配内存,而不是动态分配。

Slab allocation机制管理内存,将分配的内存分割成特定的长度的块以存储相应长度的key-value数据记录。Chunk是存储数据的最小单位。

分配流程:判断数据大小>>查看空闲chunk列表,找到可以存下数据的列表

 缺点:会导致空间浪费,因为每个chunk都分配了特定长度的内存空间,无法充分利用。

Memcached集群实现机制(只能通过客户端实现分布式存储)

在客户端通过一致性哈希算法实现分布式存储。客户端发送数据之前,首先根据算法计算数据的目标节点,然后数据被发送到相应的节点保存;
当需要读取数据时,先查询出数据所在的节点,然后向节点发送查询请求以获取数据。

与Redis对比

1.性能

Redis使用单线程的IO复用模型。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。
而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

2.数据一致性

M:保证多个并发访问,乐观锁;R:单线程,事务功能,数据可按顺序提交

3.可靠性

R:数据备份,Master-slave主从复制,数据缓存具有持久性

4.分布式存储

R:m-s主从复制  M:一致性hash

5.数据支持类型

R:支持除K-V之外的更多类型

一致性Hash算法

存在问题:普通取模方法,当机器节点进行增减时,数据缓存命不中,缓存要重新建立甚至数据整体迁移。

目的:key的分布均衡+cache的迁移做到最少。当一个节点失效的时候,其他节点数据不会受到破坏,这个节点的数据被分流到另一个节点。

解决方法

环形hash空间>把对象映射到hash空间>把cache映射到hash空间>把对象映射到cache(顺时针移动)>考虑cache的变动(需要移动的对象相对较少)

Hash算法的平衡性改进—虚拟节点

目的:使得哈希的结果尽可能分布到所有的缓冲中去。

LRU删除机制详解

  1. 数据过期时,m不会从内存中删除数据,get数据时检查时间戳是否过期,如果过期,客户端就不可见。
  2. 每个slab数据存放在链表上,head最老 tail最新数据,lru机制启动,首先检查失效数据,若没有,就删除最近最少使用的数据。只有在slab不能分配新的page页才会调用lru。

https://blog.csdn.net/huithe/article/details/8006186源码分析(还没看)



转载于:https://www.cnblogs.com/NeverGiveUp0/p/11109119.html


http://www.niftyadmin.cn/n/657512.html

相关文章

2004年中国各省市自治区GDP排名

2004年中国各省市自治区GDP排名(香港澳门台湾除外)名次 名称 GDP总量(RMB) 比上年增长1 广东 16040亿元 14.2%2 山东 15490.7亿元 15.3%3 江苏 超过15000亿元 14%以上4 浙江 11243亿元 14.3%5 河北 8836.9亿元 12.9%6 河南 88…

Jabber 技 术 概 况

Jabber 技 术 概 况Jabber即时通信系统服务整体框架的概述1、Jabber技术概述 本文档包括以下内容: ? Introduction 简介 ? Foundations 基本知识 ? High-Level Server Architecture高阶服务体系 ? Basic Messag…

静态变量(初始化块);实例变量(代码块);构造方法;

我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点&#…

求两个数的最大公约数

方法一 int mgcd(int a, int b) {int t;if(a<b){a ab;b a-b;a a-b;}while(b){t b;b a%b;a t;}return a;}方法二 int mgcd2(int a,int b) { if(b0) return a;return mgcd2(b,a%b); }

更改VS.NET 默认SCM Provider的方法

更改VS.NET 默认SCM Provider的方法 找到HKEY_LOCAL_MACHINE/SOFTWARE/SourceCodeControlProvider/ProviderRegKey键 更改为自定义Provider在注册表中的位置。 比如&#xff0c;从Software/Microsoft/SourceSafe改为SOFTWARE/Perforce/p4可以把SCM Provider从VSS改成Perforce, …

VS2005 Beta2

下载地址: 链接地址&#xff1a;ftp://sSiTe uSEr:beta ONLY BeTA©202.103.218.50:2004/[April.2005].Microsoft.Visual.Studio.2005.Beta2.Team.Suite-SSiTE/

线段树2(P3373)

传送 感谢洛谷题解让我理清了这一撮标记 这里多了一个乘法操作&#xff0c;乘法的优先级高于加法。我们来思考一下有关标记的问题。 首先由两种操作&#xff0c;可以想到要有两个标记&#xff0c;一个标记乘法(mul[k])&#xff0c;一个标记加法(add[k])。 如果这一步是加法&…

(15)打鸡儿教你Vue.js

组件化vue.js 组件单向绑定 组件双向绑定 组件单次绑定 创建组件构造器 注册组件 使用组件 Vue.extend() Vue.component() 使用组件 <div id"app"> <my-component></my-component> </div> <script src"js/vue.js"></scri…