memcache数据库

memcache数据库

Memcached只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统

memcached虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台memcached发生故障,只要集群中有一台memcached可用就不会出现数据丢失,当其他memcached重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务

Memcached借助了操作系统的libevent工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能

Memcached支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的session实现session共享

Memcached存储数据时,Memcached会去申请1MB的内存,把该块内存称为一个slab, 也称为一个page

Memcached支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等

mamcache与redis区别

redis:
  • 支持的数据结构:哈希、列表、集合、有序集合
  • 数据持久化: 有
  • 高可用支持:redis支持集群功能,可以实现主动复制,读写分离。官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入
  • value存储容量: 最大512M
  • 内存分配: 临时申请空间,可能导致碎片
  • 虚拟内存使用:有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上
  • 网络模型:非阻塞IO复用模型,提供一些非KV存储之外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度
  • 水平扩展的支持:redis cluster 可以横向扩展
  • 多线程: Redis6.0之前是只支持单线程
  • 过期策略:有专门线程,清除缓存数据
  • 单机QPS: 约10W
  • 适用场景: 复杂数据结构、有持久化、高可用需求、value存储内容较大
memcached:
  • 支持的数据结构: 纯kev-value
  • 数据持久化: 无
  • 高可用支持: 要二次开发
  • value存储容量: 最大1M
  • 内存分配: 预分配内存池的方式管理内存,能够省去内存分配时间
  • 虚拟内存使用: 所有的数据存储在物理内存里
  • 网络模型: 非阻塞IO复用模型
  • 水平扩展的支持: 无
  • 多线程: Memcached支持多线程,CPU利用方面Memcache优于Redis
  • 过期策略:懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做TTL比较来判断是否过期
  • 单机QPS: 约60W
  • 适用场景: 纯KV,数据量非常大,并发量非常大的业务

mamcache工作机制:

内存分配机制:

为了避免大量内存碎片出现,Memcached采用Slab Allocator机制来分配、管理内存

  • Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk
  • Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费(Chunk最大只能是Page的大小,即一个Page中就一个Chunk)
  • Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存, 那么Memcached会选择下图中Slab Class 2 存储, 因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25

Slab Class定义一个类别,一个类中只有一个Page(1M大小),Page中划分位1个或N个大小一样Chunk,每个Chunk用于存放能放的下数据(一个120B的Chunk就只能存一个120B及以下的数据)

懒过期(Lazy Expiration):

memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。当有新数据存放时,直接覆盖标记的位置即可

LRU:

内存不足时,memcache会使用LRU机制(最近最少使用)来查找可用空间,分配个新数据使用

集群:

Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群

Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点

memcached包

  • memcached
  • memcached-tool
  • memcached.sysv
  • memcached-automove
  • memcached-automove-extstore
  • damemtop
  • start-memcached

memcached

memcached -h

选项:
	-u username memcached运行的用户身份,必须普通用户
	-p 绑定的端口,默认11211
	-m num 最大内存,单位MB,默认64MB
	-c num 最大连接数,缺省1024
	-d 守护进程方式运行
	-f 增长因子Growth Factor,默认1.25倍(Slab Class分类规律)
	-v 详细信息,-vv能看到详细信息
	-M 使用内存直到耗尽,不许LRU
	-U 设置UDP监听端口,0表示禁用UDP

使用memcached

libmemcached:

memcached开发库和工具,与memcached通信的不同语言的连接器。libmemcached提供了C库和命令行工具

安装与使用
yum install -y libmemcached

memping --servers=127.0.0.1		#测试memcache能否连接	
memstat --servers=127.0.0.1		#查看状态

telent端口方式

telent 127.0.0.1 11211

命令行交互

命令 key flags <expiration time> bytes value

命令:
	stats		查看状态
	set 
	add
	replace
	get
	delete
选项:
	key     key用于查找缓存值
	flags	标记,不同的标记,key存放不同信息
	expiration 秒     缓存有效时间,0表示永远
	bytes     key的大小,字节位
	value     存储的值,必须第二行输入值,且字节数必须对应,指定5个字节,值就必须是5个字节,不能多不
例:
#在交互式中设置k=name,v=12345
>set name 1 60 5
 12345
 get name
stats信息:
pid			memcache服务器进程ID		
uptime 		服务器已运行秒数
time 		服务器当前Unix时间戳
version 	memcache版本
libevent		libevent 版本
pointer_size	操作系统指针大小
rusage_user 	进程累计用户时间
rusage_system 		进程累计系统时间
curr_connections 	当前连接数量	
total_connections 		Memcached运行以来连接总数
rejected_connections	被拒绝的连接数
connection_structures 	Memcached分配的连接结构数量
reserved_fds 
cmd_get		自memcache启动以来,get命中次数
cmd_set		自memcache启动以来,执行set命令总数
cmd_flush	自memcache启动以来,执行flush命令总数
cmd_touch	自memcache启动以来,执行touch_all命令总数
get_hits	自memcache启动以来,get命中次数
get_misse	自memcache启动以来,get未命中次数
get_expired		get有效期
get_flushed		
delete_misses	自memcache启动以来,delete未命中次数
delete_hits	自memcache启动以来,delete命中次数
incr_misses	自memcache启动以来,incr未命中次数
incr_hits	自memcache启动以来,incr命中次数
decr_misses	自memcache启动以来,decr未命中次数
decr_hits	自memcache启动以来,decr命中次数
cas_misses	自memcache启动以来,cas未命中次数
cas_hits	自memcache启动以来,cas命中次数
cas_badval		使用擦拭次数
touch_hits	自memcache启动以来,touch命中次数
touch_misses		自memcache启动以来,touch未命中次数
auth_cmds 	
auth_errors	
bytes_read	memcached服务器从网络读取的总的字节数
bytes_written	memcached服务器发送到网络的总的字节数
limit_maxbytes	memcached服务缓存容许使用的最大字节数(分配的内存数)
accepting_conns		目前接受的连接数
listen_disabled_num	
threads			被请求的工做线程的总数量
conn_yields		链接操做主动放弃数目
hash_power_level	
hash_bytes			
hash_is_expanding 	
malloc_fails	
slab_reassign_rescues 0
slab_reassign_chunk_rescues 0
slab_reassign_evictions_nomem 0
slab_reassign_inline_reclaim 0
slab_reassign_busy_items 0
slab_reassign_busy_deletes 0
slab_reassign_running 0
slabs_moved
bytes	存储item字节数(当前存储占用的字节数)
curr_items		item个数(当前存储的数据总数)
total_items	  item总数(启动以来存储的数据总数)
expired_unfetched	
evicted_unfetched	
evictions	LRU释放的对象数目。为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。好比超过缓存大小时根据LRU算法移除的对象,以及过时的对象
reclaimed	已过时的数据条目来存储新数据的数目
crawler_reclaimed 	
lrutail_reflocked 	

memcached-tool

自带连接工具

memcached-tool <host[:port] | /path/to/socket> [mode]

image

代码方式连接

python3
yum -y install python3 python3-memcached

#或者
pip3 install memcached

代码:

#!/usr/bin/python3
#coding:utf-8
import memcache
m = memcache.Client(['127.0.0.1:11211'], debug=True)
for i in range(10):
   m.set("key%d" %i,"v%d" %i)
   ret = m.get('key%d' %i)
   print("%s" %ret)
posted @ 2023-11-27 19:15  suyanhj  阅读(85)  评论(0)    收藏  举报