memcache面试题与知识点总结
文章目录
什么是memcache
本质上是一个内存key-value缓存;
协议简单,文本行协议
不支持数据持久化,服务器关闭数据丢失
简单上手容易
互不通讯的memcacheed具有分布式特性
没有安全机制
memcache的使用场景
变化频繁,查询频繁但是不需要入库;
变化不频繁,查询频繁
读多写少的场景下用于页面缓存
数据量过大或变化频繁需要入库的场景不适用
memcached与redis的区别
只有单一的数据类型
redis的单线程的,memcache的多线程的
不支持持久化
不支持数据备份
缓存策略只有LRU
客户端
余数分散
m = hash mod n
一致性哈希算法
借助一致性hash环的数据结构。将机器和数据都hash映射到环上,这样离数据最近的机器就是这个数据对象所属的机器。这种方法,当数据聚集的时候可能会导致哈希不均匀,那么可以采用虚拟节点。每台机器新增几个虚拟节点,用来保证数据分散的均匀。
内存管理策略
page(默认1M) - slab class(特定大小chunk的组) - chunk(存储缓存)
Slab Allocator 优先将内存分组,通过预设的不同大小来决定数据存到哪个slab中。解决了内存碎片问题。
缓存过期策略
mc不会释放已经分配的内存,存储空间可以反复使用
mc内部不会监视数据是否过期,而是get数据的时候查看时间戳来判断
内存空间不足时,就从最近未被使用的数据中搜索,将其空间分配给新数据。LRU算法
不适用malloc/free是因为会造成内存碎片
memcached是原子的吗?
所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:) 命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。
memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个 item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。
通常,基于memcached中item的值来修改item,是一件棘手的事情。除非您很清楚自己在做什么,否则请不要做这样的事情。
memcached如何实现冗余机制?
不具备冗余机制,如果非要实现。搞一个主备。或者第三方工具。
memcached如何处理容错的?
可以不用实现容错机制。因为memecache是临时缓存的中间结果集数据。如果挂掉就可以取源数据(mysql)。但是非要实现。搞一个主备。
如何将memcached中keys批量导入导出?
memcache是高速缓存工具,使用mysql表处理吧。
memcached是如何做身份验证的?
不需要安全验证。如果你非要做,使用防火墙就可以实现。
memcached对item的过期时间有什么限制?
使用秒,但是秒只能使用30天以内的。 超过会被当做时间戳。0代表永久,但是可能会被lru删除。
为什么单个item的大小被限制在1M byte之内?
内存算法。一个page就是1M。
原文地址:https://blog.csdn.net/wxyasj/article/details/116889099
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。