这 7 道 Redis 基础问题,很常见!!

后端项目如果用到分布式缓存的话,一般用的都是 Redis。不过,Redis 不仅仅能做缓存,还能用作分布式锁、延时队列、限流等等。

什么是 Redis?

Redis[1] (REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库(BSD 许可)。与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广泛应用于分布式缓存方向。并且,Redis 存储的是 KV 键值对数据。

为了满足不同的业务场景,Redis 内置了多种数据类型实现(比如 String、Hash、Sorted Set、Bitmap、HyperLogLog、GEO)。并且,Redis 还支持事务、持久化、Lua 脚本、多种开箱即用的集群方案(Redis Sentinel、Redis Cluster)。

图片

Redis 数据类型概览

Redis 没有外部依赖,Linux 和 OS X 是 Redis 开发和测试最多的两个操作系统,官方推荐生产环境使用 Linux 部署 Redis。

个人学习的话,你可以自己本机安装 Redis 或者通过 Redis 官网提供的在线 Redis 环境[2](少部分命令无法使用)来实际体验 Redis。

图片

try-redis

全世界有非常多的网站使用到了 Redis ,techstacks.io[3] 专门维护了一个使用 Redis 的热门站点列表[4] ,感兴趣的话可以看看。

Redis 为什么这么快?

Redis 内部做了非常多的性能优化,比较重要的有下面 3 点:

  1. Redis 基于内存,内存的访问速度是磁盘的上千倍;

  2. Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用;

  3. Redis 内置了多种优化过后的数据类型/结构实现,性能非常高。

下面这张图片总结的挺不错的,分享一下,出自 Why is Redis so fast?[5] 。

图片

分布式缓存常见的技术选型方案有哪些?

分布式缓存的话,比较老牌同时也是使用的比较多的还是 Memcached 和 Redis。不过,现在基本没有看过还有项目使用 Memcached 来做缓存,都是直接用 Redis

Memcached 是分布式缓存最开始兴起的那会,比较常用的。后来,随着 Redis 的发展,大家慢慢都转而使用更加强大的 Redis 了。

有一些大厂也开源了类似于 Redis 的分布式高性能 KV 存储数据库,例如,腾讯开源的 Tendis[6] 。Tendis 基于知名开源项目 RocksDB[7] 作为存储引擎 ,100% 兼容 Redis 协议和 Redis4.0 所有数据模型。关于 Redis 和 Tendis 的对比,腾讯官方曾经发过一篇文章:Redis vs Tendis:冷热混合存储版架构揭秘 ,可以简单参考一下。

不过,从 Tendis 这个项目的 Github 提交记录可以看出,Tendis 开源版几乎已经没有被维护更新了,加上其关注度并不高,使用的公司也比较少。因此,不建议你使用 Tendis 来实现分布式缓存。

目前,比较业界认可的 Redis 替代品还是下面这两个开源分布式缓存(都是通过碰瓷 Redis 火的):

  • Dragonfly[8]:一种针对现代应用程序负荷需求而构建的内存数据库,完全兼容 Redis 和 Memcached 的 API,迁移时无需修改任何代码,号称全世界最快的内存数据库。

  • KeyDB[9]:Redis 的一个高性能分支,专注于多线程、内存效率和高吞吐量。

不过,个人还是建议分布式缓存首选 Redis ,毕竟经过这么多年的生产考研,生态也这么优秀,资料也很全面。

说一下 Redis 和 Memcached 的区别和共同点

现在公司一般都是用 Redis 来实现缓存,而且 Redis 自身也越来越强大了!不过,了解 Redis 和 Memcached 的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!

共同点

  1. 都是基于内存的数据库,一般都用来当做缓存使用。

  2. 都有过期策略。

  3. 两者的性能都非常高。

区别

  1. Redis 支持更丰富的数据类型(支持更复杂的应用场景)。Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。Memcached 只支持最简单的 k/v 数据类型。

  2. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 把数据全部存在内存之中。

  3. Redis 有灾难恢复机制。 因为可以把缓存中的数据持久化到磁盘上。

  4. Redis 在服务器内存使用完之后,可以将不用的数据放到磁盘上。但是,Memcached 在服务器内存使用完之后,就会直接报异常。

  5. Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前是原生支持 cluster 模式的。

  6. Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型。 (Redis 6.0 针对网络数据的读写引入了多线程)

  7. Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持。并且,Redis 支持更多的编程语言。

  8. Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除。

相信看了上面的对比之后,我们已经没有什么理由可以选择使用 Memcached 来作为自己项目的分布式缓存了。

为什么要用 Redis/为什么要用缓存?

下面我们主要从“高性能”和“高并发”这两点来回答这个问题。

1、高性能

假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。但是,如果说,用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。

这样有什么好处呢? 那就是保证用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。

2、高并发

一般像 MySQL 这类的数据库的 QPS 大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(就单机 Redis 的情况,Redis 集群的话会更高)。

QPS(Query Per Second):服务器每秒可以执行的查询次数;

由此可见,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。

常见的缓存读写策略有哪些?

关于常见的缓存读写策略的详细介绍,可以看我写的这篇文章:3 种常用的缓存读写策略详解[10] 。

什么是 Redis Module?有什么用?

Redis 从 4.0 版本开始,支持通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库(so 文件)的形式被加载到 Redis 中,这是一种非常灵活的动态扩展功能的实现方式,值得借鉴学习!

我们每个人都可以基于 Redis 去定制化开发自己的 Module,比如实现搜索引擎功能、自定义分布式锁和分布式限流。

目前,被 Redis 官方推荐的 Module 有:

  • RediSearch[11]:用于实现搜索引擎的模块。

  • RedisJSON[12]:用于处理 JSON 数据的模块。

  • RedisGraph[13]:用于实现图形数据库的模块。

  • RedisTimeSeries[14]:用于处理时间序列数据的模块。

  • RedisBloom[15]:用于实现布隆过滤器的模块。

  • RedisAI[16]:用于执行深度学习/机器学习模型并管理其数据的模块。

  • RedisCell[17]:用于实现分布式限流的模块。

  • ……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity数据持久化之Json

目录 Json概述Json文件格式Json配置规则Excel转Json C#读取存储Json文件JsonUtlityJsonUtlity序列化JsonUtility反序列化 LitJsonLitJson序列化LitJson反序列化JsonUtility和LitJson对比 Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国…

ESP8266-01s刷入固件报SP8266 Chip efuse check error esp_check_mac_and_efuse

一、遇到的问题 使用ESP8266 固件烧录工具flash_download_tools_v3.6.8 烧录固件报错: 二、解决方法 使用espressif推出发基于python的底层烧写工具:esptool 安装方法:详见https://docs.espressif.com/projects/esptool/en/latest/esp32/ …

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数,将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…

最新:Lodash 严重安全漏洞背后你不得不知道的 JavaScript 知识

可能有信息敏感的同学已经了解到:Lodash 库爆出严重安全漏洞,波及 400万 项目。这个漏洞使得 lodash “连夜”发版以解决潜在问题,并强烈建议开发者升级版本。 我们在忙着“看热闹”或者“”升级版本”的同时,静下心来想&#xf…

【退役之重学Java】如何解决消息持续积压等问题

一、将读写数据库等耗时的操作,从消费者逻辑中抽取出来,专门部署机器去完成这部分操作。

FebHost:什么是域名DNS服务器?

域名服务器是一种将域名转换为IP地址的计算机。在域名系统(DNS)中,它起着至关重要的作用。用户只需在浏览器的地址栏输入域名,而无需手动输入网站服务器的IP地址,就可以访问网站。 每个已注册的域名都必须在其DNS记录…

使用Python读取las点云,写入las点云,无损坐标精度

目录 1 为什么要写这个博文2 提出一些关键问题3 给出全部代码安装依赖源码(laspy v2.x) 1 为什么要写这个博文 搜索使用python读写las点云数据,可以找到很多结果。但是! 有些只是简单的demo,且没有发现/说明可能遇到的…

【第16章】spring-mvc之多文件上传

文章目录 前言一、文件大小限制二、前端三、后端总结 前言 本章在上篇文件的上传基础上就行扩展,多文件上传、多线程处理&#xff0c;所有的文件上传成功则返回成功。 一、文件大小限制 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns…

震惊,现在面试都加科技与狠货了

震惊&#xff0c;现在面试都加科技与狠货了 生成式AI盛行的现在&#xff0c;程序员找工作变容易了吗我和老痒喝着大酒&#xff0c;吃着他的高升宴&#xff0c;听他说他面试的各种细节&#xff0c;老狗我只恨自己动作慢了一步&#xff0c;不然现在在那侃侃而谈的就是我了。 面试…

守护数字疆域:2024年网络安全报告深度解读

在这个数据如潮涌动的数字时代&#xff0c;每一比特信息都可能是攻防双方角力的战场。《Check Point 2024年网络安全报告》不但为我们揭示了过去一年网络安全世界的风云变幻&#xff0c;更以前瞻性的视角勾勒出未来的挑战与机遇。此刻&#xff0c;让我们携手深潜这份权威指南的…

Redis-6 三种集群模式:主从模式、哨兵模式、分片集群

主从模式 一.介绍一下redis的主从同步 单节点的redis的并发能力是有上限的&#xff0c;要实现高并发&#xff0c;就要搭建主从集群&#xff0c;实现读写分离。通常是一主多从&#xff0c;主节点负责写数据&#xff0c;从节点负责读数据。 二.介绍一下主从模式同步数据的流程…

GIS找工作:天津测绘院24届春招Offer面经

本文介绍2024届春招中&#xff0c;天津市测绘院有限公司的1场面试的提问问题&#xff0c;以及后续体检环节的相关流程等。 2024年04月投递了天津市测绘院有限公司的软件开发类岗位&#xff0c;暂不清楚所在部门。目前完成了一面&#xff0c;并有幸获得Offer&#xff1b;在这里记…

分位数回归的基本原理和特点

基本模型及解释 分位数回归经典模型是由Koenker和Bassett (1978b)引入的&#xff0c;它从位置模型中的普通分位数(也称为“百分位数”)的概念扩展到更一般的一类线性模型&#xff0c;其中条件分位数具有线性形式。为了简单地回忆一下普通分位数&#xff0c;考虑一个实数随机变…

QGraphicsView实现简易地图11『指定层级-定位坐标』

前文链接&#xff1a;QGraphicsView实现简易地图10『自适应窗口大小』 提供一个地图初始化函数&#xff0c;指定地图显示的中心点和地图缩放层级 能够让地图显示某一层级的瓦片&#xff0c;并将中心点坐标显示在视图中心。 1、动态演示效果 7级地图-大连-老虎滩 定位到 8级地图…

java中建造者模式和模版模式的区别?可以用代码实例说明

建造者模式&#xff08;Builder Pattern&#xff09;和模板模式&#xff08;Template Pattern&#xff09;在Java中都是行为设计模式&#xff0c;但它们的用途和目的有所不同。以下是两者的主要区别&#xff0c;并通过代码实例来说明。 建造者模式&#xff08;Builder Pattern…

双展联动—第四届中国跨境电商及新电商交易博览会强势来袭

双展联动产业升级 ——第四届中国跨境电商及新电商交易博览会强势来袭 万商云集有福之州&#xff0c;掘金万亿蓝海市场。备受瞩目的“第四届中国跨境电商及新电商交易博览会暨2024中国户外生活及休闲运动用品交易博览会”将于2024年9月21-23日在福建福州海峡国际会展中心盛大召…

【数据库】存储过程、函数、触发器

按照要求实现员工管理数据库系统中的指定操作&#xff1a;1、创建一个数据库 staff&#xff0c;并在数据库中创建以下四张表&#xff1a; 员工表 employee&#xff08;员工编号id,姓名userName,出生日期birthDate,身份证号idCard,登录名称loginName,登录密码password,手机号mo…

基于Vite创建项目

1.npm设置镜像源为国内淘宝源 npm config set registry https://registry.npmmirror.com 2.vite官方中文文档 Vite | 下一代的前端工具链 3.创建项目 npm create vitelatest my-app 接下来按照提示操作就可以&#xff0c;最后 npm run dev 就可以启动项目了 4.安装依赖 …