为什么缓存比数据库快
缓存比数据库快的原因:
1、直接读文件相比数据库查询效率更胜一筹,而且文中还没算上连接和断开的时间。
2、一次读取的内容越大,直接读文件的优势会越明显。
3、写文件和INSERT几乎不用测试就可以推测出,数据库效率只会更差。
4、很小的配置文件如果不需要使用到数据库特性,更加适合放到独立文件里存取,无需单独创建数据表或记录,很大的文件比如图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。
redis是缓存数据库吗
redis不是缓存数据库。
redis的所有数据是放在内存中,是内存数据库。它是一个开源的,高性能,C语言开发的 ,键值对(key-value)存储数据的NOSQL数据库。
由于其内存特性,项目维护者将复杂性保持在最低限度的承诺以及基于事件的编程模型,Redis 在读写操作方面具有出色的性能。
如何保证本地缓存、分布式缓存、数据库之间的数据一致性
其实it从业者不在乎里面的细节,而在于可用的解决方案。
本地缓存的一致性在生产中是两种。一种是服务内变量实时watch etcd做到一致,这类缓存适合应用配置O(a),而不能存放用户进度O(n),内部的raft算法相当拉低qps。
第二种就是时效必须短,10秒到30内不能再多。这种短缓存就可以存临时进度,是浮在redis上面的本地化的二级缓存。这类缓存因为app节点太多,无法强一致,而是每10-30秒后会去redis那达到同步。
分布式缓存,低qps业务直接挂载单点redis,大qps就挂redis集群,cluster那种,分布式一致靠key能hash到同一个slot。
本地缓存加etcd的watch机制,也是可以作为分布式缓存的解决方案的,不过仅限于配置信息,不能缓存进度。
数据库的一致性暂时大多数还是分库分表,通过物理分区和pg上挂一个代理来hash。集群的数据方案大部分是闭源的,这里想分享的人可以在楼里追加。
以上都是中间件自身的一致性。除此之外,才是中间件之间的一致性。
常规的redis和db一致性,一般是通过改库删缓存。
这里直接打死了双写,因为先写完数据库的线程不一定会先写完redis,因为网络,cpu调度等因素,很容易出现数据库后改的东西,在缓存时被先写的覆盖掉了。
同理打死先删缓存再改数据库,因为你删完缓存时,你无法确保在改完数据库前,已经删掉的缓存会不会因为第二次读取又载回缓存了,要知道一个数据库在事务提交前,依旧是可以幻读的。至于改完数据库之后再删一次缓存,其实这个第一个删除就多余了。
再上层一点,就是增加用户锁以及操作单次幂等。如果你很清楚你要保持一致的,是一个用户的某条数据,那么你就可以利用分布式锁,最常用的就是redis的setexnx机制来实现的。
以上是从中间件自身和他们之间的特性总结出来的方案。
在业务上,其实还要就场景来制定不同的方案。比如对数据串行化,最常见的就是redis的原理,以及golang的channel,以及只留写入的唯一入口,队列的单一消费组。