在实际工作中,缓存好像一般都用redis,memcache,而不用Hibernate或者mybatis等ORM自带的缓存或者数据库本身自带缓存,为何?
首先说明一下:
1、mysql、oracle这些关系数据库自带的缓存都是对热数据进行自动存储及替换,也是用的内存空间
2、redis、memcache这类缓存系统是由开发人员自由选择数据对象,全部采用内存,也有些带持久化到磁盘存储机制
然后说说各自优缺点:
mysql这类缓存是完全凭借数据库自行运作,没有开发量,但是也完全基于数据库服务器资源处理连接请求,极其消耗cpu和内存甚至线程资源,对一个中大型业务系统来说,高并发请求全部放在数据库对业务系统是致命的,除非你有无限量的硬件资源支持横向扩展,而这更加需要极高的成本,这无疑是极其浪费资源的。
而redis这类专门的缓存数据库都是基于快速响应、业务灵活变更的需求诞生的,主从或者集群模式也非常成熟,对于几千数万甚至更高并发的处理都不在话下,当然这也要看使用方法。针对业务特性使用不同的缓存方法才是最重要的,比如对实时性更新要求不高、静态数据这一类,所以总的来说要根据业务找最适用的系统!
使用缓存,最主要的目的是提升系统的响应速度和对高负载的承受能力,因此各个层面缓存有不同的应用场景:
1、数据库的缓存,是数据库软件自身进行更新、判断是否能从缓存取数据,不需要开发人员关心,因此绝大部分情况下已经使用了数据库的缓存。
mysql中是查询结果缓存,根据query_cache_type的设置是否使用缓存,query_cache_size设置缓存大小。
oracle中的中缓存有两种,数据块缓存buffer cache,查询结果缓存SQL Result Cache。
2、ORM的缓存要看实现类型,比较简单的是存储在服务器本机的内存中,不能满足集群部署的场景,强行使用会出现访问数据不一致的现象。优点是使用简单,且本机缓存的性能更好。
3、redis和memcache都是分布式缓存,使用场景比较广,缺点是是需要开发的人工更新、查询缓存,不像ORM的缓存是自动更新的,开发起来比较繁琐。有些开发框架会对缓存支持比较好,通过配置可以控制缓存使用、更新方法。