Memcached 实战

零. 简介

Memcached 是一款开源、 分布式内存对象缓存系统, 用于加快动态网站响应, 降低数据库负载

Memcached 使用简单, 支持多种语言的 API, 解决面对大量数据的缓存问题

一. 设计哲学

(1) 键值对存储

服务器不关心数据是什么样的。 存储单元由 key、 过期时间、 可选的标记和数据组成。 它不懂数据结构, 传输数据前需要序列化。

(2)一半逻辑在客户端, 另一半逻辑在服务端

客户端知道如何选择(哈希)哪个服务端去读/写存储单元, 并且知道如何处理无法连到服务端的情况

服务端知道如何存储和获取数据单元, 并且它知道如何清除或者重用内存。

(3)服务端彼此之间不通信

即服务端之间没有同步、 没有多播、 没有复制。 增加服务器就是增加可用内存。 但是正因为这个特性, Memcached 存在单点故障, 如果需要做高可用, 需要使用 Magent 这样的代理服务软件去实现高可用。

(4)时间复杂度 O(1)

所有的命令都被尽量实现为快速和对锁友好,提供了近乎确定的查询速度。 在慢的机器上查询时间低于 1ms, 在高端服务器上可以达到百万/s 的吞吐量

(5)遗忘是一种特性

Lazy Expiration + LRU :不检测 item 对象是否超时,get 时检查 item 对象是否应该删除;

删除item对象时,不释放内存,作删除标记,指针方式 slot 回收插槽,下次分配的时候直接使用;

(6)缓存无效

客户端通过 hash 直接告诉服务端缓存数据无效, 而不是多播让所有服务器的该 item 缓存无效

二. Memcached 实战

(1) 安装 memcached 很简单, 如果是 CentOS 或者 Red Hat 直接

yum install memcached

如果是 Ubuntu/Debian 则使用 apt-get

(2) 检查 Memcached 是否安装成功:可以查看到帮助信息说明安装成功

memcached -h

(3) 启动 Memcached (假设 138.138.138.11 是你的外网 ip, 在 CentOS7 上设置 11211 默认端口访问不了, 查看也没被占用, 很奇怪, 所以下面监听 11222 端口)

memcached -d -u root -l 138.138.138.11 -p 11222 -vv

-d   以守护程序(daemon)方式运行

-u root  指定用户,如果当前为 root ,需要此参数指定用户

-P /tmp/a.pid 保存PID到指定文件

-m 默认 64,不包含memcached本身占用,单位为 MB

-M   内存不够时禁止 LRU

-n 48  初始 chunk=key+suffix+value+32 结构体,默认 48 字节

-f 1.25  增长因子,默认1.25

-L  启用大内存页,可以降低内存浪费,改进性能

-l  监听的 IP 地址, 服务器有两个网卡一个对内一个对外, 如果设置为 127.0.0.1 则只能本地访问 memcached, 设置外网 ip 则可以接受外来的访问

-p 11211  TCP端口,默认为11211

-U 11211 UDP端口,默认为11211,0为关闭

-c 1024 最大并发连接数,默认1024,最好是200

-t 4  线程数,默认4

-R 20  每个event连接最大并发数,默认20

-C  禁用CAS命令(可以禁止版本计数,减少开销)

-vv 打印交互式详细信息, 可以看到连接进来的人正在做什么操作

(4) 检查 Memcached 是否成功启动:

ps -ef | grep memcached

(5) 远程连接 Memcached: 连接成功显示 Connected to 138.138.138.11. Escape character is ‘^]‘.

telnet 138.138.138.11 11222

(6) 连接成功后输入
stats 可以查看服务整体状态

STAT pid 5013                                            memcache服务器的进程ID

STAT uptime 3524589                                服务器已经运行的秒数

STAT time 1453720323                              服务器当前的unix时间戳

STAT version 1.4.17                                   memcache版本

STAT libevent 2.0.16-stable

STAT pointer_size 64                                 当前操作系统的指针大小(32位系统一般是32bit)

STAT usage_user 20513.015760               进程的累计用户时间

STAT rusage_system 45473.527888         进程的累计系统时间

STAT cur_connections 102                          当前打开着的连接数

STAT total_connections 60437                  从服务器启动以后曾经打开过的连接数

STAT connection_structures 243               服务器分配的连接构造数

STAT reserved_fds 20

STAT cmd_get 474507075                         get命令(获取)总请求次数

STAT cmd_set 334776915                         set命令(保存)总请求次数

STAT cmd_flush 97

STAT cmd_touch 0

STAT get_hits 301883351                          总命中次数

STAT get_misses 172623724                     总未命中次数

STAT delete_misses 208322

STAT delete_hits 35095518

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 268709016022            总读取字节数(请求字节数)

STAT bytes_written 754717253318        总发送字节数(结果字节数)

STAT limit_maxbytes 536870912            分配给memcache的内存大小(字节)

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4                                        当前线程数

STAT conn_yields 17561

STAT hash_power_level 18

STAT hash_bytes 2097152

STAT hash_is_expanding 0

STAT malloc_fails 0

STAT bytes 473920740                            当前服务器存储items占用的字节数

STAT curr_items 265877                          服务器当前存储的items数量

STAT total_items 239409267                   从服务器启动以后存储的items总数量

STAT expired_unfetched 49973876

STAT evicted_unfetched 23514857

STAT evictions 27383392                        为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)

STAT reclaimed 52732799

三. 客户端的选择

客户端有三种选择: spymemcached、 java-memcached、 xmemcached

具体看 https://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html 有性能对比图, 当然因为是 xmemcached 自己的性能测试报告, 不一定和每个人使用的时候场景一样, 具体可以自己测试后再作出选择。

引入 xmemcached-1.3.6.jar 的包

测试代码如下:

package com.wenniuwuren.memcached;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by wenniuwuren on 16/3/6.
 */
public class MemcachedTest {

    public static void main(String[] args) {

        try {
            //New a XMemcachedClient instance
            XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("138.138.138.11:11222"));
            MemcachedClient client = builder.build();
            Map map = new HashMap<>();
            map.put("1", "2");
            client.set("key", 3000, map);

            Map cachedMap = (Map)client.get("key");
            System.out.println(cachedMap.get("1"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四. Memcached 集群

因为 Memcached 设计哲学的极简, 所以集群不熟非常简单, 服务端新启动一个 Memcached 进程就行。 其他的交给客户端完成。 如果客户端使用普通的 Hash 算法,则新增 Memcached 会重新计算 Hash 值使旧的缓存失效。 如果客户端使用一致性 Hash 算法, 则不会影响旧的缓存数据。

新加个端口为 11333 的 Memcached 进程, 可以看到两个 Memcached 存储内容不同, 证明上述 Memcached 服务间不互相通信。

五. Memcached 局限性

(1)存储格式单一, 就是 <String, Object>, 想使用复杂点的数据结构(list、 set、 hash)一般会选用 Redis

(2)最大只能存储 1M 的 item, 而

(3)最大键长 250 字节

(4)只存在缓存, 数据重启丢失,而 Redis 支持持久化(但是也经常会丢数据), 并在此基础上实现主从同步, 而 Memcached 存在单点故障

(5)数据一致性问题: Memcached 使用 CAS 保证。 而 Redis 使用事务, 保证一系列命令的原子性。

时间: 2024-12-13 15:16:35

Memcached 实战的相关文章

高并发之Memcached实战第10课-“Memcached Get获取数据”部分代码分享2

高并发之Memcached实战第10课-"Memcached Get获取数据"部分代码分享2 一.Memcached客户端读写在同一个程序的逻辑: MemcachedClient mcc = new MemcachedClient(list); if(mcc.get("something")==null) { if(!DataFactory.Exist(somethingObject)) { DataFactory.StoreInDB(somethingObject

将同时推出“高并发之Redis初级”“高并发之Redis高级”“高并发之Memcached实战”系列课程

将同时推出"高并发之Redis初级""高并发之Redis高级""高并发之Memcached实战"系列课程,敬请关注,谢谢! "高并发之Redis初级":http://edu.csdn.net/course/detail/482 "高并发之Redis高级":http://edu.csdn.net/course/detail/483 "高并发之Memcached实战": http://edu

Memcached实战之复制----基于repcached的主从

由于 Memcached 自己没有防止单点的措施,因为为了保障 Memcached 服务的高可用,我们需要借助外部的工具来实现高可用的功能.本文引入 Repcached 这个工具,通过使用该工具我们可以完成 Memcached 服务的主从功能. Repcached 它是由日本人开发的,用来实现 Memcached 复制功能的一个工具.它所构建的主从方案是一个单主单从的方案,不支持多主多从.但是,它的特点是,主从两个节点可以互相读写,从而可以达到互相同步的效果. 假设主节点坏掉,从节点会很快侦测到

Memcached实战之单机部署----单实例/多实例

memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.memcached基于一个存储键/值对的hash map.其守护进程(daemon)是用 c 写的,但是客户端可以用任何语言来编写,并通过 memcached 协议与守护进程通信. OK,简单介绍一下,下面开始部署! 环境: CentOS 6.5 x86_64位 采用最小化安装,系统经过了基本优化 selinux 为关

服务器后端开发系列——《实战Memcached内存缓存系统》

1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient 内容:以Memcached的Java Spy API为例,讲述基本的客户端使用. 3.实战Memcached缓存系统(3)Memcached配置参数初解 内容:提供Memcached配置的初步解读. 4.实战Memcached缓存系统(4)Memcached

java高级软件架构师实战视频教程 Spring+Mybatis+SpringMVC+Ehcache+Memcached+Redis+Nginx+Varnish+ActiveMQ+Keepalived+MySQL+MongoDB

java高级软件架构师实战阶段1视频教程 迅雷下载  百度云 第001节:整体课程概览第002节:分模块.分工程管理第003节:多模块多Web应用合并War包第004节:Git基本原理和安装配置使用第005节:TortoiseGit的本地使用第006节:Egit的本地使用第007节:远程使用以及冲突解决第008节:基本业务功能和数据字典第009节:搭建基础的开发环境第010节:Spring+Mybatis实现DAO第011节:Mybatis的分页实现第012节:Service的实现以及模块化第0

实战项目memcached+tomcat+session+nginx在工作中的应用和配置

环境介绍:公司根据实际需要搭建一个购物网站,当用户购物时可以 将不同商品,放到同一个购物车中进行同时付款. 环境的搭建: 外网用户  IP地址:1.1.1.1  主机名:fanxiaohui  用户访问网站http://www.taobao.com 使用nginx实现负载均衡,由于网页是用JAVA开发的所以选用tomcat搭建网站服务,由于用户在购物时http是一个无状态的协议,不同的商品都是一个新的连接,默认不会把几个商品放到同一个购物车中,无法进行统一结账,为了能使服务器能够认识是同一个客户

高性能缓存Memcached服务深度原理及实战

http://edu.51cto.com/course/course_id-3548.html 深度掌握核心运维及DBA技术,成就自己的IT人生! 本课程适合人群:开发领域.运维领域.DBA领域 ================课程列表======================== 01-Memcached是什么.mp402-Memcached的作用.mp403-互联网常见缓存软件对比说明.mp404-老男孩老师的发展过程及运维思想.mp405-Memcached在网站架构中读写的工作原理流程

二、NOSQL之Memcached缓存服务实战精讲第一部

1.Memcached是一套数据缓存系统或软件. 用于在动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升网站系统性能的目的:Memcached在企业应用场景中一般是用来作为数据库的cache服务使用:(但不是专门干这个,还可以干别的,主要是干这个,知道就好) 1)linux有特性,系统内存没有用完,利用这些内存就会缓存起来,所以剩余的内存为881 2)cache读缓存,磁盘数据读到缓存中:buffers写缓存,将数据写到缓存中,等到一定量的时候就写入磁盘中. 3)buffers同步