什么数据适合缓存
- 经过复杂计算得出的数据。
- 频繁访问的热点数据。
为了减轻数据库的访问次数和压力。
分布式缓存
分布式缓存是为了解决数据库服务器和Web服务器之间的瓶颈,如果一个网站流量很大,每次数据库查询耗费的时间将不容乐观。对于更新速度不是很快的站点,可以采用静态化来避免过多的数据查询,可使用Freemaker或Velocity来实现页面静态化。对于更新数据以秒级的站点,静态化不太理想,可通过分布式缓存系统来解决,如Redis、MemCache、SSDB等(都是K-V存储)。
用户群体广泛就必然存在高并发的问题,如果将引用系统部署在单节点服务器上,势必会对单服务器造成巨大的访问压力,因此需要将系统部署到不同的节点上,同时也要将不同的数据分散到不同的节点上。
Redis
在Web开发中,经常要重复从数据库中获取相同的数据,这种重复的操作极大地增加了数据库的负载。缓存是解决这种问题最好的办法。
Redis就是一个高性能的、分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
在用户第一次发送请求时,从关系型数据库RDBMS中获取数据并返回,同时将该数据保存到分布式缓存系统中。当用户再次发送请求时,直接从分布式缓存系统中获取,以提高性能。
-
Redis特点突出,支持多种value数据类型,如String、Hash、Set、List、StoredSet,并且有高可用的解决方案和集群方案,支持水平扩容。也就解决了大部分企业的需求,而MemCache、SSDB相对来说,解决方案并不算那么完善。
-
与MemCache的区别:
- Redis使用单核而Memcache使用多核,也就是说,Redis属于单线程操作(避免频繁的上下文切换),MemCache属于多线程操作。在多个用户同时请求时,Redis是处理完一个请求以后再去处理下一个请求。而MemCache可以同时处理多个请求。
平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis也升级新版本3.0以上支持多核,但是3.0以上版本除了增加很多功能外,性能还不如老版本。 - Redis和MemCache都是将数据存储在内存中,都属于内存数据库。但是MemCache服务宕机或重启后数据是不可恢复的,而Redis服务宕机或重启后可以恢复。因此Redis可以做持久化,它会将内存数据定期同步到磁盘中。
提供两种主要的持久化策略:RDB快照和AOF日志。使得Redis可以保存比较重要的数据不怕断电后数据丢失,同时基于数据持久化的分布式主从架构也提升了Redis的可用性和性能问题。 - Redis支持数据备份,需开启
master-slave
主从策略(数据可以从主服务器向任意数量的从服务器上同步)。
- Redis使用单核而Memcache使用多核,也就是说,Redis属于单线程操作(避免频繁的上下文切换),MemCache属于多线程操作。在多个用户同时请求时,Redis是处理完一个请求以后再去处理下一个请求。而MemCache可以同时处理多个请求。
数据不一致问题
-
缓存与数据库数据不一致(最终一致性)问题,主要原因有:
1.并发的场景下,导致读取老的 DB 数据,更新到缓存中。
2.缓存和 DB 的操作,不在一个事务中,可能只有一个操作成功,而另一个操作失败,导致不一致。 -
Cache Aside Pattern旁路缓存(CAP)
目前比较常用的解决方法,具体逻辑如下:
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。
-
Read/Write Through Pattern
在Cache Aside套路中,应用代码需要维护两个数据存储,一个是缓存(Cache),一个是数据库(Repository)。所以,应用程序比较啰嗦。而Read/Write Through套路是把更新数据库(Repository)的操作由缓存自己代理了,所以,对于应用层来说,就简单很多了。可以理解为,应用认为后端就是一个单一的存储,而存储自己维护自己的Cache。Read Through
Read Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。Write Through
Write Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)。
【转载】
分布式缓存系统
memcache与redis有何区别,redis有哪些优势?
深入理解缓存之缓存和数据库的一致性