Memcached入门

Memcached是一个自由开源的、高性能、分布式内存对象缓存系统。

是一种基于内存的key-value存储,用来存储小块的任意数据。一般的使用目的是,通过缓存数据库查询结果,减少数据库负载,以提高web应用的响应速度,提供扩展性。


memcached作用

memcached特点:1、协议简单2、基于libenent的事件、3、内置内存存储方式、4、memcached不互相通信的分布式Memcached servers are unaware of each other. There is no crosstalk, no syncronization, no broadcasting, no replication. Adding servers increases the available memory. Cache invalidation is simplified, as clients delete or overwrite data on the server which owns it directly.

一,安装

a、下载安装包windows可下载最新版,

32位系统 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin.zip

32位系统 1.2.6版本:http://static.runoob.com/download/memcached-1.2.6-win32-bin.zip

32位系统 1.4.4版本:http://static.runoob.com/download/memcached-win32-1.4.4-14.zip

64位系统 1.4.4版本:http://static.runoob.com/download/memcached-win64-1.4.4-14.zip

32位系统 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-x86.zip

64位系统 1.4.5版本:http://static.runoob.com/download/memcached-1.4.5-amd64.zip

b、下载后解压到目录下

1.4.5之前版本,可加入windows服务,进入到解压目录:memcached.exe -d install

启动:c:\memcached\memcached.exe -d start

停止:c:\memcached\memcached.exe -d stop

1.4.5后版本,不支持自动加入windows服务,可通过计划任务运行schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

删除任务:schtasks /delete /tn memcached

c、memcached 服务端默认监听TCP和UDP端口,11211   -l指定监听ip,-p指定端口

服务端启动命令:memcached.exe -m 512 -p 11211

d、客户端链接方式:通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

运行:telnet 127.0.0.1 11211

运行:stats查看是否启动,


stats命令

二、memcached命令

1、set 命令用于将 value(数据值) 存储在指定的 key(键) 中。

set key flags expiretime bytes

value

参数说明如下:

key:键值 key-value 结构中的 key,用于查找缓存值。

flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。

exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)

bytes:在缓存中存储的字节数

noreply(可选): 该参数告知服务器不需要返回数据

value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

bytes的字节数和value要一致

2、add 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

add key flags exptime bytes [noreply]

value

3、 replace 命令用于替换已存在的 key(键) 的 value(数据值)

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

replace key flags exptime bytes [noreply]

value

4、append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据

append key flags exptime bytes [noreply]

value

5、prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。

prepend key flags exptime bytes [noreply]value

6、CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

cas key flags exptime bytes unique_cas_token [noreply]

value

7、 get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

get key[ key1 key2]

8、gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。 使用 gets 命令的输出结果中,在最后一列的数字 1 代表了 key 为 runoob 的 CAS 令牌。

gets key1 key2 key3

9、 delete 命令用于删除已存在的 key(键)。

delete key [noreply]

10、incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR

incr/decr key number

11、stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

12、stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

13、 stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。

14、stats sizes 命令用于显示所有item的大小和个数。

该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

15、 flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对。该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。

flush_all [time] [noreply]

三、使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。本站 jar 包下载地址:spymemcached-2.10.3.jar


public class MemcachedJava { public static void main(String[] args) {

      try{        // 连接本地的 Memcached 服务        MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));

        System.out.println("Connection to server sucessful.");


        // 存储数据        Future fo = mcc.set("runoob", 900, "Free Education");


        // 查看存储状态        System.out.println("set status:" + fo.get());


        // 输出值        System.out.println("runoob value in cache - " + mcc.get("runoob"));

        // 关闭连接        mcc.shutdown();


      }catch(Exception ex){        System.out.println( ex.getMessage() );

      }  }}

内存管理机制

emcached会预先分配内存,

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,ltem根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且减少内存碎片的产生,但这种方式也会带来一定程度上的空间浪费

memcache与redis区别

1)redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储

2)内存使用使用效率对比

使用简单的key-value存储的话,memcached的内存利用率会更高一点,如果redis采用hash结构来做key-value存储,由于其组合式的压缩,内存的利用率更高。

3)性能对比:由于redis只使用单核,而memcached使用多核,所以平均在每一个核上redis在存储小数据时比memcached性能更高,而在100Ks=以上的时候memcached性能要高于redis

4)内存管理机制的不同

在redis中,并不是所有的数据都一一直存储在内存中的,这是和memcached相比最大的一个区别

Redis只会缓存所有的key端的信息,如果redis发现内存的使用量超过某一个值,将触发swap的操作,redis根据相应的表达式计算出那些key对应value需要swap到磁盘,然后再将这些这些key对应的value持久化到磁盘中,同时再内存清除。同时由于redis将内存中的数据swap到磁盘的时候,提供服务的主线程和进行swap操作的子进程会共享这部分内存,所以如果更新需要swap的数据,redis将阻塞这个操作,直到子线程完成swap操作后才可以进行修改

5)数据持久化的支持

虽然redis是基于内存的存储系统,但是他本身是支持内存数据的持久化,而且主要提供两种主要的持久化策略,RDB快照和AOF日志,而memcached是不支持数据持久化的操作的。

RDB持久化通过保存了数据库的健值对来记录数据库状态的不同,AOF持久化是通过保存reds服务器所执行的命令来保存记录数据库的状态的,

RDB持久化保存数据库状态的方法是将msg,fruits,numbers三个健的健值对保存到RDB文件中,而AOF持久化保存数据库的状态则是将服务器执行的SET,SADD,RPUSH三个命令保存到AOF文件中的,

RDB快照

redis支持将当前的数据快照存放成一个数据文件的持久化机制,即RDB快照,但是一个持续写入的数据库是如何生成快照的,

在生成快照的时候,将当前的进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成RDB文件。我们可以通过redis的slave指令来配置RDB快照生成的时机。RDB文件不会坏掉,因为其写操作是在一个新进程中进行的,当生成一个新的RDB文件时redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件。

AOF持久化的实现

OF持久化的实现可以分为命令追击(append),文件写入,文件同步(sync)

1)命令追加

当AOF持久化功能打开的时候,服务器在执行完一个写命令的时候,会以协议的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾

2)AOF文件的写入与同步

服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以服务器在每次结束一个事件循环之前,它都会调用flushAppendonlyFIle函数考虑是否需要将将缓冲区的内容写入和保存到AOF文件里面。如果函数被调用,并且距离上次同步AOF文件已经超过了一秒钟,那么服务器会先将aof_buf中的内容写入到AOF文件中,然后再对AOF文件进行同步

3)文件的载入与数据还原

4)AOF重写

AOF持久化保存的命令越来越多,文件里的内容也月来越多,会对计算机造成影响。为了解决AOF文件体积膨胀问题,REDIS提供了AOF重写功能。Redis服务器可以创建一个新的AOF文件,新旧两个AOF文件保存的数据状态相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新的AOF会比旧的体积要小

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容