-Memcache缓存服务

Memcache缓存服务

hades 61天前 143

什么是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]

  1. 添加数据
  • set:
    格式:
    set 键值 flas(是否压缩) 超时时间 值字符长度
    示例:
set username 0 1200 8
chenyang
  • add(如果已存在要添加的key将报错):
    格式:
    add 键值 flas(是否压缩) 超时时间 值字符长度
    示例:
add username 0 1200 8
chenyang
  1. 获取数据
  • get:
    格式:
    get 键值
    示例:
get username
  1. 删除数据
  • delete:
    格式:
    delete 键值
    示例:
delete username
  • flush_all:
    这个命令比较霸道,清空缓存。
  1. 查看memcached的状态
  • stats:
    格式:
    stats

通过python操作memcached

  1. 安装python-memcached包;
  2. 建立连接
import memcache
# 分布式连接方式
mc = memcache.Client(['192.168.1.1:11211','192.168.1.2:11211'],debug=True)
  1. 设置数据
# 添加单笔数据
mc.set('usernmae','chenyang',time=60*5)
# 添加多笔数据
mc.set({'username':'chenyang','age':'30'},time=300)
  1. 获取数据
mc.get('username')
  1. 删除数据
mc.delete('username')
  1. 自增长(操作整数):
mc.incr('age')
  1. 自减少(操作整数):
mc.decr('age')
最新回复 (0)
返回
发新帖
0