目录
学习memcache前言
这篇文章是写给自己的,用于记录memocache的学习过程,里面写的东西可能不完善,也不全,甚至会有很多错误,如果有人看见的话,非常欢迎指正
一、memcache是什么?
memcache是一种存在内存里的nosql数据库,是一个自由开源的,高性能,分布式内存对象缓存系统(其实只要是存在性能的数据库,性能就不会低)。
memcache是一个简单的key-value形式的数据库,开发简洁。但是有些问题,比如不能永久化存储,支持的类型只有简单的类型,也就是string,如果要存数组需要序列化后再存,比如json
二、memcache特征
- 协议简单,使用简单的基于文本行的协议
- 基于libevent事件处理,灵活调整服务器连接数
- 存在内存里面,存取速度非常快
- 不互相通信,每个服务器只对自己的数据进行管理,也就是他自己无法组建集群
- 缺乏认证和安全管制,也就是没有账号密码
- 不支持数据持久化,需要自己实现
三、memcache内存管理方式
使用slab Allocation 方式存储。
Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
slab由page组成,page又由chunk组成。
简单的来说,就是像仓库货架一样,大的货物和大货物放在一起,小货物和小货物放在一起,但是他们都是一个个货架码好了,编好号了放在一个大仓库里。
page大小可以设定,默认是1Mb,可以在启动时通过-I参数来指定。
但是这里有个问题,这里很容易造成内存浪费,比如进来一个300byte大小的数据,会放在1024byte的数据chunk里面,这样空间就被浪费了。
为此,memcache就会使用一个LRU算法(最近最少使用算法)来清除那些废弃数据。熟悉mysql的innodb的人可能更熟悉这个算法。在此不再累述。
四,安装
本人用的是php环境,所以代码是基于php的
Ubuntu下安装
sudo apt install memcache
sudo apt install php-memcached
sudo service php7.4-fpm restart
memcache 后面加d是升级版,旧版php不支持,不过现在谁还用旧版php
连接memcache的方法是
telnet 127.0.0.1 11211
五、memcache基本命令
- flags 就是是否使用压缩
- exptime 过期时间
- bytes 是指定数据大小,主要是前面说的选slab的时候,不同大小的chunk组成的page在不同的slab里面
六、memcache集群
①余数计算
- 取余计算有个问题,一旦其中一台服务器崩掉,会造成下一台服务器超负荷运行,最终全都崩掉。
- 一旦移除或者添加服务器,要重建所有缓存
②一致性hash算法
七、session存到memcache里面
修改php的ini文件
session.save_handle = “memcache”
session.save_path = “192.168.1.104:11211” 或者 127.0.0.1:11211 或者对应的memcache服务器
这样既可以了