一、简介

  Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。

1.1 历史与发展

  2008年,意大利的一家创业公司Merzia推出了一款基于M有SQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并与2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望让更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发。
  Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。
  VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分别于同年的3月和5月加入VMware,全职开发Redis。
  Redis的代码托管在GitHub上,开发十分活跃。

1.2 特性

1.2.1 存储结构

  RedisREmote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样,Redis字典中的键除了可以是字符串,还可以是其他数据类型。常见的支持的键值数据类型如下:

  • 字符串类型(string)
  • 散列类型(hash)
  • 列表类型(list)
  • 集合类型(set)
  • 有序集合类型(zset/sorted set)

  这种字典形式的存储结构与常见的MySQL等关系型数据库的二维表形式的存储结构有很大的差异。

1.2.2 内存存储于持久化

  Redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于磁盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑上,Redis可以在一秒内读写超过10万个键值。
  将数据存储在内存中也有问题,比如程序退出后内存中的数据会丢失,不过Redis提供了对持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务。

1.2.3 功能丰富

  Redis虽然是作为数据库开发的,但由于其提供了丰富的功能,越来越多的人将其用作缓存、队列系统等。Redis可谓是名副其实的多面手。
  Redis可以为每个键设置生存时间(Time To Live,TTL),生存时间到期后键会自动被删除。这一功能配合出色的性能让Redis可以作为缓存系统来使用,而且由于Redis支持持久化和风度的数据类型,使其成为了另一个非常流行的缓存系统Memcached的有力竞争者。

  关于Redis和Memcached优劣的讨论一直是一个热门的话题,在性能上Redis是单线程模型,而Memcached支持多线程,所以在多核服务器上后者的性能理论上相对更高一些。然而,Redis的性能已经足够优异,在绝大部分场合下其性能都不会成为瓶颈,所以在使用时更应该关心的是二者在功能上的区别。随着Redis3.0的推出,标志着Memcached几乎所有功能成为了Redis的子集。同时,Redis对集群的支持使得Memcached原有的第三方集群工具不再成为优势。因此,在新项目中使用Redis代替Memcached将会是非常好的选择。

  作为缓存系统,Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定的规则自动淘汰不需要的键。
  除此之外,Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易地实现一个高性能的优先级队列。同时在更高层面上,Redis还支持“发布/订阅”的消费模式,可以基于此构建聊天室等系统。

1.2.4 简单稳定

  Redis直观的存储结构使得通过程序与Redis交互十分简单。在Redis中使用命令来读写数据,命令语句之于Redis就相当于SQL语言之于关系数据库。例如在关系数据库中要获取posts表内id为1的记录的title字段的值,可以使用如下SQL语句实现:

select title from posts where id = 1

  相对应的,在Redis中要读取键名为post:1的散列类型键的title字段的值,可以使用如下命令语句实现:

HGET post:1 title

  其中HGET就是一个命令。
  Redis使用C语言开发,代码量只有3万多行。这降低了用户通过修改Redis源代码来使之更适合自己项目需要的门槛。对于希望“榨干”数据库性能的开发者而言,这无疑是一个很大的吸引力。





参考:《Redis入门指南(第2版)》


author:su1573
鄙人记录生活点滴,学习并分享,请多指教!!!
如需交流,请联系 sph1573@163.com,鄙人看到会及时回复

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐