Redis实战-初识Redis
初识Redis
- 1、Redis简介
- 2、 Redis数据结构简介
- 3、 Redis命令
- 3.1 字符串
- 3.2 列表
- 3.3 集合
- 3.4 散列
- 3.5 有序集合
- 3.6 发布与订阅
- 3.7 其他命令
- 3.7.1 排序
- 3.7.2 过期时间
如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Redis实战》的笔记
1、Redis简介
Redis 是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生 的 独 一无 二的 数 据 模 型 。 Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis 的数据结构致力于帮助用户解决问题,而不会像其他数据库那 样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence )和客户端分 片(client -side sharding )等特性,用户可以很方便地将Redis 扩展成一个能够包含数百GB 数据、 每秒处理上百万次请求的系统。
需求是否使用redis或者是redis作为主存储还是二级存储取决于程序对性能的要求以及成本问题。
存储 | 类型 | 描述 |
---|---|---|
Redis | 内存存储的非关系型数据库 | 支持五种数据结构:字符串、列表、集合、散列、有序集合; 支持持久化;可以不必像MySQL随机读写、写入临时表,不需要查询分析器、优化器进行处理 |
memcached | 内存存储的键值缓存 | 只支持字符串;不支持持久化;用户只能用APPEND命令将数据添加到已有字符串的末尾,采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入 |
MySQL | 关系型数据库 | 支持ACID事务;存在查询分析器、查询优化器; |
2、 Redis数据结构简介
Redis客户端与服务端交互图【以java为例子】:
这里只是简单的介绍一下数据结构,以及部分命令:
Redis数据结构 | |||
---|---|---|---|
数据结构 | 命令 | 行为描述 | 示例 |
字符串 | GET | 获取存储在给定键中的值 | get key |
SET | 设置存储在给定键中的值 | set key value | |
DEL | 删除存储在给定键中的值 | del key | |
列表 | LPUSH | 将给定的值推入列表的左端 | lpush key value |
RPUSH | 将给定的值推入列表的右端 | rpush key value | |
LPOP | 从列表的左端弹出一个值,并返回被弹出的值 | lpop key | |
RPOP | 从列表的右端弹出一个值,并返回被弹出的值 | rpop key | |
LINDEX | 获取列表上给定位置的单个元素 | lindex key 1 | |
LRANGE | 获取列表上在给定范围上的所有值 | lrange key 0 3 | |
集合 | SADD | 将给定的元素添加到集合 | sadd key value |
SMEMBERS | 返回集合中所有的元素 | smembers key | |
SISMEMBER | 检查给定元素是否存在于集合 | sismember key value | |
SREM | 如果集合中存在该元素,则移除该元素 | srem key value | |
散列 | HSET | 在散列里面关联给定的键值对 | hset key key1 value1 |
HGET | 获取指定的散列的值 | hget key key1 | |
HGETALL | 获取散列中包含的所有键值对 | hgetall key | |
HDEL | 如果给定键存在于散列中,那么移除这个键 | hdel key key1 | |
有序集合 | ZADD | 将一个带有给定分值的成员添加到有序集合中 | zadd key 123 value |
ZRANGE | 从有序集合中获取指定位置范围的数据 | zrange key 1 3 | |
ZRANGEBYSCORE | 获取有序集合在给定分值范围内的所有元素 | zrangebyscore key 0 800 | |
ZREM | 如果给定成员存在于有序集合,那么移除这个成员 | zrem key value |
3、 Redis命令
这里的命令不再包含上述简单的命令。
3.1 字符串
Redis的字符串是一个由字节组成的序列,字符串可以存储三种类型的值:字节串、整数【在64位系统上就是64位有符号整数,32位系统就是32位有符号整数】、浮点数【取值范围和double相同】。
字符串 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
INCR | 将给定键中的值加1 | incr key | 1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作; 2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误; 3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理 |
DECR | 将给定键中的值减1 | decr key | |
INCRBY | 将给定键中的值加上整数 | incrby key amount | |
DECRBY | 将给定键中的值减去整数 | decrby key amount | |
INCRBYFLOAT | 将给定键中的值加上浮点数 | incrbyfloat key amount | |
APPEND | 将值value追加到给定键对应的值的末尾 | append key value | 1、在执行setrange或者setbit命令对字符串进行写入的时候,如果字符串长度不够,那么Redis会自动使用空字节(null)将字符串扩展至所需的长度,然后再执行写入或者更新操作; 2、在使用getrange读取字符串的时候,超过字符串的长度那部分视为空串; 3、在使用getbit读取二进制串的时候,超过字符串长度为0 |
GETRANGE | 获取给定键值从偏移量start到end的字串,包括start和end在内 | getrange key start end | |
SETRANGE | 给定键值从偏移量offset开始的位置到offset+len(value)的位置被指定的字符串覆盖 | setrange key offset value | |
GETBIT | 返回二进制串指定位置的二进制值 | getbit key offset | 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。 |
SETBIT | 设置二进制串指定位置的二进制值为value(0或者1) | setbit key offset value | |
BITCOUNT | 统计二进制串中二进制值为1的数量,如果给定了start和end偏移量,那么只统计偏移量范围内的二进制位 | bitcount key [start end] | |
BITTOP | 对一个或者多个二进制串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)按位运算操作,结果存储到dest-key键中 | bittop operation dest-key key1 [key2] |
3.2 列表
列表 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
LTRIM | 对列表进行裁剪,只保留[start, end]范围内的元素 | ltrim key start end | |
BLPOP | 从第一个非空列表中弹出位于最左端的元素或者阻塞timeout秒并等待可弹出的元素 | blpop key1 [key2 ...] timeout | 阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列 |
BRPOP | 从第一个非空列表中弹出位于最右端的元素或者阻塞timeout秒并等待可弹出的元素 | brpop key1 [key2 ...] timeout | |
RPOPLPUSH | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素 | rpoplpush source-key dest-key | |
BRPOPLPUSH | 从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素;如果source-key中没有元素,那么会阻塞timeout秒等待可弹出元素的出现 | brpoplpush source-key dest-key |
3.3 集合
集合 | ||
---|---|---|
命令 | 行为描述 | 示例 |
SCARD | 返回集合中元素个数 | scard key |
SRANDMEMBER | 从集合中随机的返回一个或者多个元素。当count为正数的时候,命令返回的随机元素不会重复;为负数的时候,返回的随机元素可能重复 | srandmember key [count] |
SPOP | 从集合中随机的移除一个元素,并返回被移除的元素 | spop key |
SMOVE | 如果source-key集合中包含item元素,那么从source-key中移除该元素,并将该元素添加到集合dest-key集合中 | smove source-key dest-key item |
接下来的命令用于处理和组合多个集合 | ||
SDIFF | 返回存在于第一个集合但不存在于其他集合中的元素【差集】 | sdiff key1 [key2 ...] |
SDIFFSTORE | 将存在于第一个集合但不存在于其他集合中的元素【差集】存储到dest-key键里面 | sdiffstore dest-key key1 [key2 ...] |
SINTER | 返回同时存在于所有集合的元素【交集】 | sinter key1 [key2 ...] |
SINTERSTORE | 将同时存在于所有集合的元素【交集】存储到dest-key键里面 | sinterstore dest-key key1 [key2 ...] |
SUNION | 返回所有集合的元素【并集】 | sunion key1 [key2 ...] |
SUNIONSTORE | 将同时存在于所有集合的元素【交集】存储到dest-key键里面 | sunionstore dest-key key1 [key2 ...] |
3.4 散列
散列 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
HMGET | 返回散列中一个或者多个键的值 | hmget key hashkey1 [hashkey2 ..] | |
HMSET | 为散列设置一个或者多个键值对 | hmset key hashkey1 value1 [hashkey2 value2 ..] | |
HDEL | 删除散列中一个或者多个键值对,返回成功删除键值对的个数 | hdel key hashkey1 [hashkey2 ...] | |
HLEN | 返回散列中包含的键值对个数 | hlen key | |
HEXISTS | 返回给定的键是否存在于散列中 | hexists key hashkey | |
HKEYS | 获取散列中包含的所有键 | hkeys key | 尽管有hgetall了,但是hkeys和hvals仍然存在的必要。如果散列包含的值很大,那么用户可以先使用hkeys获取散列包含的所有键,然后分多次获取hget/hmget一个或者多个键值对,避免因为一次获取多个大体积的导致服务端阻塞 |
HVALS | 获取散列中包含的所有值 | hvals key | |
HGETALL | 获取散列中包含的所有键值对 | hgetall key | |
HINCRBY | 将键hashkey存储的值增加整数increment | hincrby key hashkey increment | |
HINCRBYFLOAT | 将键hashkey存储的值增加浮点数increment | hincrbyfloat key hashkey increment |
3.5 有序集合
有序集合 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
ZADD | 将带有分值的成员添加到有序集合里面 | zadd key score member [score member ..] | |
ZREM | 从有序集合中删除给定的成员,返回被删除的成员数量 | zrem key member [member ..] | |
ZCARD | 返回有序集合中成员数量 | zcard key | |
ZINCRBY | 给member成员的分值上加上increment | zincrby key increment member | |
ZCOUNT | 返回分值介于[min, max]之间的成员数量 | zcount key min max | |
ZRANK | 返回成员member在有序集合中的排名 | zrank key member | |
ZSCORE | 返回成员member的分值 | zscore key member | |
ZRANGE | 返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回 | zrange key start stop [withscores] | |
ZREVRANK | 返回成员member在有序集合中的【逆序,分值按照从大到小排序】排名 | zrevrank key member | |
ZREVRANGE | 按照逆序【分值按照从大到小排序】返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回 | zrevrange key start stop [withscores] | |
ZRANGEBYSCORE | 返回有序集合中分值介于[min,max]之间的成员 | zrangebyscore key min max [withscores] | |
ZREVRANGEBYSCORE | 按照分数值从大到小的顺序返回有序集合中分值介于[min,max]之间的成员 | zrevrangebyscore key min max [withscores] | |
ZREMRANGEBYRANK | 删除有序集合中排名介于[min,max]之间的成员 | zremrangebyrank key min max | |
ZREMRANGEBYSCORE | 删除有序集合中分值介于[min,max]之间的成员 | zremrangebyscore key min max | |
ZINTERSTORE | 用于计算多个有序集合的交集,并将结果存储在新的有序集合中 | zinterstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max] | 对集合求并集或者交集,不只是有序集合,对集合也可以。甚至有序集合和集合一起也可。这里的source-key可以是集合,如果是集合的话,集合中的元素分值默认为1 |
ZUNIONSTORE | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination | zunionstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max] |
3.6 发布与订阅
发布与订阅 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
SUBSCRIBE | 订阅一或多个频道 | subscribe channel [channel] | 发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息 |
UNSUBSCRIBE | 退订一或多个频道,如果没有给定频道那么退订所有频道 | unsubscribe [channel [channel]] | |
PUBLISH | 给指定频道发消息 | publish channel message | |
PSUBSCRIBE | 订阅与给定模式相匹配的所有频道 | psubscribe pattern [pattern] | |
PUNSUBSCRIBE | 退订给定模式的频道,如果没有给定模式那么退订所有频道 | punsubscribe [pattern [pattern]] |
虽然redis提供了发布和订阅功能,但是一般不建议使用,原因:
- redis的稳定性问题。如果订阅者读取消息的速度不够快的话,消息的不断积压会导致输出缓冲区越来越大,这可能会导致Redis 的速度变慢,甚至直接崩溃。也可能会导致Redis 被操作系统强制杀死,甚至导致操作系统本身不可用。新版的Redis 不会出现这种问题,因为它会自动断开不符合 client-output-buffer-limitpubsub配置选项要求的订阅客户端。
- 和数据传输的可靠性有关。任何网络系统在执行操作时都可能会遇上断线情况, 而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。 如果客户端在执行订阅操作的过程中断线,那么客户端将丢失在断线期间发送的所有消息。
3.7 其他命令
3.7.1 排序
排序 | |||
---|---|---|---|
命令 | 行为描述 | 示例 | 注释 |
SORT | 对列表、集合以及有序集合进行排序 | sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE destination] | BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709) |
3.7.2 过期时间
过期时间 | ||
---|---|---|
命令 | 行为描述 | 示例 |
PERSIST | 移除键的过期时间 | persist key |
TTL | 查看键距离过期还有多少秒 | ttl key |
EXPIRE | 让给定的键在指定秒数后过期 | expire key seconds |
EXPIREAT | 将键的过期时间设置为给定的unix的时间戳 | expireat key timestamp |
PTTL | 查看键距离过期还有多少毫秒 | pttl key |
EXPIRE | 让给定的键在指定毫秒数后过期 | expire key seconds |
EXPIREAT | 将键的过期时间设置为给定的unix的时间戳【毫秒精度】 | expireat key timestamp |
相关文章:

Redis实战-初识Redis
初识Redis 1、Redis简介2、 Redis数据结构简介3、 Redis命令3.1 字符串3.2 列表3.3 集合3.4 散列3.5 有序集合3.6 发布与订阅3.7 其他命令3.7.1 排序3.7.2 过期时间 如有侵权,请联系~ 如有错误,也欢迎批评指正~ 本篇文章大部分是来…...

spring boot中实现手动分页
手动分页 UserMapper.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace"cn.m…...

【优选算法】5----有效三角形个数
又是一篇算法题,今天早上刚做的热乎的~ 其实我是想写博客但不知道写些什么(就水一下啦) -------------------------------------begin----------------------------------------- 题目解析: 这道题的题目算是最近几道算法题里面题目最短的&a…...

C++打字模拟
改进于 文宇炽筱_潜水 c版的打字效果_c自动打字-CSDN博客https://blog.csdn.net/2401_84159494/article/details/141023898?ops_request_misc%257B%2522request%255Fid%2522%253A%25227f97863ddc9d1b2ae9526f45765b1744%2522%252C%2522scm%2522%253A%252220140713.1301023…...

最新版pycharm如何配置conda环境
首先在conda prompt里创建虚拟环境,比如 conda create --prefix E:/projects/myenv python3.8然后激活 conda activate E:/projects/myenv往里面安装点自己的包,比如 conda install pytorch1.7.1 torchvision0.8.2 -c pytorch打开pycharm 注意&#x…...

UML-对象图(Object Diagram)
一、定义 UML对象图用于描述系统中对象的状态和相互关系,是类图的一个实例化版本,主要展示了类图中定义的关系在特定时间点的实际体现。它帮助开发者在设计阶段理解对象之间的实际关系、属性值和状态,从而支持系统设计的准确性与有效性。 二、组成要素 UML对象图主要由以…...

Jmeter 动态参数压力测试时间段预定接口
🎯 本文档详细介绍了如何使用Apache JMeter进行压力测试,以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求,利用CSV文件动态配置时间段ID和用户token,确保了测试数据的真实性和有效性。文档中还…...

超大型集团合并报表数智管理转型
摘要:数字经济时代,数字化技术已成为驱动财务管理价值释放的重要引擎,数智化能力的提升是当前一流财务信息化建设的最新趋势。财务部门是企业的“数据交汇中心”和“信息加工中心”,通过对企业各项财务数据的分类、汇总和清晰呈现…...

[MCAL]Mcu配置
PostBuild: PreCompile: 选择时钟来源; 选择初始McuInitClock() 函数 电路手册里有晶振频率,如上所示;...

Qt基础项目篇——Qt版Word字处理软件
一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…...

算法刷题笔记——图论篇
这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…...

Java空指针异常处理:判空、Optional与Assert解析
在Java编程中,空指针异常(NullPointerException)是最常见的运行时错误之一。本文将深入探讨三种处理空指针异常的方法:传统的判空检查、Java 8引入的Optional类以及使用断言(Assert)。通过代码示例和应用场…...

【vim】vim编辑器如何设置行号
vim编辑器如何设置行号 一、**临时设置行号**二、永久设置行号2.1. **用户配置文件方式(针对当前用户)**2.2. **全局配置文件方式(谨慎使用,会影响所有用户)** 在Vim中设置行号有以下两种常见的方法: 一、…...

MySQL可直接使用的查询表的列信息
文章目录 背景实现方案模板SQL如何查询列如何转大写如何获取字符位置如何拼接字段 SQL适用场景 背景 最近产品找来,想让帮忙出下表的信息,字段驼峰展示,每张表信息show create table全部展示,再逐个粘贴,有点太耗费时…...

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)
|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&am…...

《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: 《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风…...

使用LabVIEW的History功能实现队列数据的读取而不清空
在LabVIEW中,有多种方法可以读取队列中的数据而不清空它。使用 Dequeue Element 和 Enqueue Element 函数可以实现读取并重新插入数据回队列,但当需要处理大数据流或需要更动态的解决方案时,这种方法可能会变得繁琐。一个更高效的解决方案是利…...

电脑如何访问手机文件?
手机和电脑已经深深融入了我们的日常生活,无时无刻不在为我们提供服务。除了电脑远程操控电脑外,我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么,如何使用电脑远程访问手机上的文件呢? 如何使用电脑访问手机文件…...

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用
SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务(适用于小型应用)二. 使用调度框架…...

java上传图片功能实现
1 MinIO核心概念 下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。 对象(Object) 对象是实际的数据单元,例如我们上传的一个图片。 存储桶(Bucket) 存储桶是用于组织对象的命…...

73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)
进入靶场 又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码 <?php // 检查 URL 是否为内部 IP 地址 function check_inner_ip($url) {// 使用正则表达式检查 URL 格式是否以 http、https、gopher 或 d…...

【FreeRTOS 教程 一】任务结构体及其基础创建使用
目录 一、任务与协程的区别: (1)任务的特点: (2)协程的特点: (3)总结: 二、任务概述 : (1)任务状态: &…...

深入剖析 JVM 内存模型
前言: 下面分别介绍了新生代和老年代的不同收集器及其相关子类型,并附有示例代码和说明,感兴趣的朋友可以参考一下。 简介: 在 Java 虚拟机(JVM)的世界里,内存模型是其核心架构之一࿰…...

解决DeepSeek-R1模型在Cursor中使用报错的问题
在使用Cursor时,如果你尝试调用DeepSeek-R1模型,可能会遇到以下报错信息: {"error": {"message": "deepseek-reasoner does not support successive user or assistant messages (messages[1] and messages[2] in …...

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件
介绍 .NET 6.0 已经发布,ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如,“谁动了我的奶酪”,它在哪里Startup.cs?在这篇文章中,我将深入研究这个问题,看看它移动到了哪里以及其他变化。…...

Java如何向http/https接口发出请求
用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一个工具类 import javax.net.ssl.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Outpu…...

数据分析 变异系数
目录 变异系数的应用场景包括: 特点: 注意事项: np.nanvar——方差,np.sanstd标准差 简单来讲就是平均值/标准差 变异系数(Coefficient of Variation, CV)是一种相对量的变异指标,常用于衡…...

利用免费GIS工具箱实现高斯泼溅切片,将 PLY 格式转换为 3dtiles
在地理信息系统(GIS)和三维数据处理领域,不同数据格式有其独特应用场景与优势。PLY(Polygon File Format)格式常用于存储多边形网格数据,而 3DTiles 格式在 Web 端三维场景展示等方面表现出色。将 PLY 格式…...

面试-二维数组
应用 快递业务有N个站点,1<N<10000;站点0、站点1可达,记作0-1;如果0-1、1-2,则站点0、站点2可达,记作0-2;s[i][j]1表示i-j可达,反之s[i][j]0表示i-j不可达;s[i][j…...

如何使用 findIndex() 方法查找数组中的第一个匹配元素的索引?
使用 findIndex() 方法查找数组中第一个匹配元素的索引 目录 简介findIndex() 方法概述如何使用 findIndex() 查找第一个匹配元素的索引 基本用法使用箭头函数和回调函数 实际项目中的代码示例 示例 1:查找第一个符合条件的用户索引示例 2:查找第一个符…...