Memcached使用总结以及注意事项

目录

memcached所有命令在内部都是原子的!

数据结构的序列化

减少键大小

如何列出所有键?

压缩

为什么key过期时curr_items不会减少?

相较于MySQL查询缓存

Noreply/Quiet | 不回复/安静

散列

一致的散列

连接限制

Memcached服务分布式集群

Memcached特点及工作原理

memcache内存管理

没有身份认证机制!

memcached对item的过期时间限制


memcached所有命令在内部都是原子的!

数据结构的序列化

通过set / add / etc命令传递时,大多数客户端都能够接受复杂的数据结构。它们被序列化(通常通过某种形式的本机系统),设置特殊标志,然后存储数据。

客户不能存储所有类型的复杂结构。对象通常是不可序列化的,例如从mysql查询返回的行对象。必须先将数据转换为纯数组或哈希/表类型结构,然后才能存储或检索它。

由于在存储项目时会使用项目标志,因此同一客户端能够在“ get”返回值之前知道是否反序列化值。所以代码端

减少键大小

键越小,内存开销就越少。在较低的slab类中使用较小的项目,这可能会更加重要,因为削掉几个字节可能最终将项目放入更有效的slab类中。而且,密钥限制为250个字符(有效。将来可能会增加到65k)。

在简单或合理的情况下压缩键。“ super_long_function_names_abstract_key”可能具有描述性,但很浪费。将其简写“ slfnak”,或其他任何东西。

Base64编码长数字。使用命令行程序将其转换回数字非常容易。

二进制协议允许设置任意密钥。代替base64编码,可以将它们按字节压缩到其原始大小。另外,可以打包两个字节的标识符,而不是'sflnak',并将数字映射回的代码。

但是,除非真的为额外的内存而感到痛苦,否则请不要执行任何此类操作。像这样进行一些简单的更改有时可以节省内存5%到20%,但是通常情况下购买几排的RAM比在缩小键所花费的时间便宜。

如何列出所有键?

使用memcached , 无法列出所有键。虽然有一个调试接口,但这不是可取的用法。

通过"stats items"和"stats cachedump"统计协议可以做到迭代所有的key,这个迭代过程是低效,因此如无必要,并不推荐使用此方法

压缩

大多数客户端都可以压缩发送到服务器或从服务器发送的数据。如果数据超过一定大小的阈值,或者有特殊要求,它们会设置一个特殊的标志位。然后压缩数据并存储。

由于使用了项目标志,客户端将自动知道是否在返回时解压缩该值。

为什么key过期时curr_items不会减少?

memcached的过期是懒惰的。通常,只有经过查看才能知道某项已过期。

可以这样考虑:你可以向memcached添加数十亿个项目,这些项目都在完全相同的一秒内到期,但是memcached本身在那一秒内不会执行任何其他工作。只有当尝试检索(或更新)这些项目时,内存缓存才会注意到它们不应该存在。此时,curr_items将根据其已过期的每个项目递减。在搜索内存中的新项目时,我们也可能会注意到已过期的项目,尽管这不太可能在curr_items中产生可观察到的差异,因为无论如何我们都会用新项目替换它。

相较于MySQL查询缓存

对于小型站点,MySQL查询缓存可能是一个有用的开始。不幸的是,它在mysql数据库上使用了许多全局锁,因此启用它可能会受阻。它还缓存每个表的查询,并且当表更改时,它必须使与表相关的整个缓存完全过期。如果站点是相对静态的,则可以很好地解决问题,但是当表以任何频率开始更改时,它就可能会出现崩溃。内存也受到限制,因为它需要使用数据库中直接存储的大部分内容。

Noreply/Quiet | 不回复/安静

根据是否通过ascii实现noreply,可能难以对错误进行故障排除,因此请当心。

若果业务希望向服务器发出命令时 不想等待响应时,可以使用Noreply。这可以帮助减少到其他服务器的往返等待时间。

散列

所有客户端至少支持一种跨服务器“散列”密钥的方法。请记住,客户端可能彼此不兼容。

一致的散列

一致性哈希是一种模型,该模型允许在添加或删除服务器时更稳定地分配密钥。在正常的哈希算法中,更改服务器数量可能导致许多键重新映射到不同的服务器,从而导致大量的高速缓存未命中。一致性哈希描述了将密钥映射到服务器列表的方法,其中添加或删除服务器会使密钥映射到的位置变化很小。

使用普通的哈希功能,添加第十一台服务器可能会导致40%以上的密钥突然指向与普通服务器不同的服务器。

但是,使用一致的哈希算法,添加第十一台服务器将导致少于10%的密钥被重新分配。实际上,这会有所不同,但肯定会有所帮助。

连接限制

默认情况下,最大并发连接数设置为1024。正确配置此设置很重要。在等待插槽释放时,与memcached的额外连接可能会挂起。可以通过发出stats命令并查看“ listen_disabled_num”来检测实例连接是否已用尽连接。该值应为零或接近零。

Memcached可以非常轻松地扩展大量连接。每个连接的内存开销很低(如果连接处于空闲状态则更低),因此请不要将其设置得很高。

假设有5个网络服务器,每个服务器都在运行apache。每个apache进程的MaxClients设置为12。这意味着可以接收的最大并发连接数为5 x 12(60)

Memcached服务分布式集群

特殊说明:Memcached集群和web服务集群是不一样的,所有Memcached的数据总和才是数据库的数据。每台Memcached都是部分数据。
(一台memcached的数据,就是一部分mysql数据库的数据) , Memcached的分布式集群需要依靠客户端进行一致性哈希算法来实现

Memcached特点及工作原理

  • 完全基于内存缓存的
  • 节点之间相互独立,这也是为什么Memcached的分布式集群需要依靠客户端实现
  • 异步I/O 模型,使用libevent作为事件通知机制。
  • 被缓存的数据以key/value键值对形式存在的。
  • 全部数据存放于内存中,无持久性存储的设计,重启服务器,内存里的数据会丢失。
  • 当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。
  • 可以对存储的数据设置过期时间,这样过期后的数据自动被清除,memcached的过期是懒惰的 , 服务本身不会监控过期,而是在访问的时候查看key的时间戳,判断是否过期。
  • memcache会对设定的内存进行分块,再把块分组,然后再提供服务。

memcache内存管理

使用Slab Allocation。原理相当简单,预先分配一系列大小固定的组,然后根据数据大小选择最合适的块存储。避免了内存碎片。(缺点:不能变长,浪费了一定空间)memcached默认情况下下一个slab的最大值为前一个的1.25倍。

没有身份认证机制!

memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)。memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached可以很快地创建新连接,服务器端也无需任何配置。

memcached对item的过期时间限制

 

设为 距离当前时间的时间间隔 时不能大于 2592000(30天),如果时间值大于2592000 ,那么memcached会把时间理解为unix时间戳格式也就是距离1970.01.01的秒数偏移量。0 为永不过期。

这个问题要特别注意,当我们设置的时间间隔大于 2592000 ,例如2592010,写进去的数据会被认为是unix时间戳格式,数据刚写进去已经过期,相当于导致数据写不进去,而更糟糕的是对于这种情况memcached服务端和客户端驱动都不会抛出exception或者打印任何警告信息,因为对memcached来说这样的时间值也是合理的。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值