1MB。如果你的数据大于 1MB,可以考虑在客户端压缩或拆分到多个 key 中。
为什么单个 item 的大小被限制在 1M byte 之内?
啊…这是一个大家经常问的问题!
简单的回答:因为内存分配器的算法就是这样的。
详细的回答:Memcached 的内存存储引擎(引擎将来可插拔…),使用 slabs 来管理内存。内存被分成大小不等的 slabs chunks(先分成大小相等的 slabs,然后每个 slab 被分成大小相等 chunks,不同 slab 的 chunk 大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。
因此,批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有用。如果您有大量的从不变化的数据,并且希望缓存很快热(warm)起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生,因此我们会考虑在将来实现批量导出导入的功能。
如果一个 memcached 节点 down 了让您很痛苦,那么您还会陷入其他很多麻烦。
您的系统太脆弱了。您需要做一些优化工作。比如处理”惊群”问题(比如memcached 节点都失效了,反复的查询让您的数据库不堪重负…这个问题在 FAQ的其他提到过),或者优化不好的查询。记住,Memcached 并不是您逃避优化查询的借口。
您不应该这样做!Memcached 是一个非阻塞的服务器。任何可能导致memcached 暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向 memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化,您就需要处理脏数据了;
Memcached最大能存储的数据量取决于分配给它的内存大小。由于Memcached将数据存储在内存中,因此其存储能力受到可用内存的限制。理论上,只要内存足够大,Memcached就可以存储大量的数据。然而,需要注意的是,虽然内存提供了快速的数据访问速度,但它也是易失的,即当服务器重启或内存被清空时,存储在Memcached中的数据将会丢失。
关于过期数据的处理,Memcached允许在存储数据时指定一个过期时间(TTL,Time To Live),单位为秒。当超过这个时间后,数据将会自动从缓存中移除。这种过期策略有助于确保缓存中的数据保持最新状态,并防止过期数据对系统性能造成负面影响。
至于item的批量导入导出,Memcached本身并没有提供直接的批量导入导出功能。然而,你可以通过一些间接的方式来实现这一需求。例如,你可以编写脚本来从数据源(如数据库)中读取数据,并逐个将数据项存储到Memcached中,从而实现批量导入。同样地,你也可以编写脚本来从Memcached中读取数据,并将其写入到目标数据源中,从而实现批量导出。这些脚本可以根据你的具体需求进行定制,以满足不同的批量处理要求。
需要注意的是,在处理大量数据时,批量导入导出可能会对系统性能产生一定的影响。因此,在执行这些操作时,建议根据系统的实际情况进行性能优化和监控,以确保操作的顺利进行并避免对系统造成过大的负担。