资料内容:
1.2 高并发利器Redis
任何高并发的系统,不可或缺的就是缓存。Redis缓存目前已经成为缓存的事实标准。
1.2.1 什么是Redis
Redis是Remote Dictionary Server(远程字典服务器)的缩写,最初是作为数据库的工具
来使用的。是目前使用广泛、高效的一款开源缓存。Redis使用C语言开发,将数据保存在内
存中,可以看成是一款纯内存的数据库,所以它的数据存取速度非常快。一些经常用并且创
建时间较长的内容,可以缓存到Redis中,而应用程序能以极快的速度存取这些内容。举例
来说,如果某个页面经常会被访问到,而创建页面时需要多次访问数据库、造成网页内容的
生成时间较长,那么就可以使用Redis将这个页面缓存起来,从而减轻了网站的负担,降低
了网站的延迟。
Redis通过键-值对(Key-Value Pair)的形式来存储数据,类似于Java中的Map映射。Redis
的Key键,只能是string字符串类型。Redis的Value值类型包括:string字符类型、map映射类
型、list列表类型、set集合类型、sortedset有序集合类型。
Redis的主要应用场景:缓存(数据查询、短连接、新闻内容、商品内容等)、分布式
会话(Session)、聊天室的在线好友列表、任务队列(秒杀、抢购、12306等)、应用排行
榜、访问统计、数据过期处理(可以精确到毫秒)。
1.2.2 Redis成为缓存事实标准的原因
相对于其他的键-值对(Key-Value)内存数据库(如Memcached)而言,Redis具有如下
特点:
(1)速度快 不需要等待磁盘的IO,在内存之间进行的数据存储和查询,速度非常快。
当然,缓存的数据总量不能太大,因为受到物理内存空间大小的限制。
(2)丰富的数据结构 除了string之外,还有list、hash、set、sortedset,一共五种类型。
(3)单线程,避免了线程切换和锁机制的性能消耗。
(4)可持久化 支持RDB与AOF两种方式,将内存中的数据写入外部的物理存储设备。
(5)支持发布/订阅。
(6)支持Lua脚本。
(7)支持分布式锁 在分布式系统中,如果不同的节点需要访同到一个资源,往往需
要通过互斥机制来防止彼此干扰,并且保证数据的一致性。在这种情况下,需要使用到分布
式锁。分布式锁和Java的锁用于实现不同线程之间的同步访问,原理上是类似的。
(8)支持原子操作和事务 Redis事务是一组命令的集合。一个事务中的命令要么都执
行,要么都不执行。如果命令在运行期间出现错误,不会自动回滚。
(9)支持主-从(Master-Slave)复制与高可用(Redis Sentinel)集群(3.0 版本以上)
(10)支持管道 Redis管道是指客户端可以将多个命令一次性发送到服务器,然后由
服务器一次性返回所有结果。管道技术的优点是:在批量执行命令的应用场景中,可以大大
减少网络传输的开销,提高性能。
1.3 分布式利器ZooKeeper
单体应用在达到了性能瓶颈之后,就必须靠分布式集群解决高并发问题,而集群的分布
式架构和集群节点之间的交互协调,一定少不了可靠的分布式协调工具,ZooKeeper就是目
前极为重要的分布式协调工具。
1.3.1 什么是ZooKeeper
ZooKeeper最早起源于雅虎公司研究院的一个研究小组。在当时,研究人员发现,在雅
虎内部很多大型的系统需要依赖一个类似的系统进行分布式协调,但是这些系统往往存在分
布式单点问题。所以雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架。
此框架的命名过程,也是非常有趣的。在项目初期给这个项目命名的时候,准备和很多
项目一样,按照雅虎公司的惯例,使用动物的名字来命名的(例如著名的Pig项目)。在探
讨取什么名字的时候,研究院的首席科学家Raghu Ramakrishnan开玩笑说:再这样下去,我
们这儿就变成动物园了。此话一出,大家纷纷表示新框架就叫动物园管理员吧,于是,
ZooKeeper(动物园管理员)的名字由此诞生了。并且,ZooKeeper的功能,正好是用来协调
分布式环境不同节点的,形象的说,可以理解为协调各个以动物命名的分布式组件,所以,
ZooKeeper这个名字也就“名副其实”了。