前言
我们在做Web开发的时候从至上而下的技术分层里,缓存始终贯穿其中。浏览器层–》业务层–》数据库层。每个层面上的缓存都有各自的功能与场景。我们今天探讨下业务层到数据库层上缓存的功能和区别。
业务层缓存
Memcached
Memcached 严格上讲还不能说是完整的分布式缓存系统。它有很多第三方工具支撑其分布式功能。
Memcached 通过内部固定的大小的chunk预申请内存数据。使得分配和回收内存的效率很高。读写性能也很高。64k对象的情况下,单机QPS可以达到15W以上。
Memcached 的集群架构中,单个节点对其他节点是相互独立的,没有数据方面的通信。不具备failover能力。
Memcached 支持多语言,有相当的稳定性。
Redis
Redis 显著的特点是不仅支持普通的K,V 类型存储,还支持其独特的 五种数据结构 详见Redis数据结构
Redis 也支持集群,Redis支持的集群是Master-Slave模式。其有点是可以在宕机时切换到备份机。可用性方面有一定的提升。
Redis 单纯当做缓存存储在内存时速度和Memcached不相上下。存储到硬盘时,性能和速度会下降很多,介于 Memcahced 和mysql之间。
Redis 有特殊的订阅功能,使得它经常被用于当做内存队列使用。
Redis 扩展方面不如Memcached,无法做到持续的线性扩容。目前支持通过复制的方式,产生一主多备架构并升级容量。
数据库层缓存
mysql缓存
MySQL将缓存分为Buffer缓存和Cache缓存。
Buffer缓存:
由于硬盘的写入速度过慢,或者频繁的I/O,对于硬盘来说是极大的效率浪费。那么可以等到缓存中储存一定量的数据之后,一次性的写入到硬盘中。Buffer 缓存主要用于写数据,提升I/O性能。
Cache 缓存:
Cache 是在开启缓存功能前提下,在通过的每次sql进行hash计算,生成此条sql的唯一hash作为存储的Key值。SO select是区分大小写的。
生成缓存之后,如果涉及的table有任何数据的变动(整个talbe),所有的cache就会被删除。如果Cache缓存已经存储满,则启用LRU算法,进行数据淘汰。淘汰掉最远未使用的数据,从而开辟新的存储空间。
不过对于特大型的网站,依靠这种策略很难缓解高频率的读请求,一般会把访问非常频繁的数据静态化,直接由nginx返还给用户。
程序和数据库I/O设备交互的越少,则效率越高。
问题
既然有Memcached,Redis 为什么还要用Mysql缓存呢?
- 解答
从整体架构上看,Memcached和Redis支持扩展分布式缓存。适用于大型Web项目。
单从单节点功能上看,Mysql由于自身的cache 删除方式。使得其缓存有相对的局限性。并且无法简单的管控。需要更好的使用的话,需要对业务上进行更详尽细致的分析。
在数据库的逻辑设计层面细分出能够说回合mysql缓存的场景。
单节点,数据简单,无太多修改的数据面前,但根据场景来,mysql缓存还是有一定价值的。比Memcached Redis简单易用,效率更好。