按照Redis官网定义,Redis是一个开源的基于BSD协议的强大的K-V内存数据库。它提供了五种数据结构:strings、hashes、lists、sets和sorted sets。Redis完全基于ANSI C编写。
Redis通常被用作缓存目的,而在Java界流行的缓存框架还有Memcached、EhCache。于是我想探究下Redis和Memcached的区别,如下:
我比较关注上面第3条,于是我特地更深入地就这条查看了几篇文章。对Redis作为数据库(Database)的描述如下:
1 2 3 4 | |
相比之下Memcached没有提供这种持久化机制,为什么Memcached不提供呢?原因应该有很多条(见仁见智),这里列举两条:
1 2 3 4 5 6 7 8 9 10 | |
针对上面第2条提到的问题,有人可能会建议将F、G更换顺序,先更新缓存,再更新数据库,只有缓存更新成功了才更新数据库。这在某些情况下的确可以解决这种写缓存失败导致的读缓存数据不一致问题。但现在写入性能下降了。使用缓存框架的理想状态是: 不对写性能造成影响,同时极大提高读性能,并且保证比较高的数据一致性(或准确性、数据时新性) 。因此写缓存的推荐方式是异步写,将F、G更换顺序的建议并不太妥当。
这里体现了几个使用缓存框架时的折衷:
没有万金油式的解决方案,因为技术服务于业务,而业务场景又是千变万化的。