Memcache的操作最常用的有这几种方式:
1,获取缓存Memcache_get,在参数中指定KEY即可。
2,添加缓存Memcache_add,参数有( string $key , mixed $var [, int $flag [, int $expire ]] ),分别是设置缓存标识KEY,设置缓存数据(内容),是否压缩缓存一般默认0,设置缓存失效时间,添加一个缓存值KEY,如果KEY已经存在,则返回false。
3,更新缓存Memcache_replace,参数与添加缓存相同,如果缓存KEY存在则更新覆盖,如果不存在返回false。需要注意的是,更新缓存也会更新缓存的过期时间即重新赋值。
4,更新或添加缓存Memcache_set,参数与添加缓存相同,特点是如果缓存KEY存在则更新覆盖,如果缓存不存在则添加这个缓存。
5,删除一个缓存Memcache_delete,如获取缓存一样,在参数中指定KEY即可。
问题就出在更新缓存上,Memcache无论用何种方式更新缓存,都会同时覆盖新的缓存过期时间。我的一个API项目增加了按等级分配调用频率的功能,再不用Redis而用Memcache实现这个功能的情况下,频率控制策略是若缓存中的计数在一分钟内累计到大于指定的等级频率时则返回频率超限的错误,这时新的请求被拦截,缓存会在参数设置的过期时间后自动失效,然后新的请求会添加一个新的缓存。但如果一分钟内累计没有大于指定的等级频率,缓存会继续更新累计,但因为更新缓存会同时重置缓存的过期时间,因此导致缓存不会在一分钟内自动失效,在超过一分钟后也会累记到大于分钟频率,这时系统会返回API分钟频率超限的错误。
现在的解决方案是,在缓存数据中增加时间戳,API调用时先判断请求时间是否超过缓存时间一分钟,如超过即删除这个缓存。如果你遇到“API分钟频率超限”的错误提示,即说明你在一分钟内的调用次数大于了你的分钟频率,待缓存的过期时间走完一分钟剩下的时间后失效后即可恢复。