干货!带你了解为什么那么多开源项目都是用Redis!( 三 )


可线性扩展到1000多个节点 , 节点可动态添加或删除;
能够实现自动故障转移 , 节点之间通过gossip协议交换状态信息 , 用投票机制完成slave到master的角色转换;
缺点:客户端实现复杂 , 驱动要求实现SmartClient , 缓存slotsmapping信息并及时更新 , 提高了开发难度;slave充当“冷备” , 不能缓解读压力;批量操作限制 , 目前只支持具有相同slot值的key执行批量操作 , 对其他的如sunion、mset和mget等支持不是很好;
不支持多数据库空间 , 单机redis可以支持16个db , 从db0到db15 , 而集群模式下只能使用一个 。
综上所诉 , 主从模式和哨兵模式都不利于扩展 , 系统的高可用性都依赖于master的内存大小 , 哨兵模式在redis2.6开始支持 , 2.8稳定 , cluster模式是redis可扩展的模式 。
四、Redis的运用
Redis可用作数据库 , 高速缓存和消息队列代理 , 那么当你打算使用它们这些功能的时候 , 可以考虑一下与其他产品的对比 , 选出一个更好用的 。
1、redis与Mysql/Oracle数据库比较
Mysql/Oracle等数据库可以将数据保存数据库当中 , 应用启动以后建立数据库连接就可以通过代码逻辑对数据库进行中增删改查 。 而Redis也是可以做为数据库来使用的 , 它可以看做一个key/value型数据库 , Redis会根据配置定时将内存中的数据写入到硬盘中 , 但我们在项目中一般不会将Redis直接当作数据库来使用 , 主要原因在于:
(1)Redis只能存储key/value类型 , 虽然value的类型可以有多种 , 但是对于关联性的记录查询 , 没有Oracle/Mysql方便 。
(2)Redis内存数据写入硬盘有一定的时间间隔 , 在这个间隔内数据可能会丢失 , 安全性不高 。
2、redis高速缓存
redis做为高速缓存 , 这也是redis应用最广的地方 。 对于那些经常被查询,不经常被修改和删除的数据 , 利用Redis缓存可以提升网站的访问速度,大大降低数据库的压力 。 redis作为高速缓存 , 带来这么大的优势的同时也存在一定的弊端 , 因为Redis是存放在内存中的,就会导致内存占用过高,另外持久化的代价也过高 。
相比于其他的缓存工具 , 比如Ehcache和Memcached , 开源项目使用redis的比例还是要略高一点 , redis同这些缓存工具相比 , 有以下特征或者优势:
(1)结构简单 , key/value型数据库 , 赋值取值方式简单 。 但同时它的数据结构又非常丰富 , 它支持字符串、哈希表、列表、集合、位图等数据类型 。
(2)支持多语言集成 , redis发展到今天 , Redis客户端支持多种语言 , 包括:C、C++、C#、php、java、python、go等语言 , 根据自己的开发语言 , 选择合适的redisclient版本类型即可 。 并且每一种语言下还包括多种类型可供选择 , 比如Java语言 , redisclient提供了诸如Jedis、Redisson、JRedis、JDBC-Redis、RJC、redis-protocol、aredis、lettuce等类型可供选择 , 目前比较推荐使用的是Jedis、Redisson 。
(3)支持直连模式 , 哨兵模式(Sentinal) , 集群模式等 , 用于负载均衡和容灾 , 具有高可用性 。
3、redis持久化
redis的数据是存储在内存中的 , 如果搭载redis的服务器哪天突然心情不好 , 宕机不干活了 , 就会导致所有的缓存都丢失了 。 虽然可以把Redis服务器重新上线 , 但是由于内存的数据丢失 , 造成了缓存雪崩 , 应用服务器和数据库的压力一下子就上来了 , 对于一些并发很高的应用 , 说不动此时就导致应用崩溃无法访问 。 这个时候Redis的持久化功能就派上用场了 , 可以缓解一下缓存雪崩带来的影响 。 redis的持久化指的是redis会把内存的中的数据写入到硬盘中 , 在redis重新启动的时候加载这些数据 , 从而最大限度的降低缓存丢失带来的影响 。
4、做为消息队列
【干货!带你了解为什么那么多开源项目都是用Redis!】Redis也是可以做为消息队列的 , 对于一些要求不高的运用场景可以使用redis , redis具备发布订阅功能 。 而如果专门来做消息队列处理或者要求比较 , 那还是选择更专业一点的Kafka、rabbitMQ等 。