转载

Redis 3.0.0正式版发布,全新的分布式高可用数据库

Redis 3.0.0 正式版终于到来了!最重要的新特性是集群(Redis Cluster),提供Redis功能子集(比如不支持多数据库)的分布式、容错的实现(最多支持1000结点)。

Salvatore 'antirez' Sanfilippo在 Google Groups 里表示,这是Redis的重要时刻。“我相信今天的Redis 3.0.0将以某种方式完全改变Redis的面貌。”他强调, 人们将认识到Redis是一个全新的东西,它的自动扩展、容错和高可用性都大大提高,从此能够在更大范围承担更关键的任务。 (我总结一下老大的意思吧:Redis翻开了历史新的篇章……)

antirez还透露,内置的集群功能持续干了很多年,虽然能找到一些时间密集开发,但也不时被其他特性完全打断,现在终于完成了。他预计社区能用好这些功能,积累必要的经验,还要一到两年。

他还说,Redis 3.0.0实际上标志着一个新阶段和新的开发模式的开始。以后,大量已经开发的新功能将不再急于进入稳定版本,实际上Redis 3.0.0就放弃了很多新功能,回退到2.8,以保证新的稳定版本用户能够马上使用。

他在帖子里重点提及的其他更新包括:

  • 新的"embedded string"对象编码,提升缓存命中率。在某些工作负载(尤其是管道化的高负载)下速度大幅提高。
  • 大大改进了回收键的LRU近似算法。
  • AOF重写功能被完全重新开发了,以减少进程最终将积累的缓冲写入时,由于硬盘速度慢而导致的延迟。

而在发布声明中还列出了如下更新(相对于2.8):

  • WAIT command to block waiting for a write to be transmitted to the specified number of slaves.
  • MIGRATE connection caching. Much faster keys migraitons.
  • MIGARTE new options COPY and REPLACE.
  • CLIENT PAUSE command: stop processing client requests for a specified amount of time.
  • BITCOUNT performance improvements.
  • CONFIG SET accepts memory values in different units (for example you can use "CONFIG SET maxmemory 1gb").
  • Redis log format slightly changed reporting in each line the role of the instance (master/slave) or if it's a saving child log.
  • INCR performance improvements.

详情可以点击 这里 查看。

ITEye上powersoft同学之前翻译了Redis 3.0的文档,虽然还没有来得及更新,但还是有参考价值的: http://www.iteye.com/blogs/subjects/redis3 。

Hacker News上antirez回答了社区提出的一些问题,颇有价值,整理翻译如下。

Redis之外还有什么其他更好的选择啊?

(这问题让antirez怎么答,总不能不谦虚吧。仔细听,他回答得很好。) 这得看使用场景,基本上还是就事论事、具体情况具体分析。程序员的本事不就体现在选择正确的技术,然后在不同情况下优化嘛。你要考虑数据模型是否匹配所要解决的问题,运维因素,持久化保证,性能(需要多少个结点),可扩展性,是否简单(搞这么复杂以后会不会老要我来支持啊),等等。

其他同学提到了memcached,有人评论:现在memcached已经只相当于Redis最简单的功能了,只能作为缓存。Redis不仅能缓存,还能承担很多存储任务。此外还有人提及HyperDex,但其ACID特性实现Warp是专有的产品。

此前的这个大型NoSQL比较文章,仍然有一定参考价值: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

有了Cluster,Sentinel是不是就废啦。

还没那么快,Sentinel还在与Cluster并行继续开发中。目前单实例场景下需要HA的话,它还是最佳选择。但长远(可能很长远哦)看,我们会用Cluster解决Sentinel的使用场景,不过在那之前我们会很早就告诉大家的。

谁能给我更详细地讲讲"embedded string"对象编码是啥,它针对什么工作负荷?能找到的文档都太老了。

这事儿简单。一般Redis里会有包含类型字段的对象结构,还有一个指针指向实际的对象表示。假设类型是REDIS_STRING,就得有指针指向一个"sds"字符串(sds是字符串库用的名字)。

现在有了embedded string之后,就提供了一种特殊的字符串对象,用一个位置保持对象结构和字符串本身。这样内存利用更有效,而且能够大大改进内存本地性,所以差不多所有使用字符串对象的东西(字符串,或者比较大的要用字符串对象作为集合值的集合对象)性能都更好。

这种特殊字符串只用于小字符串(工作负荷里大多数字符串都不大)。

Redis

Redis是一个开源的高级key-value(键-值)缓存与存储,以高性能著称。它也常被称为数据结构服务器,因为其中的键可以存各种数据结构包括字符串、散列、列表、集合、有序集合、位图和hyperloglog。Redis的出现,很大程度补偿了memcached这类KV数据库的不足。不仅可以用于缓存,也可以用于一些场景的存储,在很多情况下是关系数据库很好的补充。它提供了Python,Ruby,Erlang,PHP客户端,使用非常方便。

正文到此结束
Loading...