memcache安装与详解

memcache是一款老牌的内存缓存技术,支持多种框架,提供快速的数据访问。本文详细介绍了memcache的安装过程、启动方法以及一系列命令操作,如set、add、replace、append、prepend、CAS等,帮助读者全面掌握memcache的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcache:

介绍

最新版本v1.5.16

老牌的内存缓存技术,对相关领域支持比较丰富,window和linux都可以使用,各种框架(tp/yii等等)都支持使用,session的信息可以非常方便的保存到该memcache中,每个key保存的数据量最大为1M,支持的数据类型比较单一,就是String类型,数据存放在内存中,不支持持久化

它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度, MemCaChe是一个存储键值对的HashMap

存储一般的K-V键值对, 基于LruCache做缓存

redis:支持比较多的数据类型(String/list/set/sortset/hash),redis支持集合计算的(set类型支持),每个key最大数据存储量为1G

它是由什么组成的?
客户端软件,提供可用的memcached服务器列表。
基于客户端的散列算法,根据“密钥”选择服务器。查询成本几乎为O(1)
服务器软件,将值及其密钥存储到内部哈希表中。
LRU,确定何时丢弃旧数据(如果内存不足),或重用内存。

失效超时机制

超过有效期:具体是通过“懒惰”机制删除该过期数据,与过期session的删除类似。

过期session删除机制:session是以文件形式保存的硬盘中,如果有的session文件已经过期了,则该session文件不会立即被删除,而是后期其他用户访问网站使用session的同时会有一定的几率触发删除过期的session文件。也就是被访问的时候删除, 另外因为内存大小有限lru也会让一部分缓存失效

memcache的过期数据删除也是懒惰机制实现,如果有一个key过期了,其本身不会马上被删除,而是我们调用get方法获取数据的同时会删除该过期的数据

缓存空间耗尽

如果存储的数据超过memcache最大的存储限制(默认是64M),此时还继续存入数据,则会把最近不常使用的key就删除了。该机制名称为LRU(least recently use)优先删除最近很好使用的key

采用一致性哈希,一致性哈希是一种模型,它允许在添加或删除服务器时更稳定地分发密钥

压缩大值是一种很好的方式来获得更多的内存降压。压缩可以为某些值节省大量内存,并且还可以减少延迟,因为较小的值可以更快地通过网络获取, 但会带来一定的性能损失,小型网站可以不用压缩数据

协议简单
· 基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能
· 内置内存存储方式
· memcached不互相通信的分布式
协议
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
因此,通过telnet也能在memcached上保存数据、取得数据


安装:
yum install memcached

编译安装

wget http://memcached.org/latest                    下载最新版本

tar -zxvf memcached-1.x.x.tar.gz                    解压源码

cd memcached-1.x.x                                  进入目录

./configure --prefix=/usr/local/memcached           配置

make && make test                                   编译

make install                                   安装

启动

如果是root启动则需要加上-u root

/usr/local/memcached/bin/memcached -d -m 512 -l 127.0.0.1 -p 10000 -u root

否则会报错:

# /usr/local/memcached/bin/memcached -p 11211
can't run as root without the -u switch

注册为系统服务:
添加用户

useradd -d /run/memcached memcached

也可以直接在文件中添加
添加用户组

# vi /etc/group

memcached:x:797:

添加用户

# vi /etc/passwd

memcached:x:796:797:Memcached daemon:/run/memcached:/sbin/nologin

添加配置文件:

/usr/local/memcached/memcached.conf

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="4096"
OPTIONS=""

添加系统服务文件

 vi /usr/lib/systemd/system/memcached.service

[Unit]
Description=Memcached 
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/usr/local/memcached/memcached.conf
ExecStart=/usr/local/memcached/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target

启动:

systemctl daemon-reload 
systemctl enable memcached.service 
systemctl start memcached.service 
systemctl status memcached.service 
● memcached.service - Memcached
   Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-07-04 16:01:31 CST; 2s ago
 Main PID: 10926 (memcached)
   CGroup: /system.slice/memcached.service
           └─10926 /usr/local/memcached/bin/memcached -u memcached -p 11211 -m 4096 -c 1024

Jul 04 16:01:31 cnsz92vl05340 systemd[1]: Started Memcached.
Jul 04 16:01:31 cnsz92vl05340 systemd[1]: Starting Memcached...

telnet 连接测试 quit退出连接

# telnet 192.168.1.2 11211
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'.

ERROR
set test 0 0 2
bar
CLIENT_ERROR bad data chunk
ERROR
set test 0 0 3
bar
STORED

quit

命令

set命令

set key flags exptime bytes [noreply] 
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

set m1 0 100 4
test
STORED
get m1
VALUE m1 0 4
test
END

注意bytes需要指定value的长度, 如果不精确指定,则无法存储, 需要等待足够的值输入才能被存储, 例如:

set m1 0 100 32
this is a test one for 32
ok it
STORED

输入一段后,长度不够,补齐后存储成功

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

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

add key flags exptime bytes [noreply]
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

add m1 0 100 4
trxx
NOT_STORED
add m2 0 100 3
new
STORED

Memcached replace 命令

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

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

replace key flags exptime bytes [noreply]
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

replace m2 0 100 4
new1
STORED
get m2
VALUE m2 0 4
new1
END

Memcached append 命令

append key flags exptime bytes [noreply]
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

add m2 0 100 3
new
STORED
append m2 0 100 5
_new2
STORED
get m2
VALUE m2 0 8
new_new2
END

Memcached prepend 命令

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

prepend key flags exptime bytes [noreply]
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

VALUE m2 0 9
init_add1
END
prepend m2 0 900 4
pre_
STORED
get m2
VALUE m2 0 13
pre_init_add1
END

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

cas key flags exptime bytes unique_cas_token [noreply]
value

key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
unique_cas_token通过 gets 命令获取的一个唯一的64位值。
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)

set tp 0 900 9
memcached
STORED
cas tp 0 900 5 1
redis
EXISTS

查询命令:

Memcached get 命令

获取单个:
get key

获取多个get key1 key2 key3

get m1 m2
VALUE m2 0 13
pre_init_add1
END

注:m1已经过期

Memcached gets 命令

gets key

获取多个:
gets key1 key2 key3

gets m1 m2
VALUE m2 0 13 12
pre_init_add1
END

Memcached delete 命令

delete key [noreply]
delete  m1
NOT_FOUND
delete m2
DELETED

Memcached incr 与 decr 命令

incr key increment_value
set m3 0 900 1
8
STORED
incr m3 2
10
get m3
VALUE m3 0 2
10
END

decr 命令

decr key decrement_value
get m3
VALUE m3 0 2
10
END
decr m3 3
7

Memcached stats 命令

一些参数说明:
pid: memcache服务器进程ID
uptime:服务器已运行秒数
time:服务器当前Unix时间戳
version:memcache版本
pointer_size:操作系统指针大小
rusage_user:进程累计用户时间
rusage_system:进程累计系统时间
curr_connections:当前连接数量
total_connections:Memcached运行以来连接总数
cmd_get:get命令请求次数
cmd_set:set命令请求次数
get_hits:get命令命中次数
get_misses:get命令未命中次数
delete_misses:delete命令未命中次数
delete_hits:delete命令命中次数
cas_badval:使用擦拭次数
limit_maxbytes:分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
threads:当前线程数
bytes:当前存储占用的字节数
curr_items:当前存储的数据总数
total_items:启动以来存储的数据总数
evictions:LRU释放的对象数目
reclaimed:已过期的数据条目来存储新数据的数目

Memcached stats items 命令

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

stats items

TAT items:1:number 2
STAT items:1:number_hot 0
STAT items:1:number_warm 0
STAT items:1:number_cold 2
STAT items:1:age_hot 0
STAT items:1:age_warm 0
STAT items:1:age 6032
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 2
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:evicted_active 0
STAT items:1:crawler_reclaimed 3
STAT items:1:crawler_items_checked 34
STAT items:1:lrutail_reflocked 0
STAT items:1:moves_to_cold 19
STAT items:1:moves_to_warm 5
STAT items:1:moves_within_lru 0
STAT items:1:direct_reclaims 0
STAT items:1:hits_to_hot 0
STAT items:1:hits_to_warm 0
STAT items:1:hits_to_cold 16
STAT items:1:hits_to_temp 0

Memcached stats slabs 命令

stats slabs

STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 2
STAT 1:free_chunks 10920
STAT 1:free_chunks_end 0
STAT 1:mem_requested 131
STAT 1:get_hits 16
STAT 1:cmd_set 24
STAT 1:delete_hits 2
STAT 1:incr_hits 7
STAT 1:decr_hits 1
STAT 1:cas_hits 0
STAT 1:cas_badval 2
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048576

Memcached stats sizes 命令

Memcached stats sizes 命令用于显示所有item的大小和个数。
该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

stats sizes

Memcached flush_all 命令
Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。

flush_all [time] [noreply]
set m4 0 900 3
new
STORED
flush_all 
OK
get m4
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值