安装配置Memcache


Memcache

10249

1.介绍

Memcache 是一个高性能,分布式内存对象缓存系统.

它的存储形式是基于内存的key-value 的形式,用来存储小块的任意数据(字符串,对象等).这些数据可以被数据库调用,API 调用,或者是页面渲染.一般使用的目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web 应用响应的速度,提高可扩展性.

2.安装

根据官网推荐的方式安装.

# 安装依赖
$ yum install -y libevent libevent-dev 
$ yum install -y perl-Test-Simple

$ wget http://memcached.org/latest
$ tar -zxvf memcached-1.5.20.tar.gz
$ cd memcached-1.5.20
$ ./configure --prefix=/usr/local/memcached    配置安装目录
$ make
$ make test  
$ sudo make install
  • 如果make test 报错,是因为没有安装Perl-Test-Simple 模块.需要主动安装.参照.

memcache 命令添加到系统环境中.

$ vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/var/mysql/bin:/usr/local/memcached/bin/
export PATH

$ source ~/.bash_profile

使用docker安装,如果你使用的是1panel面板,可以直接在面板中安装.

查看memcache 命令帮助

[root@localhost ~]# memcached -h
memcached 1.5.20
-d  启动一个守护进程,不会阻塞主进程.
-m 分配给Memcache使用的内存数量,单位是 MB
-u  运行Memcache的用户
-l  监听的服务器IP地址,可以指定多个
-p 指定监听的端口,默认是11211
-c 最大运行的并发连接数,默认是 1024
-P  设置保存Memcache的PID文件.
-v  打印错误和警报
-vv  非常冗长,打印错误和警报,同时打印客户端命令和响应.
-vvv  非常冗长,除了以上,还会打印出服务器内部状态的转换.

运行服务:

  • 作为前台进程运行(不是守护进程)
$  memcached -u root -l 192.168.0.101 -p 11211 -m 64
  • 作为守护进程运行
$ memcached -u root -l 192.168.0.101 -p 11211 -m 64 -d 

关闭服务:直接kill 进程即可

[root@localhost ~]# memcached -u root -l 192.168.0.101 -p 11211 -m 64 -d 
[root@localhost ~]# ps aux | grep memcached
root      54058  0.0  0.0 413832  1076 ?     memcached -u root -l 192.168.0.101 -p 11211 -m 64 -d

[root@localhost ~]# kill -9 54058

3.Memcache 连接

可以通过Telnet 的方式来连接到Memcache 服务器.

$ telnet HOST PORT
$ telnet 192.168.0.101 11211

4.存储命令

1.Memcache set 命令

set 命令用于将value 存储在指定的key 中.如果key 已经存在,则会更新该key 的数据.

语法:

set key flags exptime bytes [noreply]
value
  • set 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.0表示不需要压缩.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数,指定的数目必须和value 的字节数相同.
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value .

实例:

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.

set name 0 900 9    
memcached
STORED

get name
VALUE name 0 9
memcached
END

set dsfsdf
ERROR

quit
Connection closed by foreign host.

在以上的输出中

  • STORED:保存成功后输出.
  • ERROR:在保存失败后输出.

2.Memcache add 命令

add 命令用于将value 存储在指定的key 中.如果key 已经存在,则不会更新数据并返回NOT_STORED状态.(过期的key 会更新数据.).

语法:

add  key  flags exptime bytes [noreply]
value
  • add 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数.指定的数目必须和value 的字节数相同.
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value .

实例:

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.

add new_key 0 900 10
date_value
STORED

get new_key
VALUE new_key 0 10
date_value
END

add new_key 0 900 10
test_value
NOT_STORED
quit
Connection closed by foreign host.

3.Memcached replace命令

replace 命令用于替换已经存在的keyvalue .如果key 不存在,则替换失败,并返回NOT_STORED .

语法:

replace key flags exptime bytes [noreply]
value 
  • replace 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数.指定的数目必须和value 的字节数相同.
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value .

实例:

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.
add mykey 0 900 10 
date_value
STORED
get mykey
VALUE mykey 0 10
date_value
END
replace mykey 0 900 16
some_other_value
STORED
get mykey
VALUE mykey 0 16
some_other_value
END
repalce no_key 0 900 10
ERROR
quit
Connection closed by foreign host.

4.Memcache append

append 用于对已经存在的keyvalue 后面追加数据.

语法:

append key flags exptime bytes [noreply]
value 
  • append 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数.指定的数目必须和value 的字节数相同.
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value .

实例:

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.
set name 0 900 9
memcached
STORED
get name
VALUE name 0 9
memcached
END
append name 0 900 5
radis
STORED
get name
VALUE name 0 14
memcachedradis
END
quit
Connection closed by foreign host.

它相当的于对存在的value 追加了一段数据.

5.Memcache prepend

prepend 用于对已经存在的keyvalue 前面追加数据

语法

prepend key flags exptime bytes [noreply]
value 
  • prepend 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数.指定的数目必须和value 的字节数相同.
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value .

实例:

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.
set name 0 900 9
memcached
STORED
get name
VALUE name 0 9
memcached
END
prepend name 0 900 5
radis
STORED
get name
VALUE name 0 14
radismemcached
END
quit
Connection closed by foreign host.

6.Memcached cas

cas(check-and-set\compare-and-swap) :用于执行一个检查并设置的操作,它仅仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下,才能写入.

检查是cas_token 参数进行的,这个参数是Memcache指定给已经存在的元素的一个唯一的64 位值.

语法:

cas key flags exptime bytes unique_cas_token [noreply]
value
  • cas 关键字
  • flags:可以包括键值对的整数类型,客户机使用它存储关于键值对的额外信息.
  • exptime:过期时间(以秒为单位,o 表示永远)
  • bytes:在缓存中存储的字节数.指定的数目必须和value 的字节数相同.
  • unique_cas_token:通过gets 命令获取的一个唯一的值
  • noreplay:可选,该参数告知服务器不需要返回数据.
  • value :存储数据,始终位于第二行,key-value 中的value

实例:

  1. 如果没有unique_cas_token ,则cas 命令执行错误.
  2. 如果key 不存在,执行失败.
  3. 添加键值对
  4. 通过gets 获取token
  5. 使用cas 更新数据
  6. 使用get 查看数据
❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.
cas tp 0 900 9
ERROR         # 没有token 报错

cas tp 0 9000 9 2
memcached
NOT_FOUND  # key 不存在报错

# 生成一个tp
set tp 0 900 9 
memcached
STORED

get tp
VALUE tp 0 9
memcached
END

# 获取token==> 10
gets tp 
VALUE tp 0 9 10
memcached
END

# 更新tp

cas tp 0 900 5 10
radis
STORED

get tp
VALUE tp 0 5
radis
END
quit
Connection closed by foreign host.

7.比较

add/set/replace 使用的场合不同

方法key 存在key 不存在
set替换创建
add报错创建
replace替换报错
appendvalue后方追加数据报错
prependvalue前方追加数据报错

set 相当于addreplace 的集合体.

5.查找命令

1.Memcache get

get 用于获取key 中的value,如果key 不存在,返回为空.

语法:

get key
/*多个值之间用空格隔开 */
get key1,key2,key3

2.Memcache gets

gets 用户获取cas 令牌中的value ,如果key 不存在,返回为空.

语法:

gets key
/*多个值之间用空格隔开 */
gets key1,key2,key3

3.Memcache delete

delete 用于删除已经存在的key' .

语法:

delete key [noreply]

4.Memcache incr/decr

incr/decr 用于对已经存在的key 的数字值进行自增/自减操作.它操作的数据必须是十进制的32位无符号整数.

如果key 不存在返回NOT_FOUND ,如果key 不是数字,返回CLIENT_ERROR,其他错误返回ERROR.

语法:

incr/decr key increment_value
  • incr 增加.decr 减少.
  • increment_value :增加的数值.

6.统计命令

1.Memcache stats

返回统计信息,如PID ,版本号,连接数等.

❯ telnet 192.168.0.101 11211
Trying 192.168.0.101...
Connected to 192.168.0.101.
Escape character is '^]'.
stats

包括以下信息

pidmemcache服务器进程ID
uptime服务器已运行秒数
time服务器当前Unix时间戳
versionmemcache版本
pointer_size操作系统指针大小
rusage_user进程累计用户时间
rusage_system进程累计系统时间
curr_connections当前连接数量
total_connectionsMemcached运行以来连接总数
connection_structuresMemcached分配的连接结构数量
cmd_getget命令请求次数
cmd_setset命令请求次数
cmd_flushflush命令请求次数
get_hitsget命令命中次数
get_missesget命令未命中次数
delete_missesdelete命令未命中次数
delete_hitsdelete命令命中次数
incr_missesincr命令未命中次数
incr_hitsincr命令命中次数
decr_missesdecr命令未命中次数
decr_hitsdecr命令命中次数
cas_missescas命令未命中次数
cas_hitscas命令命中次数
cas_badval使用擦拭次数
auth_cmds认证命令处理的次数
auth_errors认证失败数目
bytes_read读取总字节数
bytes_written发送总字节数
limit_maxbytes分配的内存总大小(字节)
accepting_conns服务器是否达到过最大连接(0/1)
listen_disabled_num失效的监听数
threads当前线程数
conn_yields连接操作主动放弃数目
bytes当前存储占用的字节数
curr_items当前存储的数据总数
total_items启动以来存储的数据总数
evictionsLRU释放的对象数目
reclaimed已过期的数据条目来存储新数据的数目

2.其他命令

stats items显示各个slabitem数目和存储时长
stats slabs显示各个slab 的信息
stats sizes显示所有item 的大小和个数
flush_all time清理所有的键值对,time 指定延迟时间.

3.查找所有的key

telnet 127.0.0.1 11211

stats items  # 显示出所有的key , 1 是id值
STAT items:1:number 1 

# 通过id获取key
stats cachedump 1 0  # id 为1, 0表示列出所有的内容

# 通过上述命令获取到key
get key

文章作者: 文彦
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 文彦 !
评论
  目录