【原文路径】
http://www.infoq.com/cn/articles/tq-why-choose-redis
众多NoSQL百花齐放,如何选择
最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题
少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。
海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。
Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。
面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。
Redis适用场景,如何正确的使用
前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?
Redis与Memcached的比较
网络IO模型
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。
(Memcached网络IO模型)
Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。
内存管理方面
Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。
数据一致性问题
Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。
存储方式及其它方面
Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS
进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。
关于不同语言的客户端支持
在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。
根据以上比较不难看出,当我们不希望数据被踢出,或者需要除key/value之外的更多数据类型时,或者需要落地功能时,使用Redis比使用Memcached更合适。
关于Redis的一些周边功能
Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。
总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。
总结:
Redis使用最佳方式是全部数据in-memory。
Redis更多场景是作为Memcached的替代者来使用。
当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
当存储的数据不能被剔除时,使用Redis更合适。
后续关于Redis文章计划:
Redis数据类型与容量规划。
如何根据业务场景搭建稳定,可靠,可扩展的Redis集群。
Redis参数,代码优化及二次开发基础实践。
- 大小: 61.1 KB
分享到:
相关推荐
redis及其依赖包:commons-pool-1.6.jar,commons-pool2-2.5.0.jar,jedis-2.9.0.jar,tomcat-juli-8.0.46.jar,tomcat-juli-adapters.jar,tomcat-redis-session-manager-2.0.0.jar
windows中使用Redis 里面包含Redis在页面中的使用说明和dll的代码引用说明
Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 ...
**Redis简介** Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于键值对的数据存储系统。...无论是在Windows还是其他操作系统上,正确安装和使用Redis及其客户端是开发过程中的重要一环。
8. **性能优化**: 为提高性能,可以使用`DatabaseAsync`接口进行异步操作,利用.NET的async/await特性。此外,合理设置连接池大小和超时时间,避免频繁创建和销毁连接。 9. **异常处理**: 使用Redis时,需要注意...
"Redis++使用说明,windows下编译Redis-Plus-Plus" 在这篇文章中,我们将详细介绍如何在Windows平台下编译Redis++,包括编译hiredis.lib和Win32_Interop.lib静态库文件的过程,然后安装Cmake并编译Redis++,最后...
在Delphi环境下使用Redis,开发者可以利用Redis的强大功能来存储和操作数据,提高应用程序的性能。Redis是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件,支持丰富的数据类型,如...
"阿里巴巴Redis使用规范" 本文将详细介绍阿里巴巴28条Redis使用规范,涵盖了Redis性能优化、数据存储、安全、实例管理等方面的内容。 规范一:控制key的长度 为了避免Redis中的keys过长,阿里巴巴建议控制key的...
本文将深入探讨如何在基于MVC(Model-View-Controller)架构的Web应用程序中集成和使用Redis,以提升应用的性能和响应速度。 **一、Redis介绍** Redis是一个开源的内存数据结构存储系统,它支持多种数据类型,如...
在代码中,使用`StackExchange.Redis`创建连接实例: ```csharp using StackExchange.Redis; var connection = ConnectionMultiplexer.Connect(ConfigurationManager.ConnectionStrings["RedisConnection"]....
ASP.NET Core 使用 Redis 基于 StackExchange.Redis ASP.NET Core 是一个开源的、跨平台的框架,使用 C# 语言开发。Redis 是一个基于内存的数据存储系统,可以用来存储和处理大量数据。StackExchange.Redis 是一个...
centos7.9 redis及其依赖
**标签关联:** "C#操作Redis Redis学习" 这两个标签进一步强调了我们将会探讨如何使用C#语言进行Redis的读写操作,并且对于初学者来说,这是一个很好的学习资源。 **文件名称列表:** "C#操作Redis" 这个文件名...
Redis是一种高性能的键值对数据存储系统,常用于数据库、缓存和消息中间件等场景。Redis-x64-5.0.14.1是针对Windows操作系统的64位版本,提供了高效、稳定的数据处理能力。这个版本的Redis包含了各种优化和改进,...
使用Redis存放Session RedisManager
本资料将详细介绍Redis的程序及其使用方法。 首先,Redis的核心特性包括: 1. **内存存储**:Redis的所有数据都存储在内存中,这使得其读写速度极快,但同时也会消耗大量内存资源。 2. **持久化**:为了防止数据...
为什么使用 Redis,不用 Memcache 和 MongoDB?
例如,`Redis_Example1.vi`和`Redis_Example2.vi`可能包含了不同的使用示例,展示了如何使用这些VI执行不同的Redis操作。 ### LabVIEWRedis `labviewredis`工具包同样是为LabVIEW设计的,用于与Redis集成。它可能...
`docker run -p 6379:6379 -v /media/redis/data:/data -v /media/redis/conf/redis.conf/:/usr/local/etc/redis/redis.conf/ -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes` ...
下面我们将详细讲解Java中Spring框架使用Redis所需的五个关键jar包及其作用。 1. **spring-data-redis** 这是Spring Data Redis项目的核心包,提供了对Redis的全面支持。它包含了一组针对Redis操作的模板类和...