为么使用Redis及其产品定位 —— Redis学习笔记(二)

来源:互联网 发布:毕业后悔做程序员 知乎 编辑:程序博客网 时间:2024/06/10 12:29
原文连接:
http://www.infoq.com/cn/articles/tq-why-choose-redis
传统MySQL+Memcached架构遇到的问题

实际上MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,但随着业务量和访问量增大,出现以下问题:
1、mysql需要不断的进行拆库拆表,Memcahed 也需要不断的扩容,扩容和维护工作占据大量开发时间
2、Memcached与Mysql数据库数据的一致性问题。
3、Memcached数据命中率低或down机,大量访问直接穿透到DB,Mysql无法支撑。
4、跨机房cache同步问题。

如何选择NoSQL

NoSQL主要解决以下问题:
1、少量数据存储,高速读写访问。——Redis最主要的使用场景。通过数据全部in-momery的方式来保证高速访问。同时提供数据落地的功能。
2、海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
3、完全无中心设计:节点之间通过gossip方式传递集群信息。数据保证最终一致性;中心化方案:通过类似一个分布式锁服务来保证一致性。数据先写入内存和redo log,然后定期compat归并到磁盘上。将随机写优化为顺序写,提高写入性能
4、直接存储为json格式数据,支持,auto-sharding等功能,如mongodb。

Redis适用场景,如何正确的使用

Redis最适合将所有数据in-memory 的场景。虽然redis也提供持久化功能,但实际更多是一个disk-backed的功能。
Redis与Memcached的选择?

Redis与Memcached的比较
1、网络IO模型
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程, libevent   pipe     worker 
stats、锁
Redis :单线程IO复用模型,自己封装一个简单的AeEvent事件处理框架。主要实现了epoll、kqueue和select。单线程可以将速度优势发挥到最大。
2、内存管理方面:
Memcached:预分配内存池  slab    大小不同的chunk来管理内存。。Item根据大小选择适合的chunk存储。
Redis:现场申请内存的方式存储数据,很少使用free-list等方式来优化内存分配。一定程度上会存在内存碎片。
3、数据一致性问题
Memcached:cas命令,,,,保证多个并发访问操作同一份数据的一致性问题。
Redis 不能保证这点,但是Redis提供事务的功能,可以保证一串命令的原子性。中间不会被任何操作打断。
4、存储方式及其他方面。。
Memcached基本只支持简单的key-value存储,不支持枚举。不支持持久化和复制功能‘
Redis除了key-value之外。还支持list,set、sorted set、hash等众多数据结构,提供了keys。


关于Redis的一些周边功能

Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。

总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。

总结:

  1. Redis使用最佳方式是全部数据in-memory
  2. Redis更多场景是作为Memcached的替代者来使用。
  3. 当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
  4. 当存储的数据不能被剔除时,使用Redis更合适。
0 0
原创粉丝点击