什么是Redis
Redis是完全开源免费的,遵守BSD协议,是一个高性能(NoSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言API。
BSD是"Berkeley Software Distribution"的缩进, 意思是"伯克利软件发行版"
BSD开源协议是一个给予使用者很大自由的协议。可以自由的使用, 修改源代码, 也可以将修改后的代码作为开源或者专有软件再发布。BSD代码鼓励代码共享, 但需要尊重代码作者的著作权
BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议
NoSQL
NoSQL, 泛指非关系型的数据库, NoSQL即Not-Only SQL, 它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起, 非关系型数据库现在成了一个极其热门的新领域,非关系型数据库产品的发展非常迅速
而传统的关系型数据库在应用web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态的网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1. High performance -- 对数据库库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系型数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写请求,硬盘IO已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
2. Huge Storage -- 对海量数据的高效率存储和访问的需求
类似Facebook, twitter, Friendfeed这样的SNS网站,每天用户生产海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系型数据库来说,在一张2.5亿条记录的表里进行SQL查询,效率是及其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯、盛大、动辄以亿记的账号,关系型数据库也很难应付
3. High Scalability && High Availability -- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是很难进行横向扩展的,当一个应用系统的用户量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据库迁移,为什么数据库態通过不断的添加服务器节点来实现扩展呢?
NoSQL数据库的产生就是为了解决大规模数据集合多重数据类型带来的挑战,尤其是大数据应用难题。
NoSQL的类别
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key-Value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/Value就显得很效率低下了。
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于大量数据的高访问负载
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它的特点是指向了多个列。这些列是由列家族来安排的。
相关产品: Cassandra, HBase, Riak
典型应用: 分布式文件系统
数据模型: 以列簇式存储,将同一列存在一起
优势: 查找速度快,可扩展性强,更容易进行分布式扩展
劣势: 功能相对局限
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储。比如JSON。文档型数据库可以看做是键值数据库的升级版本,允许之间嵌套键值。而且文档型数据库比键值型数据库的查询效率更高。
相关产品: CouchDB、MongoDB
典型应用: Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势: 数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一化的查询语法
图形(Graph)数据库
图形结构的数据库痛其他行列以及刚性结构的SQL数据库不同,它使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API
相关数据库: Neo4J、InfoGrid、Infinite Graph
典型应用: 社交网络
数据模型: 图结构
优势: 利用图结构相关算法
劣势: 需要对整个图做计算才能得到结果,不容易做分布式的集群方案。
Redis描述
什么是Redis
Redis是完全开源免费的、准守BSD协议的、是一个高性能(NoSQL)的Key-Value数据库,Redis是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis的优点
- 性能极高 -- Redis能读的速度是110000次/s, 写的速度是81000次/s
- 丰富的数据类型 -- Redis支持的类型String、Hash、List、Set及Ordered Set数据类型操作
- 原子性 -- Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
- 丰富的特性 -- Redis还支持publish/subscribe, 通知、key过期等特性
- 高速读写 -- Redis使用自己实现的分离器,代码量很少, 没有使用lock(MySQL), 因此效率非常高
Redis是一个简单的、高效的、分布式的,基于内存的缓存工具。架设好服务器后,通过网络连接(类似数据库),提供Key-Value式缓存服务。简单是Redis突出的特色。简单可以保证核心功能的稳定和优异。
Redis的缺点
- 持久化 -- Redis直接将数据存储在内存中,要将数据保存到磁盘上,Redis可以使用两种方式实现持久化过程。定时快照(snapshot): 每隔一段时间将整个数据库写到磁盘中,每次均是写全部数据,代价非常高。第二种方式是语句追加(AOF): 只追踪变化的数据,但是追加的log可能过大,同时所有的操作均重新执行一遍,回复速度慢
- 耗内存 -- 占用内存过高
Redis的应用场景
企业级开发中:
可以用作数据库、缓存、热点数据(经常会被查询,但是不经常被修改或者删除的数据)和消息中间件等大部分功能。
Redis常用的场景如下:
1. 缓存
缓存现在几乎是所有大中型网站都在用的必杀技,合理的利用缓存不仅能够提高网站的访问速度,还能大大降低数据库的压力。Redis提供键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多
2. 排行榜
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类型能实现各种复杂的排行榜应用
3. 计数器
什么是计数器,如电商网站的浏览量、视频网站视频的播放量等。为了保证数据实效性、每次浏览都得+1,并发量高时如果每次都请求数据库操作无疑是一种挑战和压力,Redis提供的incr命令来实现计数器的功能,内存操作,性能非常好,非常适用于这些计数场景
4. 分布式会话
集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务以及内存数据库管理
5. 分布式锁
很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问并不理想,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。
6. 社交网络
点赞、踩、关注/被关注、共同好友等是社交网络的基本功能,社交网站的访问量通常来说是比较大的,而且传统的数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的实现这些功能
7. 最新列表
Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。
8. 消息系统
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰以及异步处理实时性低的业务。Redis提供了发布/订阅以及阻塞队列功能,能实现一个 简单的消息队列系统。另外,这个不能和专业的消息中间件相比