Redis 基础 问题

前言


 相关系列

  • 《Redis & 目录》(持续更新)
  • 《Redis & 基础 & 源码》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Redis & 基础 & 总结》(学习总结/最新最准/持续更新)
  • 《Redis & 基础 & 问题》(学习解答/持续更新)
     
     

Redis是什么?有哪些应用场景?


    Redis的全称为Remote Dictionary Server(远程字典服务),是一个基于C语言开发的开源/高性能/非关系型的数据库。与传统数据库不同的是:Redis会直接将数据保存在内存中,因此其读/写速度非常之快。据估算Redis每秒可以处理10/8万次以上的读/写,是目前已知性能最好的键/值型数据库,因此被广泛应用于缓存方向,并在分布式锁/消息通知等方面也有不小的运用…常用应用场景如下:

  • 热点缓存:将热点数据写入内存中读取可有效减少磁盘I/O并提升并发量,从而有效增强读取性能;
  • 会话缓存:Redis可储存全局性的会话信息(Token & 令牌)以支持对整个系统的全局访问,并有效提高系统整体的可用性/伸缩性;
  • 全页缓存:Redis可缓存整个页面的输出以减少接口调用/页面渲染的时间;
  • 计数器/排行榜:Redis可通过多种方式对整数进行快速增/减以实现计数器功能。并且由于Redis的读/写性能很高,因此很适合存储频繁读/写的计数量。此外计数器功能还可配合有序集合类以进一步实现实时排行榜功能;
  • 数据共享:Redis可作为共享数据的媒介以在多服务之间传递共享数据;
  • 消息队列(发布/订阅功能):Redis列表类型的底层结构为双向链表,因此可通过首/尾两端的插入/移除实现轻量级的消息队列功能以处理异步任务,不过该需求更推荐使用Kafka/RabbitMQ等专业的消息中间件实现;
  • 分布式锁 :作为多服务共享的中间件,Redis可使用自带的SETNX命令/官方提供的API以提供分布式锁功能,从而确保在多服务之间共享资源的一致性;
  • 限流:Redis可通过增/减整数,结合Lua脚本等方式统计总数以判断是否到达阈值以实现限流功能。
     
     

Redis与Memcached有什么区别?


  • Redis的读/写速度比Memcached快很多;
  • Redis支持数据持久化;
  • Redis支持更多的数据类型,而Memcached只支持最基本的键/值。
     
     

为什么要用缓存?


    这主要是出于性能方面的考量。内存的数据读取速度/并发承受量都远高于磁盘,因此将热点数据直接存于内存中将有效避免大量低效的数据库/磁盘I/O,并提升读取的最大并发量,而这两点都能为性能带来极大的收益。
 
 

为什么更推荐Redis,而不是使用Map/Guava做缓存?


    缓存分为本地缓存和分布式缓存。本地缓存的优点是轻量/快速,但缺点是生命周期与服务绑定,并且由于在多实例(分布式/集群)情况下每个实例都拥有各自的缓存,因此很容易在开发/使用时出现缓存不一致问题,Map/Guava就属于该类型的缓存。而Redis作为分布式缓存其优点是生命周期与服务无关,并且多实例(表面上)使用的缓存都相同,因此便保证了数据的访问性/一致性。这种特性明显更加符合当今服务的大规模分布式应用场景,因此相比Map/Guava而言更推荐使用Redis做缓存。当然Redis也不是毫无缺点,在保证高可用的情况下,其整体架构设计/实现都较复杂。
 
 

Redis有哪些优缺点?


 优点

  • 读/写性能优异:Redis的读/写速度为110000/81000次/s;
  • 使用便利:Redis支持五/三大基础/特殊数据类型,这使得其可以快速支持绝大多数的数据操作;
  • 支持事务/批处理:Redis的所有基础操作都是原子的,并支持将多个基础操作打包执行;
  • 支持数据持久化:Redis支持RDB/AOF两种数据持久化机制,其本质分别是数据快照/指令日志;
  • 支持主从备份:Redis支持一主多从/级联等多种集群部署方案,主机会自动将数据同步到从机,从而实现读写分离。
     

 缺点

  • 容量受内存限制:受限于物理内存昂贵而偏小的原因,Redis难以用于海量数据的存储,仅适用于微量数据的高性能读/写/运算;
  • 事务缺乏ACID属性:Redis事务只支持“伪”原子性/“读已递交”级别的隔离性,不支持数据回滚,并且不具备一致性/持久性;
  • 数据丢失:即使是在启动了持久化机制及主从同步的情况下,数据也无法完全避免丢失的情况发生;
  • 集群难以在线扩容:集群在内存耗尽时想要对进行在线扩容会变得很复杂,因为内存难以像磁盘一样动态增/删,因此运维人员在系统上线时必须确保有足够的内存来避免该问题,但这又会对资源造成了较大浪费。
     
     

Redis为什么这么快?


 基础数据类型

  • String & 字符串
        字符串类型是Redis最基本的数据类型,一个键对应一个值,但值最大不能超过512M;
        字符串类型不仅可以保存字符串,还可以保存数字,并支持递增/递减等操作;
        字符串类型是二进制安全的,这意味着它可以保存任何数据,比如JPEG图像或者序列化对象。
  • List & 列表
        列表类型是字符串类型的列表,会按元素的插入顺序进行排序;
        列表类型的底层实现是双向链表,因此支持首/尾两端的插入/移除/获取,并且时间复杂度都为O(1)。
  • Set & 集合
        集合类型是无序的字符串类型集合,会自动对插入的元素去重。
  • Zset & 有序集合
        有序集合类型是有序的字符串类型集合,会自动对插入的元素去重;
        有序集合类型与集合类型类似,但每个元素都会关联一个double类型的分数,并按分数进行排序;
        有序集合类型是唯一既可以进行范围查询又能够保持元素唯一性的数据结构。
  • Hash & 哈希
        哈希类型的本质是键值对,并且其键/值都是字符串类型;
        哈希类型非常适合存储对象,因为其键/值结构与类的字段/值结构高度相似。
     

 特殊数据类型

  • Bitmaps & 位图
        位图类型不是独立数据类型,而是基于字符串类型实现;
        位图类型的底层结构是位数组,其会将元素代表的唯一整数ID作为索引,用于在位数组中定位以记录元素是否存在而不记录元素本身。因此位图类型非常节省空间,也可以高效统计大量数据,如统计在线用户数等。
  • HyperLogLog & 基数
        基数类型可用于统计集合中不重复元素的数量;
        基数类型非常节省空间,但是它只能给出近似值而非精确值。
  • Geo & 地理
        地理类型用于存储经纬度等地理信息。
  • Streams & 流
        流类型提供了消息持久化/消费者组/消息确认等机制,是Redis官方推荐的消息队列解决方案。
     
     

Redis有哪些数据类型?


  • 硬件上基于内存实现,这是Redis快速的核心原因;
  • 算法上基于哈希实现,并在此基础上提供/优化了哈希/列表/集合等高效的数据结构,使得读/写可以在时间复杂度为O(1)的操作中完成;
  • 指令采用单线程执行,避免了线程/上下文切换的开销,也无需考虑锁相关的影响,并简化了数据处理的逻辑;
  • 采用非阻塞的多路I/O复用模型,使得单线程能够并发/高效地处理多客户端连接,减少了Redis在网络I/O上的等待,并且在Redis 6.0版本中引入了多线程机制进一步提升了网络I/O的处理性能。
     
     

如何最小化使用Redis内存?


    尽可能多的将相同对象的多项数据以哈希类型紧凑保存,这将大幅减少内存的消耗量

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

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

相关文章

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候,sg是要检查门的极性的。 如果qualifier和src经过与门汇聚,在同另一个src1信号或门汇聚,sg是报unsync的。 假设当qualifier为0时,0&&src||src1src1,src1无法被gat…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像,但是不用注明数据类型 使用var去声明变量 特点1:var关键字声明变量,是为全局变量,作用域很大。在一个代码块中定义的变量,在其他代码块里也能使用 特点2:可以重复定义&#…

好用的idea插件之自动sql生成

功能 自动化代码生成: 通过解析数据库表结构和实体类定义,自动生成对应的Mapper接口、XML映射文件、Service、DAO和实体类等代码。支持快速生成增删查改(CRUD)代码,以及在表结构变化后重新生成代码而不覆盖自定义方法。…

#【2024年10月26日更新】植物大战僵尸杂交本V2.6更新内容与下载

更新内容 新增植物: 英雄植物:终极射手、向日葵公主、汉堡王(仅限英雄模式使用)。星卡植物:星星盒子、猫窝、迷幻投手、玉米旋转机(需要一定数量的星星解锁)。挑战植物:金卡黄金锤子…

什么是 VolTE 中的 Slient Redial?它和 CSFB 什么关系?

目录 1. 什么是 Silent Redial(安静的重拨号)? 2. Silent Redial 信令流程概述 3. 总结 Silent Redial 和 CSFB 啥关系? 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1,降级MySQL ODBC2.2 解决2,修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议(IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…

Spring Boot:植物健康监测的智能先锋

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了植物健康系统的开发全过程。通过分析植物健康系统管理的不足,创建了一个计算机管理植物健康系统的方案。文章介绍了植物健康系统的系统分析部分&…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 爬取的UP主信息 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视…

嵌入式C语言字符串具体实现

大家好,今天主要给大家分享一下,如何使用C语言进行字符串操作与实现。 第一:字符串相关操作实现 复制函数五个基本要素: 头文件:#include <string.h> 函数原型:strcpy(char dest[],char src[]) -----string copy 功能:把src数组中\0之前的所有字符,连同‘\…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect

HTTP状态码301和302是什么&#xff1f; 1、HTTP状态码301 HTTP状态码301表示永久性转移&#xff08;Permanent Redirect&#xff09;&#xff0c;这意味着请求的资源已经被分配了一个新的URI&#xff0c;以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

工具方法 - Omnifocus: 网页版基本操作

1&#xff0c;第一个左上角点开&#xff0c;显示如下的视角&#xff1a; 从这个工具来说&#xff0c;优先的第一事项&#xff0c;是用户从哪个视角来切入&#xff0c;不同的视角展现不同的逻辑&#xff0c;对应不同的操作。 通过视角一级的菜单&#xff0c;来方便用户的操作。 …

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…

解决pycharm无法添加conda环境的问题【Conda Environment下没有Existing environment】

解决pycharm无法添加conda environment 问题【Conda Environment下不显示Existing environment】 问题&#xff1a; 第一次下载好pycharm准备编写代码&#xff0c;在Anoconda Prompt建立好环境后&#xff0c;打开pycharm导入环境&#xff0c;却发现在【Conda Environment】处…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

hcia复习篇

计算机网络&#xff1a; 云技术&#xff1a; 云储存---将数据通过计算机网络传输并储存在第三方服务器。&#xff08;百度网盘&#xff09; 云计算---分布式计算。&#xff08;即共享硬件资源&#xff09; 计算机技术&#xff1a; 文字、图片、视频等---抽象文字。 抽象语言…

django游戏门户系统

想做毕业设计但还没有头绪&#xff1f;&#x1f64b;‍♂️django游戏门户系统了解一下&#xff01;这个系统不仅功能全面&#xff0c;还能轻松解决你的项目选题难题&#xff01; 我们这个基于Django开发的游戏门户系统提供了用户注册、登录、内容发布以及管理功能&#xff0c…

软件测试学习总结

一.软件测试概念和目的 软件测试的概念: 测试模型(V模型) 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。 通常对软件测试的定义有两种描述: 定义1:软件测试是为了发现错误而执行程序的过程 定义2:…

前端同步异步-setTimeout-Promise-async-await

总结下前端的同步异步、事件循环问题&#xff0c;如有错误欢迎指正。 目录 一、setTimeout定时器函数 1.定义 2.基本语法 3.返回值 4.使用 1&#xff09;异步执行 2&#xff09;嵌套使用 3&#xff09;事件循环 二、Promise 1.定义 2.状态 3.基本语法 1&#xff0…