0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有关Redis的一些思考和理解

电子设计 来源:电子设计 作者:电子设计 2020-10-30 11:21 次阅读

本篇文章不是一篇具体的教程,笔者打算记录一下自己对 Redis 的一些思考。说来惭愧,笔者刚接触 Redis 的时候只是简单地使用了一下,背了一些面试题,就在简历上写下了 Redis 这个技能点。

我们能在网络上轻易地找到关于 Redis 具体知识点的讲解,但很少有文字说明为什么会有这项技术,笔者希望通过本文总结一下个人目前对 Redis 的理解。

1. 初识 Redis

最开始的时候,笔者是通过网络上面的一些项目教程了解到 Redis 的,当时教程里说把首页数据放到 Redis 里,能够加快首页数据的访问速度,于笔者我就照做了。代码跑起来后,发现好像确实加载得蛮快的,就当完成了。

项目做完后,写到了简历里,顺便在技能里写上熟练使用 Redis,再背了几道关于 Redis 的数据类型,持久化机制的面试题,便去找实习了。

当时面试的时候面试官问笔者:你为什么使用 Redis 呀?

笔者按照项目教程里说的复述了一遍:因为能让首页更快地加载数据,咱们的产品首页是很重要,越快加载出数据,用户越满意。

现在回想起来真是哭笑不得,你也不能说这个回答有问题,Redis 用作缓存的一大亮点就是能够加快数据查询效率,但是如果从技术面试的角度看,这个回答其实更应该从技术的角度去答,这也是促使笔者写这篇文章的冲动之一。

2. 为什么要有 Redis 这项技术?(你为什么用 Redis)

如果现在再被问到为什么要用 Redis,笔者打算从计算机的存储结构开始聊。

计算机界有一本名书《深入理解计算机系统》,里面有一幅关于计算机存储结构的图,非常经典:

由图可见计算机的存储器是一个金字塔结构,越上层的存储器存储效率越高,越下层的存储效率越低。而计算机中内存的层级位于磁盘之上,内存的存储效率要比磁盘快得多。

正常情况下,我们会把应用的数据存放在数据库中,数据库把数据存放在磁盘;而 Redis 是一款基于内存的存储系统,数据都存在内存里,这就是从 Redis 读取数据比从数据库读取数据要快的根本原因了。

看到这里你可能会说,把数据存在内存有啥了不起的,我可以用谷歌的 guava 呀!再不济,我可以直接 new 一个 HashMap 存数据呀,这不都是基于内存的吗?

这个问题让我联想起了我在网上看面经的时候看到的一道题:如果让你设计一个缓存,你会怎么设计?

大家可以想一下 guava 和 Map 集合使用时的缺点是什么?

很明显一点就是这两者虽然基于内存,但他们使用的是 jvm 的内存,如果 jvm 挂掉或者重启了,数据也就丢失了。这就能方便我们联想到 Redis 的持久化机制,Redis 的持久化机制使得内存中的数据能够持久化到磁盘上,解决内存数据掉电易失的问题,而且 Redis 是一款中间件,无需依赖于 jvm。

(当初我只是死背 Redis 的持久化机制,并没有想过为什么。我想搞清楚了这背后的关系后再去学习,能够学得更扎实一些吧)

再换一个角度:既然数据库是因为磁盘才慢,那为啥不再内存里实现数据库呢?

还别说,SAP 公司还真有基于内存的数据库系统,但是使用内存有一个致命的缺点:那就是贵!能买得起那套软件和巨大内存机器的公司毕竟是少数,所以说为什么要使用 Redis,就是因为他在低效的磁盘和昂贵的内存中取了一个折中。

补充:面试的时候还被问到一个问题:Redis 的内存淘汰机制

当时直接懵圈了,后来想了一下其实这是一个再正常不过的考点了:Redis 把数据存放在内存,内存的空间有限,总会有用完的一天。当内存使用完之后肯定需要有相应的内存淘汰策略来释放内存。

不过说到内存淘汰,我还想起一个高级点的知识点,由于 Redis 的内存是有限的,我们使用内存的时候应该更加小心。Redis 内部是有许多高效使用内存的招数的,比如说我们存放用户信息的时候,把用户信息存成一个 hash,要比把用户信息逐条用 key-value 存储占的空间小得多,这些知识你可以在 Redid 的官网上找到。

3. 关于 Redis 的主从复制,哨兵,集群

在学习 Redis 之前,我对分布式的知识了解得非常少。当时为了面试背 Redis 的面试题,背到有关主从复制,哨兵,集群等知识点的时候,我既兴奋又茫然。感觉自己背完后掌握了许多分布式的知识,但是把这些知识点都揉在一起了,根本不知道这背后的逻辑是什么。现在想通了一些,应该好好记下来:

在扩展到多机之前,我们先想一下单机的 Redis 有什么缺点:

有可能出现单点故障,这样 Redis 服务就不可用了

单一台机器的内存有限,存储不了太多的数据

如果访问量很大的话,单台机器压力会很大

通过第一个缺点,我们可以引出为什么需要主从复制和哨兵。大家想一想,如果我们只有一个 Redis 服务,要是服务挂了就没法用了,但如果我们安排多一台 Redis 服务器,它的数据时刻与第一台 Redis 的数据保持一致,这样当第一台 Redis 挂掉后,我们就可以把请求迁移到第二台 Redis 上,这样 Redis 服务的可用性就提高了。为了让第二台 Redis 的数据与第一台 Redis 保持一致,我们就需要用到主从复制。

有时候,可能一主一从的配置还是不够保险,这个时候我们就要为主节点配置两个或以上的从节点,那么问题来了,要是主节点挂了,该通过什么方案在从节点中选出新的主节点呢?这就用到了哨兵机制。

而且在一主多从的情况下,我们使用主从复制让多台 Redis 的数据保持一致,这个时候我们就可以把读请求分摊到从节点上,这样能有效缓解主节点的读压力。

但如果 Redis 的写请求压力也很大,而且数据量很大,这个时候为 Redis 增加备份机的横向扩展已经帮不上什么忙了,这个时候我们就要考虑纵向扩展,增加多台 Redis 分摊写请求,让不同的 key 落到不同的机器上。这个时候我们就要考虑使用一致性哈希等算法把不同的 key 分给不同的机器。

Redis 自身也提供了集群机制,但内部使用的不是一致性哈希,而是哈希槽。简单来说就是在哈希槽中划分不同的区间,不同的区间对应不同的机制;当扩容或缩减的时候有相应的哈希槽调整策略。

我最初学习 Redis 的多机策略的时候就是搞不清楚集群,主从复制,哨兵机制之间的关系。其实集群就是一套完整的 Redis 多机解决方案,他有效解决了单机 Redis 的所有问题。当你在集群中为某个节点配置从机的时候,主从节点间同步用的就是主从复制。主节点挂掉之后,从节点的选取,内部的逻辑就和哨兵机制相似。当我们使用集群机制的时候,就可以省去自己写类似一致性哈希这样的分摊逻辑,集群机制会给节点加上相应的数据结构来完成这些功能。

如果想深入了解集群背后的实现原理,我推荐这样一个学习路线:

首先登录官网,按照官网的步骤学习配置主从复制,配置哨兵,搭建集群

然后看《Redis 的设计与实现》这本书,阅读主从复制,哨兵和集群这三个章节

4. 后话

笔者觉得,如果把文章中提到的 Redis 的点都深入了解一下,Redis 基本能算入门了。

写下这篇感想主要也是想提醒自己,学一项技术的时候多问为什么,这样知识学到手后不容易忘掉。

至于为什么说只能说是入门 Redis,因为 Redis 的用法实在太多了,你可以把它当作缓存,也可以把它当成数据库,甚至能把它当作消息队列。缓存可能大家都很熟悉了,在当数据库的方面 Redis 简直是潜力无限,大家一定要善用它的 bitmap 位图功能,简直能在面对复杂需求的时候玩出花来。比如说老板要统计所有用户一年中的登录天数,一个用户只需要 365bit(46B)的空间,相比于用传统的 mysql 不知道也节省多少倍的空间。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Redis
    +关注

    关注

    0

    文章

    379

    浏览量

    10982
收藏 人收藏

    评论

    相关推荐

    Redis实战笔记

    在目前的技术选型中,Redis 俨然已经成为了系统高性能缓存方案的事实标准,因此现在 Redis 也成为了后端开发的基本技能树之。   基于上述情况,今天给大家分享份 杰哥 亲笔撰
    的头像 发表于 02-09 09:12 105次阅读
    <b class='flag-5'>Redis</b>实战笔记

    Redis Cluster之故障转移

    1. Redis Cluster 简介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 为什么要实现 Redis
    的头像 发表于 01-20 09:21 291次阅读
    <b class='flag-5'>Redis</b> Cluster之故障转移

    一些关于ldc1000的spi通信的问题求解

    我有一些关于ldc1000的spi通信的问题。 应用情况是spi16f887与ldc1000的spi通信 1.是否对于读、写,都是只需要把CSB变成低电平即可。 2.对于写操作,写地址时(例如
    发表于 12-26 08:23

    Redis缓存与Memcached的比较

    Redis和Memcached都是广泛使用的内存数据存储系统,它们主要用于提高应用程序的性能,通过减少对数据库的直接访问来加速数据检索。以下是对Redis和Memcached的比较,涵盖了它们的一些
    的头像 发表于 12-18 09:33 265次阅读

    一些常见的动态电路

    无论是模电还是数电,理论知识相对来说还是比较枯燥,各种电路原理理解清楚不算容易,换种生动形象的方式或许会增加一些趣味性,也更容易理解这些知识。下面整理了
    的头像 发表于 11-16 09:26 531次阅读
    <b class='flag-5'>一些</b>常见的动态电路

    分享一些常见的电路

    理解模电和数电的电路原理对于初学者来说可能比较困难,但通过一些生动的教学方法和资源,可以有效地提高学习兴趣和理解能力。 下面整理了一些常见的电路,以动态图形的方式展示。 整流电路 单相
    的头像 发表于 11-13 09:28 441次阅读
    分享<b class='flag-5'>一些</b>常见的电路

    LED驱动器应用的一些指南和技巧

    电子发烧友网站提供《LED驱动器应用的一些指南和技巧.pdf》资料免费下载
    发表于 09-25 11:35 0次下载
    LED驱动器应用的<b class='flag-5'>一些</b>指南和技巧

    智能跳绳的产品体验与思考

    我,虽称不上跳绳高手,却对这项运动怀有深厚的热爱,也曾在某电商平台上选购过款智能跳绳,希望能借此提升我的跳绳技巧。今天,咱们就来聊聊我和这条绳子的发生的一些故事,外加我的一些思考
    的头像 发表于 05-29 11:22 497次阅读
    智能跳绳的产品体验与<b class='flag-5'>思考</b>(<b class='flag-5'>一</b>)

    Redis 开源协议调整,我们怎么办?

    许可,时间点恰逢刚刚完成最新轮融资,宣布的时机耐人寻味。 Redis 协议调整,对云计算厂商的影响 Redis 协议调整听起来可能没什么,但在开源项目领域是个大问题。这并不是
    的头像 发表于 05-09 22:59 485次阅读
    <b class='flag-5'>Redis</b> 开源协议调整,我们怎么办?

    Redis开源版与Redis企业版,怎么选用?

    Redis开源版,二者有何不同?该如何选择?Redis企业版Redis企业版基于开源Redis构建,企业版将开发人员、架构师和DevO
    的头像 发表于 04-04 08:04 1220次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    有关DP通信的一些问题求教?

    变频器和上位机在进行DP通信时,有好几个问题不太理解,包括一些软件理论和硬件电路搭建的问题请教。 1、通信协议是什么,我认为的通信协议是两台或多台可以进行数据收发的设备进行沟通的语言标准,就像地球上
    发表于 03-31 23:23

    数据安全没保障?GaussDB(for Redis) 为你保驾护航

    近日,一些用户反馈,使用的开源 Redis 中新增了几个未知来源的 Key。通过分析发现,用户使用的开源 Redis 没有设置密码,很可能是遭到了 Redis 扩散病毒的攻击,表面上只
    的头像 发表于 03-28 22:09 729次阅读
    数据安全没保障?GaussDB(for <b class='flag-5'>Redis</b>) 为你保驾护航

    新版 Redis 不再“开源”,对使用者都有哪些影响?

    2024 年 3 月 20 日,Redis Labs 宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSAv2和 SSPLv1协议。该变化意味着 Redis
    的头像 发表于 03-27 22:30 568次阅读
    新版 <b class='flag-5'>Redis</b> 不再“开源”,对使用者都有哪些影响?

    一些有关通信电路的资料?

    有关嵌入式之间DSP、ARM、FPGA三者之间和这三款芯片和外部电路之间通信的一些资料,比如说芯片之间的并行通信和芯片和外部电路之间的串行通信,MODBUS、DP、CAN等,一些一些
    发表于 03-03 18:53

    Redis官方搜索引擎来了,性能炸裂!

    RediSearch 是Redis 模块,为 Redis 提供查询、二级索引和全文搜索功能。
    的头像 发表于 02-21 10:01 2595次阅读
    <b class='flag-5'>Redis</b>官方搜索引擎来了,性能炸裂!