一、Redis的历史与发展
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统 LLOOGG,然而没过多久该公司的创始人Salvatore Sanfilippo 便开始对MySQL的性能感 到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据 库就是Redis。不过Salvatore Sanfilippo 并不满足只将Redis 用于LLOOGG 这一款产品,而是 希望让更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis 的另一名主要的代码贡献者Pieter Noordhuis 一起继续着Redis 的开发,直到今天
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司 在使用Redis。国内如新浪微博、街旁和知乎,国外如GitHub、StackOverflow、Flickr、暴雪 和Instagram,都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分 别于同年的3月和5月加入VMware,全职开发Redis。
Redis的代码托管在GitHub上,开发十分活跃 。2015年4月2日,Redis发布了3.0.0的正 式版本
Redis 2.6对Redis 2.4的改进:
Redis 2.6支持Lua脚本、毫秒精度的过期操作、一些二进制位操作
Redis 2.6之前只能接受单个参数的命令(比如RPUSH、LPUSH、SADD等),从Redis 2.6起可以接受多个参数了
二、Redis与其他数据库和软件的对比
三、Redis的特性
存储结构
有过脚本语言编程经验的读者对字典(或称映射、关联数组)数据结构一定很熟悉,如 代码 dict["key"] = "value"中 dict 是一个字典结构变量,字符串"key "是键名,而"value"是键 值,在字典中我们可以获取或设置键名对应的键值,也可以删除一个键
Redis是REmote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数 据,并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样, Redis字典中的键值除了可以是字符串,还可以是其他数据类型。到目前为止 Redis 支持的键 值数据类型如下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型
这种字典形式的存储结构与常见的 MySQL等关系数据库的二维表形式的存储结构有很 大的差异。举个例子,如下所示,我们在程序中使用post变量存储了一篇文章的数据(包括 标题、正文、阅读量和标签):
post["title"] = "Hello World!" post["content"] = "Blablabla..." post["views"] = 0 post["tags"] = ["PHP", "Ruby", "Node.js"]
如果使用关系数据库存储,一般会将其中的标题、正文和阅读量存储在一个表中,而将标签 存储在另一个表中,然后使用第三个表连接文章和标签表[5] 。需要查询时还得将3个表进行 连接,不是很直观。而 Redis 字典结构的存储方式和对多种键值数据类型的支持使得开发者 可以将程序中的数据直接映射到 Redis 中,数据在 Redis 中的存储形式和其在程序中的存储 方式非常相近
使用 Redis 的另一个优势是其对不同的数据类型提供了非常方便的操作方 式,如使用集合类型存储文章标签,Redis可以对标签进行如交集、并集这样的集合运算操作
内存存储与持久化
Redis 数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此 Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑 上,Redis可以在一秒内读写超过10万个键值。
将数据存储在内存中也有问题,比如程序退出后内存中的数据会丢失。不过Redis提供了 对持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务
功能丰富
Redis 虽然是作为数据库开发的,但由于其提供了丰富的功能,越来越多的人将其用作 缓存、队列系统等。Redis可谓是名副其实的多面手。
Redis 可以为每个键设置生存时间(Time To Live,TTL),生存时间到期后键会自动被 删除。这一功能配合出色的性能让Redis可以作为缓存系统来使用,而且由于Redis支持持久 化和丰富的数据类型,使其成为了另一个非常流行的缓存系统Memcached的有力竞争者
讨论 关于 Redis 和 Memcached 优劣的讨论一直是一个热门的话题。在性能上 Redis是单 线程模型,而Memcached支持多线程,所以在多核服务器上后者的性能理论上相对更高一 些。然而,前面已经介绍过,Redis的性能已经足够优异,在绝大部分场合下其性能都不会成 为瓶颈,所以在使用时更应该关心的是二者在功能上的区别。随着Redis 3.0 的推出,标志着 Memcached几乎所有功能都成为了Redis的子集。同时,Redis对集群的支持使得Memcached 原有的第三方集群工具不再成为优势。因此,在新项目中使用Redis代替Memcached将会是 非常好的选择
作为缓存系统,Redis 还可以限定数据占用的最大内存空间,在数据达到空间限制后可 以按照一定的规则自动淘汰不需要的键
除此之外,Redis 的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易 地实现一个高性能的优先级队列。同时在更高层面上,Redis 还支持“发布/订阅”的消息模 式,可以基于此构建聊天室等系统
简单稳定
即使功能再丰富,如果使用起来太复杂也很难吸引人。Redis 直观的存储结构使得通过 程序与Redis交互十分简单。在Redis中使用命令来读写数据,命令语句之于Redis就相当于 SQL语言之于关系数据库。例如在关系数据库中要获取posts表内id为1的记录的title字段的值 可以使用如下SQL语句实现:
SELECT title FROM posts WHERE id = 1 LIMIT 1
相对应的,在Redis中要读取键名为post:1的散列类型键的title字段的值,可以使用如下命 令语句实现:
HGET post:1 title
其中HGET就是一个命令。Redis提供了100多个命令,听起来很多,但 是常用的却只有十几个,并且每个命令都很容易记忆
四、附加
Redis提供了几十种不同编程语言的客户端库,这些库都很好地封装了Redis的命令,使 得在程序中与 Redis 进行交互变得更容易。有些库还提供了可以将编程语言中的数据类型直 接以相应的形式存储到Redis中(如将数组直接以列表类型存入Redis)的简单方法,使用起 来非常方便
Redis使用C语言开发,代码量只有3万多行。这降低了用户通过修改Redis源代码来使之 更适合自己项目需要的门槛。对于希望“榨干”数据库性能的开发者而言,这无疑是一个很大 的吸引力
Redis 是开源的,所以事实上 Redis 的开发者并不止 Salvatore Sanfilippo 和 Pieter Noordhuis。截至目前,有将近100名开发者为Redis贡献了代码。良好的开发氛围和严谨的版 本发布机制使得 Redis 的稳定版本非常可靠,如此多的公司在项目中使用了 Redis 也可以印 证这一点
Redis完整的命令列表可以在:https://redis.io/commands中找到
————————————————
版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41453285/article/details/103210260

