Redis基本操作

2023-05-16

安装Redis

docker-compose安装—单节点

version: "3.3"
services:
    master:
      image: redis:6.0
      container_name: redis
      environment:
        - "discovery.type=single-node"
      command: redis-server --port 6379 --requirepass liuy13141@  --appendonly yes
      restart: always
      ports:
        - 6379:6379
      volumes:
        - /home/redis/data:/data 

Redis命令

select 1; 选择1号DB
DBSIZE; 当前选择DB大小
set name “liuy” 设置key:value
get name 获取key 的value
keys * 查看所有Key
flushall 清空全部DB的key
flushdb 清空当前DB的Key

Redis单线程

redis基于内存操作,CPU不是Redis性能瓶颈。
Redis瓶颈:机器的内存和网络贷款
每秒10w+的QPS
数据操作速度:CPU>内存>硬盘

Redis单线程为什么快?

redis所有数据都存放内存中,所有单线程操作起来快,多线程会存在CPU上下文切换耗时操作,对于内存系统而言,没有上下文切换就是效率最高。多次读写都在一个CPU上。

数据类型

  • String

    • 在key原有value后面追加value

      APPEND key value .

    • 获取字符串长度

      STRLEN key

    • incr key 自增1
      decr key 自减1
      INCRBY key 10 自增步长10
      DECRBY key 10 自减步长10

    • 获取字符串范围值

      GETRANGE key 0 9 0~-1表示获取全部

    • 替换指定位置开始的字符串

      SETRANGE key 1 “liuy”

    • 分布式操作

      setex key 20 “liuy” 设置 过期时间
      setnx key “liuy” 如果key不存在创建key,如果存在创建失败
      msetnx key1 value1 key2 value2 同时设置多个值,原子操作要不全部成功,要么就失败。

    • 同时获取多个值

      mget key1 key2

    • 设置对象

      mset user:uuid:name zhangsan user:uuid:age :22
      设置对象值user:{id}:{filed}

    • 先get再set

      getset key value 先get再set 如果不存在返回nil,存在返回原来值,再设置新值。 更新操作

  • List 适合两端操作,消息队列

    • 插入list

      LPUSH Llist one/two/three 从头开始插入
      RPUSH Rlist one/two/three 从尾开始插入

    • 出list

      Lpop Llist -->one 从头开始移出
      Rpop Llist -->three从尾开始移出

    • 获取list所有值

      LRANGE list 0 -1

    • 通过下标获取值

      Lindex list 1 获取下标1的list值

    • 返回list长度

      Llen list 返回list长度

    • 移除list中指定值

      lrem list 2 one 移除list中2个为one的值

    • 通过下标截取指定长度list

      ltrim list 1 2 list只保留截取的元素

    • 移除list最后一个元素,push到另外一个list中

      rpoplpush list newlist; 返回移除的元素

    • 替换list指定下标的值

      lset list 0 “123” 如果下标0存在就更新值,不存在报错:index超出

    • 将value插入到指定元素的前面或后面

      linsert list before “world” “other” 把other插入到list前面
      linsert list after"world" “other” 把other插入到list后面面

  • Set set不可重复 共同好友

    • 添加

      sadd myset value

    • 查看指定set所有值

      SMEMBERS myset

    • 判断value是否存在

      SISMEMBER myset value 存在–1 不存在–0

    • 获取set集合中元素个数

      scard myset

    • 移除set集合指定value

      srem myset hello 移除集合中的hello

    • 随机获取元素

      SRANDMEMBER myset
      SRANDMEMBER myset 2 随机两个元素

    • 随机移除元素

      spop myset

    • 移除指定值到另一个set集合

      smove myset myset2 “movevalue”

    • 共同好友,并集

      SDIFF setkey1 setkey2 差集
      SINTER setkey1 setkey2 交集 共同好友
      SDIFF setkey1 setkey2 并集

  • Hash Map 集合–key:value 处理对象

    • 插入

      hset hashname hashkey hashvalue
      hmset hashname hashkey hashvalue hashkey hashvalue

    • 获取

      hget hashname hashkey
      hmget hashname hashkey hashkey
      hgetall hashname

    • 删除指定key,对应value也没有了

      hdel hashname hashkey

    • 获取hash表key数量

      hlen hashname

    • 判断hash中指定key存在

      hexists hashname hashkey

    • 获取所有key,value

      hkeys hashname
      hvals hashname

  • Zset 排序集合 排行榜

    • 添加

      zadd ZsetName 1 value
      zadd ZsetName 2 value1 3 value2

    • 排序

      ZrangeBySCORE ZsetName -inf +inf 从小到大
      ZrangeBySCORE ZsetName -inf 5000 withscores 升序到5000并显示key
      ZREVRANGE ZsetName 0 -1 降序

    • 移除Zset指定元素

      zrem ZsetName value

    • 获取Zset中元素个数

      zcard ZsetName

设置key有效期

EXISTS key 判断key存在 1 存在-0 不存在
move key 移除 key
EXPIRE key 10 设置key10秒过期
ttl key key剩余时间过期
type key 当前key类型

Geospatial 地理位置

底层采用Zset,可用zset命令操作
经纬度查询

  • 添加地理位置 纬度,经度 ,名称

    geoadd china:city 39.90 116.40 beijin

  • 获取指定城市的经度纬度

    geopos china:city beijing chongqin 返回坐标值

  • 获取两地的直线距离

    geodist china:city beijing shanghai km

  • 附近的人(半径查询)

    georadius china:city 110 30 1000 km 【withdist 距中心距离】【withcoord 经纬度】【count 1 查询个数】
    以110,30 经纬度为中心 1000km半径内的城市

  • 找指定元素周围坐标 —定位

    geoRadiusByMember china:city beijing 1000km 北京1000km内的东西

Hyperloglog 基数统计(允许容错)

优点: 占用内存固定,264不同的元素技术,12KB内存。
一个人访问一个网站多次,记作一次。

PFadd mykey1 p1 p2 p3 p4 p5 p6 创建第一组用户
PFadd mykey2 p2 p7 p3 p8 p5 p10 创建第二组用户
PFMERGE mykey3 mykey1 mykey2 合并1和2 ==> key3
PFCOUNT key3 并集数量

Bitmaps(统计两种状态的数据)

位运算储存
记录是否签到,只需要46字节就能存储365天数据
365天=365bit 1B=8bit 365/8=46个B

setbit person1 1 1; 用户1 第一天签到
setbit person1 2 1; 用户1 第二天签到
setbit person1 3 0; 用户1 第三天未签到
setbit person1 4 1; 用户1 第四天签到

查看某天签到情况

getbit person1 3—>0
getbit person1 4—>1

统计签到天数

bitcount person1—>3

事务

Redis事务:一组命令的集合,一个事务中所有命令的都会被序列化,在事务执行过程中,顺序执行,保证一次性,顺序性,排他性。
Redis没有事务隔离级别概念。
Redis事务中,并不是直接执行,要发起执行命令才执行
Redis只保证单条命令的原子性,事务不保证。

事务过程: 开启事务(multi),命令入队,执行事务(exec)。
执行完成后 ,一组事务就结束。

放弃事务(DISCARD) ,队列中命令全部取消

  • 编译时异常(代码问题),事务中所有命令都不会执行
    1. mulyi 开启事务
    2. set key1 v1 :入队成功
    3. getset key1 :命令报错,仍可继续加入事务队列 .
    4. exec :事务执行时会编译报错,所有命令都不会执行
  • 运行时异常(1/0) ,其他命令正常执行,错误命令抛出异常
    1. mulyi 开启事务
    2. set key “v1” :入队成功
    3. incr key:将key1的值自增,此时命令编译不会报错(执行时:String格式自增会报错)。
    4. exec :事务执行时会抛出错误,但其他命令正常执行

乐观锁

通过比较version,判断是否有人修改数据。

监视过程中,如果有其他线程修改监视的值,那后面的事务一定失败;

  1. UNWATCH 事务执行失败,先解锁
  2. watch money; 获取最新值,监视money;
  3. multi 开启事务
  4. DECRBY money 10 取钱10
  5. INCRBY money 100 存钱 100
  6. exec; 比较监视器中的值

jedis与lettuce

jedis:采用直连,多线程操作,不安全;如果需要避免线程不安全,使用jedis pool 连接池,类似BIO模式。
lettuce:采用netty,实例可多线程中共享,不存在线程不安全;可减少线程数据,类似NIO模式。

Redis常用配置

######网络配置##########
# 指定 redis绑定的IP地址,如果不进行设置,那么将处理所有请求
bind 127.0.0.1

#保护模式,默认开启。
protected-mode yes

# 端口号
port 6379

######通用配置##########
# 守护进程方式运行,默认no
daemonize yes  

#以后台方式运行指定pid进程文件
pidfile /var/run/redis_6379.pid

# 日志
#debug(记录所有日志信息,适用开发阶段)
#verbose(记录大部分日志信息)
#notice(适当的日志信息,适合生产环境,默认级别)
#warn(只有记录非常重要的信息)
loglevel notice

# 日志文件的位置
logfile /usr/local/redis.log

############快照###############
#持久化,规定时间内执行多少次操作,就会持久化到文件
save 900 1   #900s 内,至少一个key进行修改,则进行持久化
save 300 10  #300s 内,至少10个key进行修改,则进行持久化
save 60 10000  #60s 内,至少10000个key进行修改,则进行持久化

#持久化出错后,是否继续工作 默认开启
stop-writes-on-bgsave-error yes

#压缩RDB文件,消耗一定的CPU资源 默认开启
rdbcompression yes

#保存RDB文件时,进行错误检查校验   默认开启
rdbchecksum yes

# RDB、AOF生成的当前目录
dir ./

############安全###############
# 设置密码   默认没有密码
# 密码得有点难度,redis认证密码太快了
requirepass foobared

#######附加模式##############
#aof持久化模式,默认关闭
appendonly no
appendfilename "appendonly.aof"

#同步数据
#always   每次修改都会sync同步,消耗性能
#everysec  每秒执行一次,可能丢失这一秒数据
#no  不执行sync,由操作系统同步数据,速度最快
appendfsync everysec

Redis持久化

RBD快照(默认)

持久化:指定时间间隔将内存的数据集快照写入硬盘,恢复时将快照文件直接读到内存中。

RDB持久化过程:单独创建(fork)一个子进程进行持久化,将内存中的数据写入临时RDB文件中,待持久化过程结束,再用这个临时文件替换上次的持久化文件。

整个持久化过程中,主进程不进行任何IO操作,保证性能。
因为RDB需要时间,所有最后一次的持久化数据可能丢失。

设置密码config set requirepass “”

触发机制

  • save规则满足情况,触发RDB
  • 执行flushall命令,触发RDB
  • 退出redis,触发RDB

恢复RDB文件

  • config get dir #找到redis启动目录
  • xxx.rdb 放到redis启动目录中,自动检查rdb恢复其中数据。

优点

  • 适合大规模的数据恢复
  • 对数据完整性要求不高

缺点

  • 需要一定时间间隔进程操作
  • 如果redis意外宕机,最后一次修改的数据就丢失了
  • fork子进程的会占用一定的内存空间

AOF

AOF持久化过程:单独创建(fork)一个子进程进行持久化,根据内存中数据快照,将改变数据的每个写命令以日志的形式记录,只追加到AOF文件中,redis重启会读取文件重新构建数据(所有指令全部执行一次)。

修复aof文件

  • redis-check-aof --fix appendonly.aof

优点:

  • 每次修改都同步,文件完整性更好
  • 每秒同步一次,可能丢失一秒数据
  • 从不同步,效率最高
    缺点:
  • aof远远大于rdb文件,修复速度比rdb慢。
  • aof运行效率比rdb慢,会进行大量IO操作。

扩展:

  1. RDB持久化方式能指定时间间隔内对数据进行快照存储。

  2. AOF持久化方式记录每次对服务器的写操作,当服务器重启时重新执行这些命令来恢复数据,AOF命令以Redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件体积不至于过大。

  3. 只做缓存,可以不用持久化。

  4. 同时开启两种持久化方式

    • Redis重启会优先载入AOF文件来恢复数据,通常情况AOF文件保存数据比RDB的数据集更完整。
    • RDB更适合备份数据库,AOF文件不断变化可能出现BUG,不易备份。
  5. 性能

    • RDB文件只做后备用途,建议在Slave上持久化RDB文件 。
    • 开启AOF,好处:最恶劣情况也只是丢失不操作2秒数据,代价:带来持续的IO操作,rewrite产生新数据带来的阻塞。
    • 关闭AOF,仅靠Master-Slave Repllcation实现高可用,好处:省掉IO,减少rewrite带来系统波动。代价:主从同时宕机,会丢失十几分钟数据。启动脚本会比较主从中RBD文件,载入较新的那个。

Redis主从复制(一主三从)

默认情况:每台redis都是主机。只需要配置从机。
主从复制:将一台主服务器上的数据复制到其他从服务器,数据复制单向的,只能从主节点到从节点,Master以写为主,Slave以读为主。

作用:

  1. 数据冗余:实现数据的热备份,持久化之外的一种数据冗余方式。
  2. 故障恢复:主节点故障,从节点提供服务,实现快速故障恢复;实际上一种服务的冗余。
  3. 负载均衡:主从复制基础上,配合读写分离,主节点负者写服务,从节点负者读服务,分担服务器负载。
  4. 高可用的基石:哨兵和集群的实施基础。

环境配置:
通过命令配置,只生效一次,重启即失效。

  1. 拷贝配置文件

    cp redis.conf redis6379.conf
    cp redis.conf redis6380.conf
    cp redis.conf redis6381.conf
    cp redis.conf redis6382.conf

  2. 修改port、pidfile、logfile、dbfilename

    pidfile /var/run/redis_6379.pid
    port 6379
    logfile “redis_6379.log”
    dbfilename dump6379.rdb

  3. 只配置从机

    slaveof 127.0.0.1 6379 从机连接到6379端口的主机
    slaveof no one 自己就是主机
    info replication 查看redis信息

  4. 完成主写从读

复制原理:

  1. Slave启动连接master后发送一个Sync同步命令
  2. Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,master将整个数据文件传送到slave,并完成一次完全同步。
  3. 全量复制:slave接收到数据文件后,将其存盘并加载到内存。自动执行。
  4. 增量复制:master继续将的所有收集到的修改命令依次传给slave,完成同步。

Redis哨兵(自动选举主机)

  1. 基础配置文件sentinel.conf

    sentinel monitor redis 127.0.0.1 6379 1
    redis 被监控名称
    host
    port
    1 主机挂了,自动投票选出主机

  2. 启动哨兵

    redis-sentinel sentinel.conf

优点:

  1. 哨兵集群,基于主从复制模式
  2. 主从切换,故障可以转移,系统可用性更好
  3. 哨兵模式就是主从模式升级,自动选取主机
    缺点:
  4. Redis不好在线扩容,集群容量达到上限,在线扩容麻烦。
  5. 哨兵模式配置多。

Redis缓存穿透和雪崩

缓存穿透

缓存穿透:redis缓存中没有命中,再向数据库中查询,也没有。导致查询失败。大量请求都这种状态,会给数据库造成很大压力,这就是缓存穿透。

解决方案:

  1. 布隆过滤器

    一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先校验,不符合则丢弃,避免对底层存储系统造成压力。

  2. 缓存空对象

    即使查到的数据为空,也缓存起来。
    浪费空间,造成数据不一致问题。

缓存击穿

缓存击穿:缓存中的热点数据在大并发情况下,突然失效,造成大量并发直接请求服务器。好像在墙上凿了一个洞。
解决方案:

  1. 热点数据key永不过期
  2. 分布式锁

    对于每个key同时只能一个线程去查询后端服务,其他线程没有获得分布式锁就等待。将高并发压力转换到分布式锁。

缓存雪崩

缓存服务断网
解决方案:

  1. redis高可用

    异地搭建集群

  2. 限流降级

    缓存失效后,通过加锁或者队列控制读数据库的线程数量。

  3. 数据预热

    正式部署前,将热点数据预先访问一遍,设置不同过期时间,让失效时间尽量均匀。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis基本操作 的相关文章

  • Linux shell脚本编程时bad substitution解决办法

    首先 xff0c 我们要理解bad substitution的字面意思 xff0c 它的字面意思是 替换错误 的意思 这种错误的原因呢 xff0c 通常是我们编写脚本时 和 xff08 xff09 错误使用导致的 比如应该用 xff08 x
  • Vue中的watch 和computed 属性

    之前写过一篇关于computed计算属性的文章 xff0c 详见这里 computed 内的function只执行一次 xff0c 仅当function内涉及到Vue实例绑定的data的值的改变 xff0c function才会从新执行 x
  • Swift使用XMPPFramework做IM即时通信的Demo

    上一篇文章处理了文本中表情的替换 xff0c 现在来完成消息的发送功能吧 xff08 貌似前后并没有逻辑关系哈 xff09 首先为了测试 xff0c 我们需要下载spark工具 xff0c 它可以连接openfire搭建的后台来完成即时通信
  • P1591 阶乘数码

    题目描述 求n 中某个数码出现的次数 输入格式 第一行为 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数n n 1000 和数码 a 输出格式 对于每组数据 xff0c 输出一个整数 xff0c 表示 n
  • nginx缓存命中率统计(转)

    转自 xff1a http www libertyvps com thread 275 1 1 html nginx提供了 upstream cache status这个变量来显示缓存的状态 xff0c 我们可以在配置中添加一个http头来
  • windows远程桌面连接到Linux服务器(ubuntu系统)、解决xrdp登录界面port问题、解决password failed

    一 xff1a 一般在windows系统安装ssh客户端远程连接Linux服务器 xff0c 可以很方便地传输文件 xff08 注意 xff1a 文件路径不能有小括号 xff0c 空格之类的 xff0c 不然会出现erro xff09 但如
  • linux之文件系统命令

    第一章 linux之帮助命令 第二章 linux命令行快捷键 第三章 linux之防火墙 第四章 linux之服务开机自启 第五章 linux之关机与重启 第六章 linux之环境变量 第七章 linux之目录操作命令 第八章 linux之
  • 解决linux底下cmake编译使用C++ 11标准库自带的thread报错问题

    本人在编写linux底下socket编程测试服务端时候 xff0c 发现使用std thread函数时候 xff0c cmake编译通过 xff0c make编译失败 xff0c CMakeLists txt如下 xff1a cmake m
  • unity UGUI 解决ScrollView加载大量Item导致卡顿的问题

    目录 1 引言2 问题分析3 代码部分4 使用举例4 1 场景搭建4 2 测试4 3 效果展示 5 Demo下载6 结束语 1 引言 我们在平常的开发中常常碰到列表类的数据处理 xff01 典型的像玩家列表这种可能数量非常庞大 xff0c
  • 使用 Amazon EC2 启动 Windows 虚拟机

    本教程将教授您如何使用 Amazon Elastic Compute Cloud EC2 来启动 配置和连接至 Windows 虚拟机 Amazon EC2 是用于在云中创建和运行虚拟机 xff08 我们将这些虚拟机称为 实例 xff09
  • linux ss 命令用法说明

    ss 是 Socket Statistics 的缩写 ss 命令可以用来获取 socket 统计信息 xff0c 它显示的内容和 netstat 类似 但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息 xff0c 而
  • 谷歌浏览器 跨域遇到的坑 cors 错误(亲测可行)

    浏览器版本 xff1a 一 现象 xff1a 解决方案 xff1a 方案一 xff1a xff08 已论证 xff09 步骤1 xff1a 谷歌浏览器 打开 chrome flags block insecure private netwo
  • 安装Visual Studio 2015时出现安装包丢失或损坏

    1 现象描述 在线安装vs时 xff0c 在线下载一直为0 xff0c 提示网络异常 xff0c 检查网络 xff1b 实际网络是能联网的 离线安装ISO xff0c 安装1分钟左右 提示安装包损坏或丢失 xff0c 选择从inter下载或
  • 数据库实验-数据查询练习

    用SQL语句完成以下查询 1 查询所在系为 CS 的学生学号和姓名 xff1b select sno sname from student where sdept 61 39 CS 39 2 查询选修了3号课程的学生学号 xff1b sel
  • web前端播放视频基础(多种格式,mp4, ogg, flv)(普通项目和vue项目)

    前端播放视频 满足一般播放条件 话不多说 先上代码 以下包含我能做出来可以做出来播放的视频格式 测试ok 可能还有ogg和wmv的格式可以播放 但我没测试通过 所以不展示 span class token keyword if span s
  • javascript中正则匹配多个条件, 常用正则匹配, 正则详解

    javascript中正则匹配多个条件 常用正则匹配 正则表达式常用方法实现其他的常用正则匹配详解 注意 本篇文章是根据在下日常编码过程中逐渐丰富的 越往后看 收获越丰富 收藏起来以后随时回顾 准备工作 1 汉字和unicode码的在线转换
  • antd react ProTable 基本使用

    antd react pro系列 ProTable 基本使用 一 安装二 常用字段 antd 全称 Ant Design 是目前来说运用最广泛的 react 的 ui 框架 下文就用略写 antd 代替了 pro系列不做过多解释 毕竟ui框
  • canvas插件 fabric.js 使用

    fabric js使用 fabric js 是 常用的 canvas 插件1 在项目中使用2 特殊用法 基本设置 画板数据的导入导出 遮罩 Pattern 引用官网案例 多个对象合并 并设置为 fabric 背景 适用于变色和更多场景 把
  • 前端 百度地图 javascript api 在线地图, 离线地图

    前端 百度地图 javascript api 在线地图 离线地图 在线地图登录百度api获取key注册为个人开发者后 创建应用 离线地图 瓦片地图 下载离线瓦片地图二 下载api js 一些常用api难找见的api 在线地图 在线地图 百度
  • 基于 jquery imagesloaded masonry 实现的瀑布流图片展示

    基于 jquery imagesloaded masonry 实现的瀑布流图片展示 基于 jquery imagesloaded masonry 实现的瀑布流图片展示简述 xff0c 版本 xff0c 及插件案例htmlcssjs 基于 j

随机推荐

  • 微信小程序开发双重for循环, wx: if else 语法

    微信小程序开发 双重for循环 多重for循环 重点在于 wx for item 61 34 problemItem 34 和 wx for index 61 34 idx 34 确定循环的 item 和index 理论上可以实现无上线条循
  • react hocks ggeditor 脑图开发(双向细目表), 实用技巧

    ggeditor脑图开发 目录 配置说明api介绍 xff0c 引入插件 xff0c 获取api xff08 withPropsAPI xff09 xff0c 获取node api xff0c 常用api汇总 xff0c 绑定事件功能实现
  • TX2开发板CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed.

    因为之前已经cmake过 把之前cmake生成的build目录中的文件 xff0c 以及opencv目录下生成的CmakeCache txt删除就可以解决了
  • 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1 可以刷成电视 43 游戏盒子的双系统 也可以刷成单独的电视盒子和游戏盒子 不过因为内存有限放不了多少游戏 还是建议用外置SD卡存储游戏比较合适 2 刷成Armbian linux系统 xff08 可以实现docker 可
  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务
  • SpringBoot实现全局异常处理器

    1 本文使用 64 ControllerAdvice 64 ExceptionHandler 进行全局的 Controller 层异常处理 不用在 Controller 层进行 try catch xff01 package com exa
  • 排序算法的对比

    冒泡排序VS选择排序 两者时间复杂度O n2 冒泡排序找最大值放在最后 xff0c 选择排序找最小值放在前面 选择排序属于不稳定排序 xff1b 选择排序一般情况下优于冒泡排序 xff0c 每轮只交换一次 如果集合有序度高 xff0c 则选
  • Redis基本操作

    安装Redis docker compose安装 单节点 version 34 3 3 34 services master image redis 6 0 container name redis environment 34 disco