2023年再不会Redis,就要被淘汰了

news2024/11/16 5:26:05

在这里插入图片描述

目录

    • 专栏导读
    • 一、同样是缓存,用map不行吗?
    • 二、Redis为什么是单线程的?
    • 三、Redis真的是单线程的吗?
    • 四、Redis优缺点
      • 1、优点
      • 2、缺点
    • 五、Redis常见业务场景
    • 六、Redis常见数据类型
      • 1、String
      • 2、List
      • 3、Hash
      • 4、Set
      • 5、Zset
      • 6、BitMap
      • 7、BitField
      • 8、HyperLogLog
      • 9、GEO
      • 10、Stream
    • 七、总结

专栏导读

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。

🏆本文收录于Java基础教程系列(进阶篇),本专栏是针对大学生、初级Java工程师精心打造,针对Java生态,逐个击破,不断学习,打通Java技术栈

🏆订阅后,可以阅读Java基础教程系列(进阶篇)中全部文章包含Java基础、Java高并发、Spring、MySQL等Java进阶技术栈

🏆还可以订阅其姐妹篇Java基础教程系列,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例理论结合实战,实现Java的轻松学习

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆面试福音:10万字208道Java经典面试题总结(附答案)

大家好,我是哪吒。

一、同样是缓存,用map不行吗?

  1. Redis可以存储几十个G的数据,Map行吗?
  2. Redis的缓存可以进行本地持久化,Map行吗?
  3. Redis可以作为分布式缓存,Map只能在同一个JVM中进行缓存;
  4. Redis支持每秒百万级的并发,Map行吗?
  5. Redis有过期机制,Map有吗?
  6. Redis有丰富的API,支持非常多的应用场景,Map行吗?

二、Redis为什么是单线程的?

  1. 代码更清晰,处理逻辑更简单;
  2. 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题;
  3. 不存在多线程切换而消耗CPU;
  4. 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

三、Redis真的是单线程的吗?

  1. Redis6.0之前是单线程的,Redis6.0之后开始支持多线程;
  2. Redis内部使用了基于epoll的多路复用,也可以多部署几个Redis服务器解决单线程的问题;
  3. Redis主要的性能瓶颈是内存和网络;
  4. 内存好说,加内存条就行了,而网络才是大麻烦,所以Redis6内存好说,加内存条就行了;
  5. 而网络才是大麻烦,所以Redis6.0引入了多线程的概念;
  6. Redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的;

四、Redis优缺点

1、优点

  1. Redis是KV数据库,MySQL是关系型数据库,Redis速度更快;
  2. Redis数据操作主要在内存中,MySQL主要将数据存储在硬盘,Redis速度更快;
  3. Redis同样支持持久化(RDB+AOF),Redis支持将数据异步将内存的数据持久化到硬盘上,避免Redis宕机出现数据丢失的问题;
  4. Redis性能极高,读的速度是110000次/秒,写的速度是81000次/秒;
  5. Redis数据类型丰富,不仅支持KV键值对,还支持list、set、zset、hash等数据结构的存储;
  6. Redis支持数据的备份,即master-slave模式的数据备份;
  7. Redis支持简单的事务,操作满足原子性;
  8. Redis支持读写分离,分担读的压力;
  9. Redis支持哨兵模式,实现故障的自动转移;
  10. 单线程操作,避免了频繁的上下文切换;
  11. 采用了非阻塞I/O多路复用机制,性能卓越;

2、缺点

  1. 数据存储在内存,容易造成数据丢失;
  2. 存储容量受内存的限制,只能存储少量的常用数据;
  3. 缓存和数据库双写一致性问题;
  4. 用于缓存时,容易出现内存穿透、缓存击穿、缓存雪崩的问题;
  5. 修改配置文件后,需要进行重启,将硬盘中的数据同步到内存中,消耗的时间较长,而且数据同步的时间里Redis不能提供服务;

五、Redis常见业务场景

  1. Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作
  2. 通过list取最新的N条数据
  3. 模拟类似于token这种需要设置过期时间的场景
  4. 发布订阅消息系统
  5. 定时器、计数器
  6. 缓存加速、分布式会话、排行榜、分布式计数器、分布式锁;
  7. Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等特性;

六、Redis常见数据类型

在这里插入图片描述

1、String

(1)String简介

String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。

(2)应用场景

① 作为缓存数据库

在Java管理系统体系中,大多数都是用MySQL存储数据,redis作为缓存,因为Redis具有支撑高并发的特性,通常能起到加速读写和降低数据库服务器压力的作用,大多数请求都会先请求Redis,如果Redis中没有数据,再请求MySQL数据库,然后再缓存到Redis中,以备下次使用。

在这里插入图片描述
② 计数器

Redis字符串中有一个命令INCR key,incr命令会对值进行自增操作,比如CSDN的文章阅读,视频的播放量,都可以通过Redis来计数,每阅读一次就+1,同时将这些数据异步存储到MySQL数据库中,降低MySQL服务器的写入压力。

③ 共享session

在分布式系统中,用户每次请求一般会访问不同的服务器 ,这就会导致session不同步的问题,这时,一般会使用Redis来解决这个问题,将session存入Redis,使用的时候从Redis中取出就可以了。

④ 分布式锁

  1. setnx key value,加锁
  2. del key,释放锁

(3)key操作命令

在这里插入图片描述
(4)set key value

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

  1. EX seconds,设置过期时间,单位秒
  2. PX milliseconds,设置过期时间,单位毫秒
  3. EXAT timestamp-seconds,设置过期时间,以秒为单位的UNIX时间戳
  4. PXAT timestamp-milliseconds,设置过期时间,以毫秒为单位的UNIX时间戳
  5. NX,键不存在的时候设置键值
  6. XX,键存在的时候设置键值
  7. KEEPTTL,保留设置前指定键的生存时间
  8. GET,返回指定键原本的值,若键不存在返回nil

备注:

命令不区分大小写,而key是区分大小写的。

help @类型:查看当前类型相关的操作命令。

Since the SET command options can replace SETNX, SETEX, PSETEX, GETSET, it is possible that in future versions of Redis these commands will be deprecated and finally removed。

(5)同时设置多个键值

(6)获取指定区间范围内的值

getrange、setrange。

(7)数值增减

  1. INCR key,递增数字
  2. INCRBY key increment,增加指定的数值递增
  3. DECR key,递减数值
  4. DECRBY key decrement,指定指定的数值递减

(8)获取字符串的长度,内容追加

  1. STRLEN key,获取值的长度
  2. APPEND key value,内容追加

2、List

(1)List 列表简介

List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。

列表的最大长度为 2^32 - 1,也即每个列表支持超过 40 亿个元素。

主要功能有push/pop,一般用在栈、队列、消息队列等场景。

  1. left、right都可以插入添加;
  2. 如果键不存在,创建新的链表;
  3. 如果键存在,新增内容;
  4. 如果值全部移除,对应的键也会消失;

它的底层是双向链表,对两端的操作性能很高,通过索引下标操作中间的节点,性能会较差。

(2)应用场景

① 消息队列

使用 lpush + rpop或者 rpush + lpop实现消息队列,Redis还支持阻塞操作,在弹出元素的时候使用阻塞命令来实现阻塞队列。

在这里插入图片描述

② 作为栈使用

使用 lpush+lpop或者 rpush+rpop实现栈。

在这里插入图片描述

③ 文章列表

(3)常用命令

在这里插入图片描述

3、Hash

(1)hash简介

Hash 是一个键值对(key - value)集合,value也是一个hash,相当于 Map<String,Map<Object,Object>>

(2)常用场景

由于特殊的数据结构,hash一般作为存储bean使用,String+JSON的数据结构存储特定的应用场景。

(3)常用命令

在这里插入图片描述

在这里插入图片描述

4、Set

(1)Set类型简介

Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。

一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,可以交集,并集,差集等等,所以 Set 类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。

(2)应用场景

① 相同好友可见

在朋友圈场景中,对于点赞、评论的功能,通过交集实现相同还有可见的功能。

② 共同关注、共同喜好

③ 抽奖功能

(3)常用命令

在这里插入图片描述

5、Zset

(1)Zset 类型简介

Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。

有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。

zset k1 score1 v1 score2 v2

(2)应用场景

① 排行榜

通过score来记录点赞数,然后根据score进行排序,实现排行榜的功能。

② 延迟消息队列

订单系统,下单后需要在15分钟内进行支付操作,否则自动取消订单。

将下单后15分钟后的时间作为score,订单作为value存入Redis,消费者轮询去消费,如果消费的大于等于score,则取消该订单。

(3)Zset常用命令

在这里插入图片描述

6、BitMap

(1)Bitmap简介

Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。

(2)应用场景

由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。

① 签到统计

② 判断用户是否登录

③ 统计连续学习打卡的人

(3)BitMap常用命令

在这里插入图片描述

7、BitField

通过bitfield命令可以一次性操作多个比特位,它会执行一系列操作并返回一个响应数组,这个数组中的元素对参数列表中的相应操作的执行结果。

8、HyperLogLog

(1)HyperLogLog简介

Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于「统计基数」的数据集合类型,基数统计就是指统计一个集合中不重复的元素个数。但要注意,HyperLogLog 是统计规则是基于概率完成的,不是非常准确,标准误算率是 0.81%。

所以,简单来说 HyperLogLog 提供不精确的去重计数。

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。

(2)应用场景

百万级网页 UV 计数

(3)常用命令

  1. pfadd key element,添加元素
  2. pfcount key,返回指定HyperLogLog的基数的估算值;
  3. pfmerge destkey sourcekey,将多个HyperLogLog合并成一个HyperLogLog;

9、GEO

(1)GEO简介

Redis GEO 是 Redis 3.2 版本新增的数据类型,主要用于存储地理位置信息,并对存储的信息进行操作。

在日常生活中,我们越来越依赖搜索“附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(Location-Based Service,LBS)的应用。LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中。

(2)应用场景

高德地图、滴滴打车等定位软件。

(3)常用命令

在这里插入图片描述

10、Stream

(1)Stream简介

Redis Stream 是 Redis 5.0 版本新增加的数据类型,Redis 专门为消息队列设计的数据类型。

在这里插入图片描述

在 Redis 5.0 Stream 没出来之前,消息队列的实现方式都有着各自的缺陷,例如:

  • 发布订阅模式,不能持久化也就无法可靠的保存消息,并且对于离线重连的客户端不能读取历史消息的缺陷;
  • List 实现消息队列的方式不能重复消费,一个消息消费完就会被删除,而且生产者需要自行实现全局唯一 ID。

基于以上问题,Redis 5.0 便推出了 Stream 类型也是此版本最重要的功能,用于完美地实现消息队列,它支持消息的持久化、支持自动生成全局唯一 ID、支持 ack 确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠。

(2)应用场景

消息队列

(3)常用命令

在这里插入图片描述

七、总结

Redis是一个key-value存储系统,支持10种数据类型,总结了为何要用Redis替代map作为程序缓存、Redis为什么是单线程的、Redis的优缺点、Redis的常用场景,做了一次Redis的快速入门。

在这里插入图片描述
在这里插入图片描述

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Java基础教程系列(进阶篇)

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

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

相关文章

Spring-Cloud-Gateway集成Nacos如何做负载均衡?

spring-cloud-alibaba的低版本 如果所用的SpringCloud和Nacos的版本信息如下&#xff1a; <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>网关的依赖如下&…

VirtualBox虚拟机闪退后如何重新打开

电脑&#xff08;Mac系统&#xff09;由于某种问题自动重启了&#xff0c;重启后之前在用的VirtualBox&#xff08;虚拟机管理器&#xff09;能恢复运行&#xff0c;但VirtualBoxVM&#xff08;虚拟机终端&#xff09;进程已停止&#xff0c;点击管理器的「显示」也出现报错&am…

我国防疫数据报告,2022年广东花费711亿,北京人均支出第一

哈喽大家好&#xff0c;2023年已经过去一段时间了&#xff0c;随着防疫策略的调整&#xff0c;小伙伴们是不是开始到处旅行购物了呢&#xff1f;当然了&#xff0c;对于自身的健康情况小伙伴们还是要多多关注&#xff0c;不要松懈。随着春节过后有序复工复产&#xff0c;各地纷…

三叉神经痛是怎么回事?给予2个生活建议!

三叉神经痛被称为天下第一痛&#xff0c;三叉神经支配区域反复出现短暂性阵发性剧痛&#xff0c;发作时让人们备受折磨。近期早晚温差大和天气变化多端&#xff0c;可刺激肌肉和血管收缩&#xff0c;导致三叉神经异常放电&#xff0c;进而引起剧烈疼痛&#xff0c;诱发三叉神经…

ChatGPT强化学习大杀器——近端策略优化(PPO)

ChatGPT强化学习大杀器——近端策略优化&#xff08;PPO&#xff09; 近端策略优化&#xff08;Proximal Policy Optimization&#xff09;来自 Proximal Policy Optimization Algorithms&#xff08;Schulman et. al., 2017&#xff09;这篇论文&#xff0c;是当前最先进的强…

【学习笔记】深入理解JVM之垃圾回收机制

【学习笔记】深入理解JVM之垃圾回收机制 更多文章首发地址&#xff1a;地址 参考&#xff1a; 《深入理解JAVA虚拟机》第三版 第三章尚硅谷 第134 - 203 集参考文章&#xff1a;https://blog.csdn.net/qq_48435252/article/details/123697193 1、概念 &#x1f33b; 首先我们…

Mock.js介绍及使用总结

1 什么是Mock.js Mock.js用于生成随机的模拟数据&#xff0c;拦截 Ajax 请求&#xff0c;返回伪造的数据。因此在前端开发阶段就可以通过这个工具进行沉浸式开发&#xff0c;实现数据自产自销&#xff0c;降低和后端的沟通成本&#xff0c;实现真正意义上的前后端开发解耦合。…

2023年轻资产创业怎么做?哪些项目容易创业?

2023年&#xff0c;越来越多的创业者开始考虑轻资产创业&#xff0c;但是&#xff0c;多数人在选择项目的时候&#xff0c;没有一个标准&#xff0c;不知道怎么选择轻资产创业项目&#xff0c;那么&#xff0c;在这里给大家讲讲&#xff0c;轻资产创业怎么做&#xff0c;哪些轻…

反思当下所处的环境,有没有让你停滞不前、随波逐流

环境对人的影响真的很大&#xff0c;小时候的环境、长大后的环境、工作环境、生活环境、好的环境、差的环境......我们都生活在一定的环境中所以既是环境的产物&#xff0c;又是环境的创造者与改造者。我们与环境的关系是相辅相成的我们的生活和工作当中接触到的人或事或物&…

emac接口与phy交互

nuc970的emac接口 nuc970的EMAC以太网接口与PHY芯片之间的数据交换是通过MII&#xff08;Media Independent Interface&#xff09;或RMII&#xff08;Reduced Media Independent Interface&#xff09;接口实现的。 在MII接口中&#xff0c;EMAC和PHY之间通过4对数据线&…

C语言:当scanf语句中有转义字符时,你该这样输入

最近在重新学习一下C语言的有关知识&#xff0c;突然发现现在来看过去所学的知识&#xff0c;自己的感受又有很大的不同&#xff0c;就拿输入语句scanf来说吧&#xff01;看到CSDN问答上有一个关于scanf语句的问题&#xff0c;当时题主代码很简单&#xff0c;可是就是没有输出语…

idea:地址被占用

问题启动idea报&#xff1a;java.net.BindException: Address already in use: bind&#xff0c;具体截图如下&#xff1a;解决步骤1、首先想到的是改idea端口&#xff0c;但按网上方法试下了几个4位数和5位数的端口&#xff0c;没啥作用2、根据idea抛异常的弹出框提示&#xf…

在函数中,用指针接收就可以改变相应的内容吗??

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 我们在不管指针那篇博客&#xff0c;还是在函数那篇博客中&#xff0c;我都给大家讲解过…

Unity 打包代码到 DLL

Unity 打包代码到 DLL 使用Unity API PlayerBuildInterface.CompilePlayerScripts 将项目中的代码生成为 DLL 程序集 在 Editor 文件夹下新建脚本 CompileDll using UnityEngine; using UnityEditor; using UnityEditor.Build.Player; using System.IO;public class Compile…

【springmvc】获取请求参数

SpringMVC获取请求参数 1、通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request)…

Allegro如何输出ODB文件操作指导

Allegro如何输出ODB文件操作指导 在PCB设计完成之后,需要输出生产文件用于生产加工,除了gerber文件可以用生产制造,ODB文件同样也可以用于生产,如下图 用Allegro如何输出ODB文件,具体操作如下 首先确保电脑上已经安装了ODB这个插件,版本不受限制点击File

开学季准备哪些电容笔好?apple pencil一代平替笔推荐

一支简单而又易用的电容笔&#xff0c;配上我们的ipad&#xff0c;将会为我们的工作、学习带来更多的乐趣。在画画时&#xff0c;也不能忽略电容笔的重要作用。关于电容笔的相关知识&#xff0c;本人也略有知不少&#xff0c;以下是我今天要带来的几款具有极高性价比的电容笔&a…

【C#进阶】C# 特性

序号系列文章10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO文章目录前言1&#xff0c;特性的概念1.1 特性的属性1.2 特性的用途2&#xff0c;特性的定义2.1 特性参数2.2 特性目标3&#xff0c;预定义特性3.1 AttributeUsage3.2 Conditional3.2…

【springmvc】java bean 的区分

bean JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专门存储业务数据的&#xff0c;如 Student、User 等一类称为业务处理 Bean&#xff1a;指 Service 或 Dao 对象&#xff0c;专门用于处理业务逻辑和数据访问。 在一个java的springboot中&#xff0c;一般…

day59-day60【代码随想录】二刷数组

文章目录前言一、移动零&#xff08;力扣283&#xff09;【双指针】二、轮转数组&#xff08;力扣189&#xff09;三、寻找数组的中心下标&#xff08;力扣728&#xff09;四、和为 K 的子数组&#xff08;力扣560&#xff09;五、按奇偶排序数组 II&#xff08;力扣922&#x…