1.1  Redis简介   

        Redis是一种基于键值对(key-value)的NoSQL数据库,其中Redis的值可以是string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计算法)、GEO(地理信息定位)等多种数据结构和算法组成。且因为Redis是将所有数据都存放在内存中,所以它的读写性能非常惊人,官方给出的读写性能可以达到10万/秒。不仅如此,Redis还提供了数据的持久化功能,保证服务器故障时数据不会“丢失”。除了上述这些,Redis还提供了键过期,避免内存溢出、发布订阅、事务、流水线、Lua脚本等附加功能。总之,在合适的场景使用好Redis是我们项目开发的一把利器。

 

1.2  Redis特性

        Redis之所以能够受到很多公司的青睐,主要归功于它的8个重要的特性。

       速度快

        (1)Redis所有的数据都是存放在内存中,这是Redis速度快的主要原因。

        (2)Redis是用C语言实现的,一般来说C语言实现的程序与操作系统更加接近,执行速度相对会更快一些。

        (3)Redis使用了单线程家否,预防了多乡村可能产生的资源竞争问题。

        (4)Redis源码可以说是精打细磨,是少有的集性能和优雅于一身的开源代码。

        基于键值对的数据结构服务器

        Redis的值可以是string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),同时在字符串的基础之上演变出了Bitmaps(位图)和HyperLogLog(基数统计算法)两种神奇的数据结构,并随着LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中加入有关GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种有意思的应用。

       丰富的功能

        (1)提供了键过期功能,可以用来实现缓存。

        (2)提供了发布订阅功能,可以用来实现消息系统。

        (3)支持Lua脚本功能,可以利用Lua创在出新的Redis命令。

        (4)提供了简单的事务功能,能在一定程度上保证事务特性。

        (5)提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少网络的开销。

        简单稳定

        (1)Redis源码很少,早起版本的diamante只有2万行左右,3.0版本添加集群特性后代码增至5万行左右,方便开发者研究或量身定制Redis。

        (2)Redis使用单线程模型,不仅Redis服务端处理模型变得简单,且客户端开发也变得简单。

        (3)Redis不需要依赖于操作系统中的类库,Redis自己实现了事件处理的相关功能。

        (4)以上说明Redis很简单,但不代表它不稳定,以本书作者维护的上千个Redis为例 ,没有出现过因为Redis自身bug而宕掉的情况。

        客户端语言多

        Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,如java、PHP、python、C、C++、Nodejs等。

        持久化

        通常数据存放在内存中是不安全的,一旦服务器发生故障,内存中的数据可能就会丢失,因此Redis提供了两种持久化方式RDB和AOF,可根据两种不同的策略将数据持久化到磁盘中。保证数据的安全。

        主从复制

        Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能也是分布式Redis的基础。

        高可用和分布式

        Redis从2.8版本正式提供了高可用实现Redis Sentinel(哨兵模式),它能保证Redis节点的故障发现和故障自动转移。Redis从3.0版本提供了分布式实现Redis Cluster(集群),它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。

 

1.3  Redis使用场景

        Redis可以做什么

        (1)缓存。缓存机制是所有大型网址必不可少的一部分,合理的使用缓存不仅可以加快数据的访问速度,还能够降低后端数据源的访问压力。Redis提供了键过期的功能,并且还提供了灵活控制最大内存和内存溢出后的淘汰策略,可以说缓存的合理设计能够为我们网站的稳定保驾护航。

        (2)排行榜系统。Redis提供了列表和有序集合数据结构,合理的使用这些数据结构可以很方便地构建各种排行榜系统。

        (3)计数器应用。网站中通常会有访问量、视频播放量的实时统计,如果使用传统的关系数据库对于并发量很大的情况是一种挑战,Redis天然支持计数功能且性能也非常好,是计数系统很好的选择。

        (4)社交网络。在社交平台,赞/踩、粉丝、共同好友、推送等是社交网络必备的功能,且社交网络访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。

        (5)消息队列系统可以说是一个大型网站必备的基础组件,因为其具有业务解耦、非实时业务削峰等特性,Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够强大,但是对于一般的消息队列功能基本可以满足。

        Redis不可以做什么

       (1)站在数据规模的角度看,Redis的数据是存放在内存中的,但如果数据量非常大,经济成本相当的高。

        (2)站在数据冷热的角度看,热数据通常是指需要频繁操作的数据,可以放在Redis中加速读写,减轻后端存储的压力。反之冷数据属于不一定经常需要访问的数据,如果将冷数据放在Redis中,基本上是对于内存的一种浪费。

 

1.4  用好Redis的建议

        切勿当做黑盒使用,开发与运维同样重要

        很多使用Redis的开发者认为只要会用API开发相应的功能就可以,更有甚者认为Redis就是get、set、del,不需要知道Redis的原理。但是在我们实际运维和使用Redis的过程中发现,很多线上的故障和问题都是由于完全把Redis当做黑盒造成的,如果不了解Redis的单线程模型,有些开发者会在有上千万个键的Redis上执行keys * 操作。诸如此类的事故还有很多,总之深入了解、学习Redis的一些原理,能够让开发或运维人员更好的运用Redis,避免此类问题的发生。

        阅读源码

        通过阅读源码,不仅能加深我们对Redis的理解, 还能提升自身的编码水平,甚至可以对Redis做定制化。如新浪微博在Redis的早起版本上做了很多定制化来满足自身的需求。