什么是memcached
memcached是一个高性能的分布式内存对象缓存系统。Memcached是通过在内存中维护一个个统一的巨大hash表,memcached能存储各式各样的数据,包括图像,视频,文件及数据库检索结果等,由于是在内存中所以读取速度非常快。
特征
- 协议简单
memcache为文本行协议,使用telnet就可以连接memcache服务器进行数据读取。 - 基于libevent时间处理
libevent是一个C语言开发的程序库,它整合了BSD系统的kqueue和Linux的epoll的事件处理功能,提供了一个事件处理的接口,为memcache实现异步处理。 - 内置的内存管理
它没有使用传统的内存管理(malloc分配free回收),它自身实现了内存管理的机制,它把内存按照规定划分成多个内存块(每个块的大小可以修改的哦),把大小相同的内存块分成一个组,并且维护着一张空闲内存块的表。 - 分布式
缓存数据删除
- 首先memchacne服务器自己不会定期去检查key/value的有效期,只有在查询这个key的时候才去检查是否过期,过期则释放内存块。
- 如果缓存空间满了,将采用LRU(最近最少使用算法)将那些最近不常使用的key/value剔除掉。如果不想用也可以关闭(-M 参数),但是会抛出异常。
分布式键值分配算法
常用的分配算法有两种:
- 根据键和memcache服务器的数量取余(键%服务器数量),这种方式效率比较高,但是如果新增或删除一台服务器所有缓存失效。
- 根据散列值
1、将每台memcahche服务器的散列值计算出来;
2、将每台机器按照散列值顺时针分布到0到2的32次方的一个环上;
3、计算每个键的散列值,按照顺时间放在临近的节点上。
优点:增减服务器丢失缓存数据较小。
缺点:key/value分配不均。
如何实现分布式
在多台机器上安装memcached服务,数据随机分布到每台机器,应用服务在获取数据时需要从一个包含这些机器的对象中获取。
Linux安装Memcahed
yum install memcached
[root@localhost ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0"
- 命令行启动参数:
-d:是否后台运行;
-m:指定占用的内存大小;
-p:指定端口号,默认11211;
-l:指定监听在本机的哪些IP,127.0.0.1
表示只允许使用本机访问,0.0.0.0
表示任何主机都能访问。
memcached服务无认证机制,只能通过防火墙限制哪些IP能够访问缓存服务。
[root@localhost ~]# vim /usr/lib/systemd/system/memcached.service
[root@localhost ~]# systemctl start memcached.service
[root@localhost ~]# systemctl enable memcached.service
Telnet操作memcached
telnet IP地址 端口号[11211]
- 添加数据
- set:
格式:
set 键值 flas(是否压缩) 超时时间 值字符长度
示例:
set username 0 1200 8
chenyang
- add(如果已存在要添加的key将报错):
格式:
add 键值 flas(是否压缩) 超时时间 值字符长度
示例:
add username 0 1200 8
chenyang
- 获取数据
get username
- 删除数据
delete username
- 查看memcached的状态
通过python操作memcached
- 安装python-memcached包;
- 建立连接
import memcache
# 分布式连接方式
mc = memcache.Client(['192.168.1.1:11211','192.168.1.2:11211'],debug=True)
- 设置数据
# 添加单笔数据
mc.set('usernmae','chenyang',time=60*5)
# 添加多笔数据
mc.set({'username':'chenyang','age':'30'},time=300)
- 获取数据
mc.get('username')
- 删除数据
mc.delete('username')
- 自增长(操作整数):
mc.incr('age')
- 自减少(操作整数):
mc.decr('age')