这绝对是一份价值不菲的memcache使用总结

简介: 这绝对是一份价值不菲的memcache使用总结

在互联网应用场景的网络架构中基本上用到了memcache,因此memcache作为分布式缓存之一使用是比较广泛的,本文是阿青多年使用memcache的总结,绝对价值不菲,值得一看(以下mc是memcache的简称)。


一.MC适用场景

业务上对数据的要求满足如下方面的场景才适用。


l数据变化不频繁但访问频繁


无用户关联性


有访问通用性


数据安全要求低


数据一致性要求低


无持久化要求


例如秒杀、抢购、抽奖活动的商品或礼品库存计数递减的场景,此场景对数据的可靠一致性要求很高,放在mc不可靠,很有可能被置换出去。


二.缓存key设置

1.key值最大长度250个字符,尽可能设置短些,不能设置太长,如果太大浪费内存。


2.key值不能有空格和控制字符等特殊符号,如\n \r,最好不要使用中文,如使用了中文要key作MD5。


3.key值需按业务逻辑设置足够短后再MD5,不过key转MD5后需要实现获取key的功能,以便于清理mc或排查故障时需要拿到key。


4.按业务逻辑来设置key,合理设置缓存key的粒度,以便提高命中率,比如产品终端页面的某个豆腐块是根据产品小类或品牌等出数据的,应用小类id或品牌id为基础设置key,而不是无脑地使用产品id为基础设置key。


三.缓存value值设置

1. value过期时间默认最大30天,如设置过期时间大于30天,值会设置不进缓存。


2. value最大能存储1MB,如果数据大于1MB可以考虑压缩或拆分到多个key中,在应用于页面级的缓存时要特别注意。


3.value最好转为string来保存。


4.不要多重嵌套mc缓存。


四.缓存过期时间设置

(一)失效时间设置的方法


有两种:


1.相对时间:多长时间,给出过期的时间长度


如:memcache.set(key,value,new Date(5000))设置为5秒过期


2.绝对时间:到期时间,给出过期的最后期限


如:memcache.set(key,value,new Date(System.currentTimeMillis()+5000))设置为5秒过期


当部署应用的服务器系统时间跟mc服务端的时间有差距时,使用绝对时间就有问题了,所以建议大家设置mc缓存过期时间时都用相对时间。看下面mc服务端源码就明了。


服务端的处理


时间处理源代码【memcached.c】如下:


#define REALTIME_MAXDELTA 60*60*24*30 //定义30天的秒数


static rel_time_t realtime(const time_t exptime) {

if (exptime == 0) return 0;


if (exptime > REALTIME_MAXDELTA) { //超过30天,是绝对时间


if (exptime <= process_started) //小于进程启动日期


return (rel_time_t)1; //


return (rel_time_t)(exptime - process_started); //返回进程启动之后的时间差


} else { //不超过30天,是相对时间


return (rel_time_t)(exptime + current_time); // exptime + (tvsec - process_started)


}


}


相对时间的返回的值是:服务器当前时间之后的exptime - process_started秒


绝对时间的返回的值是:服务器当前时间之后的(exptime -服务端当前时间) - process_started秒


可以看到,如果Client和Server时间不一致,根据经验mc服务端跑着跑着其服务端时间通常会比系统时间慢 当然偶尔也会快,如使用绝对时间会有问题,如mc时间比系统时间慢时对一些过期时间有严格要求的就不会按时过期了,如果快了那缓存几乎很快都过期,之前摄影部落某台mc就是出现这种情况,在访问量大些时由于一大部分缓存集体失效导致数据库负载高。


所以综上所述使用相对时间是比较安全可靠的做法。


(二)缓存时长的设置策略


缓存失效时间设置加个随机数来控制,把失效时间打散,尽可能避免访问高峰期缓存集体过期而雪崩,比如某个页面块的缓存时间设置4小时*随机数,即是这个页面块每份缓存过期时间不一样。


获取随机数的参考代码:


//随机算法把缓存过期时间打散


privatefloatgetRandomFloat(){

floatrandomFloat = 0;


while(true){

randomFloat =newDouble(Math.random()).floatValue();


if(randomFloat>0){

if(randomFloat<0.5){

randomFloat = randomFloat*2;


}


break;


}


}


returnrandomFloat;


}


五.一些重要的参数设置

首先保证同一应用各台服务器上的mc配置文件一致。


其他一些需要注意注意的参数:


memcached.failover=false


设置容错开关,设置为true,当前socket不可用时,程序会自动查找可用连接并返回,否则返回NULL。默认为true,最好设置为false,跟failback设置为true搭配使用,这样当某台mc宕机或其他问题时让该台的请求直接落到到数据库,当恢复后重新使用,这样就不影响整个mc集群的缓存key的重新分配,引发集群短期的动荡。


memcached.failback=true


设置连接失败恢复开关,设置为true,当宕机的服务器启动或中断的网络连接后,这个socket连接还可继续使用,否则将不再使用,默认是true,最好设置为true。


六.一些排查故障的方法

1.用命令查看分析mc的内存使用、命中率和mc时间情况


一般运维同事都有安装部署xmem和xmcstat命令。


如:xmem 192.168.123.123 11211


分析各台mc的Usage和HitRate的值,如果Usage值80%以上时有效期内缓存的置换率会比较高,所以缓存命中率相对会低些,这时留意加资源。


如发现某台HitRate的值比其他的要低,该台mc很有可能有问题。


xmcstat --i="192.168.123.123:11211"


重点留意MC时间和服务器系统时间这两个时间,如果mc时间比服务器时间快很多,如果我们设置缓存过期时间是绝对时间的,那肯定会降低缓存的命中率,所以设置缓存过期时间要用相对时间。


2.如发现一些mc值没过期的情况下灵异消失,一般是某台mc有问题或内存使用80%以上时被置换出去了。排查某台mc有问题可以telnet上去每台mc手动get某个key来看看,当然要先要知道该key是hash到那台mc。

————————————————

文/老猿,写代码写诗写职场的程序猿大叔,倾力原创简单实用的硬干货,转载此文请联系老猿。



相关文章
|
7月前
|
机器学习/深度学习 关系型数据库 MySQL
什么是脏读、幻读、不可重复读?Mysql的隔离级别是什么?
脏读、不可重复读和幻读是数据库事务并发操作中的三种异常现象。脏读指读取到未提交的临时数据;不可重复读指同一事务内两次读取结果不一致,因数据被其他事务修改;幻读则是范围查询中出现新增记录,导致行数变化。SQL-92标准定义了四种隔离级别:未提交读(RU)、提交读(RC)、可重复读(RR)和串行化(Serializable),依次增强对这些异常的防控能力,平衡数据一致性与系统并发性能。
1572 0
|
9月前
|
NoSQL API PHP
PHP-Casbin:一个让开发者不再为权限控制 “重复造轮子” 的工具
PHP-Casbin 是一个轻量、灵活的开源权限框架,支持 ACL、RBAC、ABAC 等多种模型,帮助 PHP 开发者高效解决权限控制难题。它具备跨框架、跨语言、动态权限、多租户隔离等能力,适用于电商、SaaS、政企系统等复杂场景,让开发者摆脱重复造轮子,提升项目安全与可维护性。
455 0
|
5月前
|
Java API 开发者
黄金、白银及全球期货数据 API 对接实战
在全球经济波动下,黄金白银成避险焦点。本文介绍如何通过StockTV API快速接入全球贵金属实时行情、K线及盘口数据,支持COMEX、伦敦金等品种,助力开发者构建量化系统与金融分析工具,实现毫秒级数据推送与专业图表集成。
|
数据采集 存储 关系型数据库
数据采集:从何开始?
数据采集:从何开始?
712 65
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
1480 13
|
存储 监控 安全
如何选择合适的日志管理系统?功能对比与应用场景解析
在数字化时代,日志管理系统是企业IT运营与安全管理的核心工具。本文从核心功能(集中化收集、实时监控、智能告警等)和应用场景(故障诊断、安全监测、合规审计等)分析如何选择合适的日志管理工具,并对比开源与闭源系统的优劣。同时,推荐 EventLog Analyzer,其支持多源日志、实时威胁检测、合规报告等功能,适合各类企业需求。
421 0
如何选择合适的日志管理系统?功能对比与应用场景解析
|
小程序 JavaScript Java
二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)
二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)
1546 2
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
433 0
|
存储 安全 程序员
AtomGit代码托管平台评测赛——赛事收获暨赛事总结
AtomGit代码托管平台评测赛——赛事收获暨赛事总结
372 1

热门文章

最新文章