NoSQL数据库实战派
第二章 Redis基础
缓存通过“用空间换时间”来达到数据获取的目的。
缓存的成本较高,在实际设计架构中需要权衡访问延迟和成本。
通过缓存,可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。
一般情况下,数据被存放在数据库中,应用程序直接操作数据库。当应用程序访问量达到上万条时,数据库服务器的压力会增大。如果需要减轻数据库服务器的压力:
1.实现数据库的读写分离。
2.实现数据库的分库分表。
3.使用缓存,并实现读写分离。
缓存的原理是:将应用程序已经访问过的内容或数据存储起来,当应用程序再次访问这些内容或数据时先从缓存中查找:如果缓存命中,则返回数据;如果缓存不命中,则再次查找数据库,并将得到的内容或数据保存到缓存中。
缓存具有以下缺点:
1.在系统中引入缓存,会增加系统的复杂度。
2.缓存比数据库的存储成本更高,系统部署及运行的费用也更高。
3.由于一份数据被同时存放到缓存和数据库中,甚至缓存中也会有多个数据副本,所以会存在多份数据不一致的问题。
Redis是完全开源的,并遵守BSD协议,它是一个高性能的Key-Value数据库。具有以下三个特点:
1.支持数据持久化,可以将缓存中的数据保存到磁盘中,重启后可以再次加载到这些数据进行使用。
2.不仅支持Key-Value类型的数据,还支持基于list、set、zset、hash等数据结构的存储。
3.支持Master-Salve模式的数据备份。
2.1.2 Redis的优势
Redis是基于内存的数据库,读操作和写操作都在内存中完成,速度完全超过磁盘数据库的读写速度。
Redis之所以具有很高的性能,主要得益于以下几点:
1.纯内存操作。一般都是简单的读写操作,,线程占用的时间很少,时间的花费主要集中在I/O上,所以读写数据快。
2.采用单线程模型。从而保证每个操作的原子性,也减少了线程上下文切换和竞争。
3.使用I/O多路复用模型。非阻塞I/O;使用单线程来轮询描述符;将数据库的开、关、读、写都转换成了事件;Redis采用自己实现的事件分离器,效率比较高。
4.高效的数据结构。
· 整个Redis就是一个全局哈希表,其时间复杂度是O(1),而且Redis会执行再哈希操作以防止因哈希冲突导致链表过长。并且为防止一次性重新映射时数据过大导致线程阻塞,Redis采用了渐进式再哈希,巧妙地将一次性复制分摊到多次操作中,从而避免了阻塞。
· Redis使用哈希结构和有序的数据结构加快了读写速度。
· Redis对数据存储进行了优化,对数据进行压缩存储,还可以根据实际存储的数据类型选择不同编码。
2.1.3 Redis与其他Key-Value数据库有何不同
Redis有着更为复杂的数据结构,并且提供了对它们的原子性操作(这一个不同于其他Key-Value数据库的重点)。Redis的数据类型都是基本数据结构,并且对程序员透明,程序员无需进行额外的抽象。
Redis运行在内存中,但是其数据可以持久化到磁盘中,所以在对不同数据进行高速读写时,数据量不能多于内存的存储空间。
Redis的另一个优点是:对于在磁盘上操作比较复杂的数据结构,在内存中操作它们非常简单,这样Redis可以做很多复杂性很强的事情。同时,在磁盘格式方面,内存数据库以追加方式写入数据,因为它不需要进行随机访问。