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

很多开源项目中都使用了redis,这些项目为什么使用redis?使用redis有什么好处?怎么使用redis?带着这些疑问 , 我们来了解一下redis 。

干货!带你了解为什么那么多开源项目都是用Redis!
文章图片
一、什么是Redis
Redis是一个免费开源用于内存存储的数据结构服务器 , 可用作数据库 , 高速缓存和消息队列代理 。 它支持字符串、哈希表、列表、集合、有序集合等数据类型 。 它支持多种集群部署 , 辅助项目达到更高的性能 。
二、Redis的结构
Redis数据类型分为:字符串、哈希、列表、集合、有序集合等五种类型 。

干货!带你了解为什么那么多开源项目都是用Redis!
文章图片
1.String(字符串)
字符串类型是redis中最基本的数据类型 , 一个key对应一个value 。 字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频))等 , 但最大不能超过512M 。
2.Hash(哈希)
哈希类型是一个Map , 我们知道redis本身就是键值对结构 , 哈希结构就是“值”也充当键值对结构 , 如value=https://pcff.toutiao.jxnews.com.cn/p/20210202/{{value-a1,value-b1},......value-an,value-bn}}
3.list(链表)
列表类型是用来储存多个有序的字符串 , 列表中的每个字符串成为元素(element),一个列表最多可以储存2的32次方-1个元素 , 在redis中 , 可以队列表两端插入(pubsh)和弹出(pop) , 还可以获取指定范围的元素列表、获取指定索引下表的元素等 , 列表是一种比较灵活的数据结构 , 它可以充当栈和队列的角色 , 在实际开发中有很多应用场景 。
4.Set(集合)
集合类型也是用来保存多个字符串的元素 , 但和列表不同的是集合中不允许有重复的元素 , 并且集合中的元素是无序的 , 不能通过索引下标获取元素 , redis除了支持集合内的增删改查 , 同时还支持多个集合取交集、并集、差集 , 并合理的使用好集合类型
5.zset(有序集合)
有序集合也是用来保存多个字符串的元素 , 跟集合的区别在于 , 有序集合中的元素是可以排序的 , 它给每个元素设置一个分数 , 作为排序的依据 。
三、Redis的三种集群模式
Redis的三种集群模式主要是:主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和rediscluster集群模式(redis3.0版本之后) 。
1、主从模式(master-slave)

干货!带你了解为什么那么多开源项目都是用Redis!
文章图片
(1)模式来源:
同Mysql主从复制的原因一样 , Redis虽然读取写入的速度都特别快 , 但是也会产生读压力特别大的情况 。 为了分担读压力 , Redis支持主从复制 , 在主从复制中 , 数据库分为两类:主数据库(master)和从数据库(slave) 。 Redis的主从结构可以采用一主多从或者级联结构 , 客户端可对主数据库进行读写操作 , 对从数据库进行读操作 , 主数据库写入的数据会实时自动同步给从数据库 。
(2)工作机制:
当主数据库slave启动后 , 主动向从数据库master发送同步SYNC命令 。 master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令 , 然后将保存的快照文件和缓存的命令发送给slave 。 slave接收到快照文件和命令后加载快照文件和缓存的执行命令 。
复制初始化后 , master每次接收到的写命令都会同步发送给slave , 保证主从数据一致性 。
(3)优缺点
优点:master能自动将数据同步到slave , 可以进行读写分离 , 分担master的读压力;
master、slave之间的同步是以非阻塞的方式进行的 , 同步期间 , 客户端仍然可以提交查询或更新请求
缺点:不具备自动容错与恢复功能 。 主从模式下 , master节点在主从模式中唯一 , 若master挂掉 , 则redis无法对外提供写服务 , 导致客户端请求失败 , 需要等待机器重启或手动切换客户端IP才能恢复;
master宕机 , 如果宕机前数据没有同步完 , 则切换IP后会存在数据不一致的问题
难以支持动态扩容 , Redis的容量受限于单机配置 。
2、哨兵(Sentinel)

干货!带你了解为什么那么多开源项目都是用Redis!
文章图片
(1)模式来源:
主从模式的弊端就是不具备高可用性 , 当master挂掉以后 , Redis将不能再对外提供写入操作 , 因此sentinel应运而生 。 sentinel中文含义为哨兵 , 顾名思义 , 它的作用就是监控redis集群的运行状况 。 那么如何得知某一台redis服务器挂了 , 如何切换 , 如何保证备份的机器是原始服务器的完整备份呢?这时候就需要Sentinel和Replication(复制)出场了 。 Sentinel可以管理多个Redis服务器 , 它提供了监控 , 提醒以及自动的故障转移的功能;Replication则是负责让一个Redis服务器可以配备多个备份的服务器 。 Redis也是利用这两个功能来保证Redis的高可用的 。