当前位置: 首页 > news >正文

Redis面试题 (2023最新版)

文章目录

    • 一、Redis为什么快?
      • 1、纯内存访问
      • 2、单线程,避免上下文切换
      • 3、渐进式ReHash、缓存时间戳
        • (1)渐进式ReHash:
        • (2)缓存时间戳:
    • 二、Redis合适的应用场景
      • 常用基本数据类型(5种)
      • 1、字符串(String)
        • (1)缓存
        • (2)计数器
        • (3)分布式会话(共享Session)
      • 2、哈希(Hash)
      • 3、列表(list)
        • (1)消息队列
        • (2)文章列表
      • 4、集合(set)
        • (1)标签(tag)
        • (2)随机数(抽奖活动)
        • (3)社交图谱
      • 5、有序集合(ZSET)
        • (1)排行榜
      • Redis高级数据结构
      • 6、Bitmaps
        • (1)布隆过滤器
      • 7、HyperLogLog
        • (1)UV
    • 三、Redis为什么6.0之前不支持多线程
      • 1、Redis的瓶颈不是CPU,受制于内存、网络
      • 2、提高Redis性能,Pipeline(命令批量)
      • 3、单线程,内部维护成本相对较低,不需要管理多线程安全
      • 4、多线程(线程切换、加锁/解锁、导致死锁问题)
      • 5、惰性Rehash(渐进式)减少阻塞
    • 四、Redis为什么6.0之后引入多线程
        • 本质:多线程任务 分摊到Redis 同步IO中,读写负载。
    • 五、Redis有哪些高级功能
      • (1)慢查询
      • (2)Pipeline
      • (3)watch命令:
      • (4)Redis+Lua语言实现限流
      • (5)分布式锁
        • 锁的过期时间不好计算
        • 解决方案:分布式锁加入看门狗
      • (6)高并发高可用
      • (7)哨兵:Redis Sentinel
        • 主从复制的问题
    • 六、为什么需要使用Redis
      • 1、高性能
      • 2、高并发
    • 七、Redis的事务
    • 八、Redis的过期策略以及内存淘汰机制
      • 1、内存淘汰机制
      • 2、过期策略
      • 3、缓存淘汰算法
    • 九、什么是缓存穿透?如何避免?
      • 布隆过滤器的应用:
    • 十、什么是缓存雪崩?如何避免?
      • 原因:
        • 1、Redis失效、宕机(故障)
        • 2、Redis大量key的ttl过期
    • 十一、Redis如何设计分布式锁
      • 1、概念
      • 2、问题
    • 十二、什么是bigkey?会有什么影响?
        • 1、概念:
        • 2、字符串类型:
        • 3、非字符串类型:
        • 4、危害:
        • 5、解决方案:value拆分
    • 十三、Redis如何解决key冲突
      • 1、业务隔离
      • 2、key的设计
      • 3、分布式锁
      • 4、时间戳
    • 十四、怎么提高换成命中率
      • 1、提前加载
      • 2、增加缓存的存储空间,增加缓存的数据
      • 3、调整缓存的存储类型
      • 4、调整缓存的存储类型
    • 十五、Redis持久化方式有哪些方式?有什么区别?
      • 1、持久化:
      • 2、RDB(Redis DataBse):
      • 3、AOF:
      • 4、生产环境中一般采用混合两者的方式
    • 十六、为什么Redis需要把所有数据放到内存中?
        • 1、内存访问与磁盘访问的差距:
        • 2、Redis通过异步,持久化将数据写入磁盘
        • 3、随着技术的发展,硬件上来说内存也越来越便宜了
        • 4、默认情况下,哪怕Redis内存不够了,也不会发生宕机,而是只可读不能写(Noeviction策略)
        • 5、通过内存淘汰策略,确保整体服务正常运行
    • 十七、如何保证缓存与数据库双写一致性?
        • 1、新增数据类
        • 2、更新缓存类
          • (1)先更新缓存,在更新DB(一般不考虑)
          • (2)先更新DB,在更新缓存(一般不考虑)
        • 3、删除缓存
          • (3)先删除缓存,后更新DB
            • 问题:
            • 解决方案:
          • (4)先更新DB,后删除缓存
        • 4、如何选择
          • 伪代码实现延迟双删:
    • 十八、Redis集群方案
        • 1、分布式解决方案 :Redis Cluster
          • 方案:
            • (1)客户端分区:
            • (2)代理方案:
        • 2、虚拟槽分区(0~16383)
        • 3、集群功能限制
        • 4、搭建集群
    • 十九、Redis集群方案什么情况下会导致整个集群不可用?
        • 集群不可用判定:
    • 二十、Redis集群会有写操作丢失吗?为什么?
    • 二十一、Redis常见性能问题和解决方案
        • 1、持久化 性能问题
        • 2、数据比较重要,开启AOF。策略最好配置每秒同步。
        • 3、主从复制 流畅,建议同一个局域网内操作,负责网络开销过大
        • 4、尽量避免主库压力过大,增加从库
        • 5、主从复制 尽量不要使用网状结构、线性结构
    • 二十二、热点数据和冷数据
        • 1、热数据
        • 2、冷数据
    • 二十三、什么情况下可能会导致Redis阻塞
        • 1、客户端阻塞
        • 2、BIGkey删除
        • 3、清空库
        • 4、AOF日志同步写,记录AOF日志
        • 5、从库 加载RDB文件
        • 6、Redis尽量部署在独立的服务器中
    • 二十四、线上Redis响应慢处理思路

一、Redis为什么快?

1、纯内存访问

相比查询数据库(访问磁盘)要快很多

2、单线程,避免上下文切换

内部执行命令为单线程,避免上下文切换带来的CPU开销

3、渐进式ReHash、缓存时间戳

(1)渐进式ReHash:

Redis使用全局哈希表来保存所有键值对,

哈希表相当于一个数组,数组的每个元素称为一个哈系桶,每个哈系桶中保存了键值对的数据。

在这里插入图片描述

数据增加到一定阈值,数组扩容会导致数据发生移动,此时访问会发生阻塞

渐进式ReHash:把一次性大量拷贝(数组移动)的开销,分摊到多次处理请求的过程中。

Redis默认使用两种全局哈希表,开始插入数据时默认使用哈希表1,此时哈希表2并没有被分配空间。随着数据逐步增多,开始执行ReHash。

  1. 给哈希表2分配更大的空间,
  2. 将哈希表1中的数据重新映射并拷贝到哈希表2中
  3. 释放哈希表1的空间

在这里插入图片描述

(2)缓存时间戳:

业务中需要用到时间戳时,一般会使用System.currentTimeMillis()或者New Date()等方式获取系统的毫秒时间戳,每一次获取都是一次系统调用(需要调用操作系统中对应的函数,涉及上下文切换),相对比较耗时。

作为单线程的Redis承受不起,因此它由一个定时任务,每毫秒更新一次缓存,获取时间都是从缓存中直接拿。

二、Redis合适的应用场景

常用基本数据类型(5种)

名称英文名作用域
字符串String缓存、计数器、分布式Session
哈希Hash存放对象
列表list消息队列、文章列表
集合set标签、随机数、社交图谱
有序集合ZSET排行榜
BitmapsBitmaps布隆过滤器
HyperLogLogHyperLogLogUV

1、字符串(String)

命令的时间复杂度:

字符串这些命令中除了del、mset、mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),getrange的字符串长度相关,也是O(n),其余的命令基本上都是O(1)的时间复杂度,在速度上还是非常快的。

(1)缓存

具有支撑高并发的特性,能起到加速读写的作用,降低后端压力

(2)计数器

实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源

(3)分布式会话(共享Session)

问题:如果一个分布式Web服务将用户的Session信息保存在各自服务器中,出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问,可能会发现需要重新登录。

解决方案:使用Redis将用户的Session进行集中管理,这种情况下只要保证Redis是高可用和扩展性的,每次用户更新或查询登录信息都直接从Redis集中获取。

2、哈希(Hash)

适用于存放对象,相较于String类型存储对象时效率开发效率更高。

3、列表(list)

用来存储多个有序字符串

(1)消息队列

lpush+brpop命令组合即可实现阻塞队列,生产环境客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的”抢“列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

(2)文章列表

每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,有序,且支持按照索引范围获取元素

还可实现其他数据结构

img

4、集合(set)

(1)标签(tag)

例如一个用户可能对娱乐、体育感兴趣,另一个用户可能对历史、新闻感兴趣,这些兴趣点就是标签。通过这些数据可以得到喜欢同一个标签的人,这些数据对于用户体验以及增强用户粘度比较重要。

(2)随机数(抽奖活动)

(3)社交图谱

5、有序集合(ZSET)

(1)排行榜

多维度:时间、浏览量、获赞数等等。

Redis高级数据结构

6、Bitmaps

可以实现对位的操作,单独提供了一套命令,可以想象成以位为单位的数组,数组下标叫做偏移量。

在这里插入图片描述

(1)布隆过滤器

在这里插入图片描述

7、HyperLogLog

(1)UV

统计每个网页每天的UC数据,HyperLogLog提供不精确的去重计数方案,误差0.81%

在这里插入图片描述

三、Redis为什么6.0之前不支持多线程

1、Redis的瓶颈不是CPU,受制于内存、网络

存储于内存,快速读写网络开销大

2、提高Redis性能,Pipeline(命令批量)

每秒100万个请求包装进Pipeline

3、单线程,内部维护成本相对较低,不需要管理多线程安全

命令执行顺序不确定性,读写并发问题

4、多线程(线程切换、加锁/解锁、导致死锁问题)

5、惰性Rehash(渐进式)减少阻塞

一般的公司,单线程Redis就够了。

四、Redis为什么6.0之后引入多线程

1、小数据包。数据-》内存 响应时间 100ns 8w-10wQPS(极限)

2、针对大的公司,需要更大的QPS,IO的多线程(内部执行命令还是单线程)

3、为什么不采用分布式架构—很大的缺点。

服务器数量多,维护成本高。Redis命令 不适用 需要数据分区,无法解决热点数据读写的问题。

数据倾斜、重新分配、扩容、缩容,更加复杂。

本质:多线程任务 分摊到Redis 同步IO中,读写负载。

五、Redis有哪些高级功能

(1)慢查询

快速定位系统中的慢操作,监测发生时间、耗时、命令的详细信息。

(2)Pipeline

在这里插入图片描述

(3)watch命令:

确保事务中的key有没有被其他客户端修改过,才执行事务,否则不执行(类似于乐观锁)。

(4)Redis+Lua语言实现限流

在这里插入图片描述

(5)分布式锁

首先需要Redis有互斥的能力,可以使用SETNX命令,(即如果key不存在,才会设置它的值,否则什么也不做。两个客户端进程可以执行这个命令,达到互斥,就可以实现一个分布式锁。

锁的过期时间不好计算

在这里插入图片描述

解决方案:分布式锁加入看门狗

加锁时,先设置一个过期时间,然后开启**“守护线程”**,定时检测这个锁的失效时间,如果快要过期了,操作共享资源还未完成,则自动对锁进行续期,重新设置过期时间。

(6)高并发高可用

主从复制:

提供了复制功能,实现了相同数据的多个Redis副本。每个主节点可以对应多个从节点,复制的数据流只能由主节点复制到从节点。

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

(7)哨兵:Redis Sentinel

背景:主从复制模式下,主节点故障,需要人工将从节点晋升为主节点。

2,8版本开始提供哨兵架构解决此问题。

主从复制的问题

  • 需要手动晋升子节点,同时需要修改应用方的节点地址。
  • 主节点的写能力收到单机限制
  • 主节点的存储能力收到单机的限制

六、为什么需要使用Redis

1、高性能

Mysql(磁盘)毫秒级

Redis(内存)微秒级

更新策略:项目启动时全量同步:热点数据

2、高并发

Mysql 并发量:1000/s

Redis 并发量:100000/s

集群架构

在这里插入图片描述

七、Redis的事务

在这里插入图片描述

回滚机制上,Redis只能对基本语法错误进行判断。运行时错误无法回滚。

八、Redis的过期策略以及内存淘汰机制

1、内存淘汰机制

  • 定期删除(定时扫描策略)

    设置了过期时间的key放入独立字典,Redis默认会每秒进行十次过期扫描,不会遍历Key,而是采用简单的贪心策略。

    1. 从过期字典中随机20个key;
    2. 删除其中已经过期的;
    3. 如果过期比例超过1/4,则重复真个步骤;

    一定要注意过期时间,如果大批量key过期(雪崩),需要给过期时间设置一个时间范围,不能全部同一时间过期

  • 惰性删除

    客户端访问key的时候,redis对key的过期时间进行检查,如果过期就立即删除,不会返回任何东西。

总结:定期删除是集中处理,惰性删除是零散处理。

2、过期策略

  • 从库的过期策略

    没有过期扫描,被动执行。

    主库key到期时,在AOF文件里增加一条del指令,同步到所有从库。

3、缓存淘汰算法

当Redis内存超出物理内存限制时,内存数据开始和磁盘产生频繁的交换,此时性能会急剧下降。

通过maxmemory参数设置最大使用内存。

当内存超出时,Redis提供了集中策略来决定如何腾出新空间:

  • Noeviction:默认情况下不淘汰。超出maxmemory时只可读、删不准写。

  • volatile-lru:尝试设置了过期时间的key,最少使用的key先淘汰,没有设置过期时间的key不会被淘汰。

  • volatile-ttl:key的剩余寿命ttl的值,ttl越小越优先被淘汰。

  • volatile-random:淘汰过期集合中随机的key。

  • allkeys-lru:淘汰的key对象是全体的key集合。

  • allkeys-random:淘汰的key对象是全体的key集合中随机的key。

  • LRU算法:附加一个链表,按照一定顺序排列。空间满时,会踢掉链表尾部的元素。当链表中的某个元素被访问时,它会移动到链表的表头。链表元素排列顺序相当于元素最近被访问的时间顺序。

  • 近似LRU算法:Redis使用的此算法,使用LRU的原因是该链表需要消耗大量额外内存。

    在现有的数据结构上使用随机采样法来淘汰元素。给每个key增加一个额外的小字段(24bit),最后一次访问的时间戳。

    随机采样5(maxmemory-sample)个key,淘汰最旧的,重复该操作至内存低于maxmemory。

九、什么是缓存穿透?如何避免?

布隆过滤器的应用:

在这里插入图片描述

在这里插入图片描述

十、什么是缓存雪崩?如何避免?

原因:

1、Redis失效、宕机(故障)

  • 搭建Redis集群,主从架构
  • RDB持久化、IOF持久化
  • 加入缓存组件:EHCache,搭建多级缓存(容易高并发的数据存入)
  • 加入限流组件:hystrix,超过一定流量后,增加请求限制(保护数据处理层)

2、Redis大量key的ttl过期

  • ttl(过期时间)岔开,增加随机值,避免同一时间全部失效。

在这里插入图片描述

十一、Redis如何设计分布式锁

1、概念

  • 锁:同一时间只允许一个线程或者一个应用程序进入执行
  • 分布式锁:必须要求Redis有【互斥】能力,可以使用SETNX命令:即key不存在了才会设置它的值,否则什么也不做。

2、问题

  • 如何避免死锁

    场景:程序处理业务逻辑异常,或者进程挂了,无法释放锁

    避免方案:给锁设置租期(过期时间)

  • 锁的过期时间不好评估这么办?

    加入看门狗:开启守护线程,定期检测锁的失效时间,如果快要过期了,业务还没执行完,则续期。

十二、什么是bigkey?会有什么影响?

1、概念:

key对应的value所占内存空间较大

例如一个字符串类型的value最大存到512M,一个列表类型的value最大可以存储2的32次方-1个元素。

2、字符串类型:

体现在单个value值特别大,一般认为超过10kb就是bigkey,和具体OPS相关(不同系统不同并发)。

3、非字符串类型:

哈希、列表、集合、有序集合,体现在元素个数过多。

4、危害:

  • 内存空间不均匀

  • 超时堵塞:单线程操作bigkey比较耗时

  • 网络拥塞:每次获取bigkey产生的网络流量较大

    例如:一个bigkey为1MB,每秒访问为1000,则每秒产生1000MB的流量,普通千兆网(按照字节算是128MB/s)的服务器是灭顶之灾,而且服务器通常会采用单机多实例的方式来部署,可能会对其他实例造成影响。

5、解决方案:value拆分

十三、Redis如何解决key冲突

1、业务隔离

2、key的设计

业务模块+系统名称+关键(id),针对用户可以加入(userid)

3、分布式锁

场景:多个客户端并发写key

客户端拿到锁,才能进行操作,避免多个客户端竞争该key

4、时间戳

key拼接时间戳,根据时间戳保证多个客户端的业务执行顺序

十四、怎么提高换成命中率

1、提前加载

2、增加缓存的存储空间,增加缓存的数据

3、调整缓存的存储类型

例:对象通过Hash存储,而不用String。

根据业务做适当调整。

4、调整缓存的存储类型

  • 定时任务更新
  • MySQL通过检测binlog,将消息推送到Redis,更新缓存
  • 通过Mq,业务更新修改数据时,通过MQ发送消息,消费更新缓存

十五、Redis持久化方式有哪些方式?有什么区别?

1、持久化:

将数据写往磁盘,可以有效避免因进程退出造成的数据丢失,下次重启时利用之前持久化的文件恢复数据。

2、RDB(Redis DataBse):

当前数据生成快照(内存中的数据在某一时刻的状态记录)保存到硬盘的过程。

缺点:两次快照有时间间隔。

3、AOF:

已独立日志的方式记录每次写命令,重启时重新执行AOF文件中的命令恢复数据。

缺点:性能较差。

4、生产环境中一般采用混合两者的方式

如果执行bgrewriteaof命令,将内存中已有的数据以二进制格式存放在AOF文件中(模拟RDB),后续命令亦然采用AOF追加方式。

在这里插入图片描述

十六、为什么Redis需要把所有数据放到内存中?

1、内存访问与磁盘访问的差距:

在这里插入图片描述

  • 几乎是10倍以上,如果不是顺序读取而是随机读取效率会相差更大
  • 同时还有CPU上下文切换的开销

2、Redis通过异步,持久化将数据写入磁盘

3、随着技术的发展,硬件上来说内存也越来越便宜了

4、默认情况下,哪怕Redis内存不够了,也不会发生宕机,而是只可读不能写(Noeviction策略)

5、通过内存淘汰策略,确保整体服务正常运行

十七、如何保证缓存与数据库双写一致性?

1、新增数据类

新增数据时,数据会直接写入数据库,不用对缓存做任何操作;此时缓存没有新增数据,而数据库中是最新值。

2、更新缓存类

(1)先更新缓存,在更新DB(一般不考虑)

原因:缓存更新成功,更新数据库时出现异常,会导致数据源与缓存数据完全不一致,而且很难察觉,因为缓存中的数据一直都存在。

(2)先更新DB,在更新缓存(一般不考虑)

原因:数据库更新成功了,缓存更新失败了,同样会导致数据源与缓存数据完全不一致,也很难察觉。

3、删除缓存

(3)先删除缓存,后更新DB
问题:

两个请求:A(更新)和B(查询)

A -> 删除缓存中的数据 -> 更新数据库

B -> 查询缓存为空 -> 查询数据库 -> 补录到缓存

A -> 还未更新成功/事务还未提交,B -> 查询到的其实是数据库旧值

解决方案:
  • 先淘汰缓存
  • 再写数据库
  • 休眠1秒,再次淘汰缓存

这个休眠的时间需要评估项目的读数据业务逻辑的耗时,确保请求结束时,写请求可以删除读请求造成的缓存脏数据。

(4)先更新DB,后删除缓存

查询:先读缓存 -> 缓存没有就读数据库 -> 取出数据放入缓存 -> 同时返回响应。

更新:先更新数据库 -> 删除缓存

4、如何选择

一般线上更多偏向于删除缓存类操作(容易避免问题)

原因:

  • 删除缓存比在DB中要快,所以一般先更新DB,后删除缓存
  • 问题只会出现在查询比删除慢的情况,出现率相对最少
  • 同时延迟双删可以有效避免缓存不一致情况。

在这里插入图片描述

伪代码实现延迟双删:
redis.deykey(X)
db.update(X)
Thread.sleep(N)
redis.delKey(X)

十八、Redis集群方案

1、分布式解决方案 :Redis Cluster

3.0版本推出

场景:单机内存、并发、流量等瓶颈

方案:
(1)客户端分区:

优点:分区逻辑可控

缺点:需要处理数据路由、高可用、故障转移等问题

(2)代理方案:

优点:简化客户端分布式逻辑,升级维护便利

缺点:加重架构部署复杂度和性能损耗

2、虚拟槽分区(0~16383)

在这里插入图片描述

主节点数量基本不可能超过1000个,节点连接需要不断发送ping/pong命令,消耗网络带宽

3、集群功能限制

(1)key批量操作支持有限:mset、mget仅支持相同slot值的key。

(2)key事务操作支持有限:仅支持在同一节点上的事务操作。

(3)key作为数据分区的最小颗粒度,不允许大的键值对(hash、list)映射在不同节点。

(4)不支持多数据库空间。单机为0-15(16个),集群模式仅能使用db0。

(5)复制结构仅支持一层,节点只能复制到主节点,不支持嵌套树状复制结构。

4、搭建集群

方式:

(1)Redis协议手工搭建。

(2)5.0之前有ruby语言脚本搭建。

(3)5.0之后搭建功能合并至redis-cli。

节点数至少奇数点个,官方推荐三主三从。

十九、Redis集群方案什么情况下会导致整个集群不可用?

A、B、C三个节点集群,B节点失败(主故障,且没有替代方案)整个集群都是不可用的。

集群不可用判定:

保护措施:默认情况下当16384个槽点任何一个没有指派到节点时,整个集群不可用。

主节点下线->故障发现->自动完成转移期间,整个集群为不可用状态。

可用通过设置cluster-require-full-coverage配置为no:主节点故障时,不影响其他主节点的可用性。

二十、Redis集群会有写操作丢失吗?为什么?

Redis无法保证数据的强一致性

一般只能向主节点写入数据,再异步同步到子节点

此时如果响应给客户端后还未异步同步成功时,主节点宕机了,子节点升至主节点,此时就会出现写入操作丢失。

二十一、Redis常见性能问题和解决方案

1、持久化 性能问题

早期仅支持全量复制->部分复制(一台机器性能开销过大)

因此开始配置主从 :主节点不再做持久化而是交给从节点来做

2、数据比较重要,开启AOF。策略最好配置每秒同步。

3、主从复制 流畅,建议同一个局域网内操作,负责网络开销过大

4、尽量避免主库压力过大,增加从库

5、主从复制 尽量不要使用网状结构、线性结构

二十二、热点数据和冷数据

1、热数据

访问频次较高,考虑使用缓存Redis

地图信息

点赞数、收藏数、分享数(不断变化)同步Redis

数据更新之前至少读取2次才能放缓存

2、冷数据

访问频次少

不需要放缓存

二十三、什么情况下可能会导致Redis阻塞

1、客户端阻塞

命令执行时间过长: keys* Hgetall smembers 时间复杂度O(N)

2、BIGkey删除

需要释放大量占用内存 zset(100万的元素 删除大概需要2s)

3、清空库

flushdb flushall 涉及删除所有键值对

4、AOF日志同步写,记录AOF日志

大量写的操作

1一个同步写磁盘操作大概耗时1~2ms

5、从库 加载RDB文件

RDB文件过大

6、Redis尽量部署在独立的服务器中

二十四、线上Redis响应慢处理思路

  • 1、紧急处理方案,扩容

  • 2、生产环境查看Redis内存使用率,分析一定时间段内key数量变化

    分析是否是大量数据未设置过期时间,或者是因为新版本迭代引起

  • 3、清除bigkey,优化生成bigkey的代码块,调整未设置过期时间的代码块

  • 4、根据业务场景调整淘汰策略

相关文章:

Redis面试题 (2023最新版)

文章目录一、Redis为什么快?1、纯内存访问2、单线程,避免上下文切换3、渐进式ReHash、缓存时间戳(1)渐进式ReHash:(2)缓存时间戳:二、Redis合适的应用场景常用基本数据类型&#xff…...

基于springboot实现家乡特色食品景点推荐系统【源码+论文】分享

基于springboot实现家乡特色推荐系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...

Spring MVC 启动之 HandlerMapping

在上一篇文章中,我们介绍了 Spring MVC 的启动流程,接下来我们将发分多个篇章详细介绍流程中的重点步骤 今天我们从 HandlerMapping 开始分析,HandlerMapping 是框架中的一个非常重要的组件。它的作用是将URL请求映射到合适的处理程序&#x…...

基于YOLOv5的停车位检测系统(清新UI+深度学习+训练数据集)

摘要:基于YOLOv5的停车位检测系统用于露天停车场车位检测,应用深度学习技术检测停车位是否占用,以辅助停车场对车位进行智能化管理。在介绍算法原理的同时,给出Python的实现代码、训练数据集以及PyQt的UI界面。博文提供了完整的Py…...

【Linux系统编程】5.vim基本操作命令

目录 跳转到指定行 命令模式 末行模式 跳转行首 跳转行尾 自动格式化代码 大括号、中括号、小括号对应 光标移至行首 光标移至行尾 删除单个字符 删除一个单词 删除光标至行尾 删除光标至行首 替换单个字符 删除指定区域 删除指定1行 删除指定多行 复制一行 …...

主流机器学习平台调研与对比分析

梗概 本报告主要调研目前主流的机器学习平台,包括但不限于Amazon的Sage maker,Alibaba的PAI,Baidu的PaddlePaddle。对产品的定位、功能、实践、定价四个方面进行详细解析,并通过标杆对比分析提出一套机器学习平台评价体系&#x…...

作业帮基于明道云开展的硬件业务数字化建设

今天由我代表作业帮来介绍公司在低代码平台应用的一些经验和心得。我今天分享的内容包含两部分,一个是作业帮硬件的介绍,另一个是基于明道云的系统能力建设,也是我们自己总结的经验,希望能给大家带来一些启发。 一、关于作业帮 …...

位图及布隆过滤器的模拟实现与面试题

位图 模拟实现 namespace yyq {template<size_t N>class bitset{public:bitset(){_bits.resize(N / 8 1, 0);//_bits.resize((N >> 3) 1, 0);}void set(size_t x)//将某位做标记{size_t i x / 8; //第几个char对象size_t j x % 8; //这个char对象的第几个比特…...

在 Python 中将天数添加到日期

使用 datetime 模块中的 timedelta() 方法将天数添加到日期中&#xff0c;例如 result_1 date_1 timedelta(days3)。 timedelta 方法可以传递天数参数并将指定的天数添加到日期。 from datetime import datetime, date, timedelta# ✅ 将天数添加到日期 my_str 09-24-2023 …...

vue3知识点

一、vue3带来了什么&#xff1f; 1.性能的提升 打包大小减少41% 初次渲染快55%&#xff0c;更新渲染快133% 内存减少54% 2.源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-shaking 3.拥抱TypeScript Vue3可以更好的支持TypeScript 4.新的特性 4.1.…...

一行代码生成Tableau可视化图表

今天给大家介绍一个十分好用的Python模块&#xff0c;用来给数据集做一个初步的探索性数据分析(EDA)&#xff0c;有着类似Tableau的可视化界面&#xff0c;我们通过对于字段的拖拽就可以实现想要的可视化图表&#xff0c;使用起来十分的简单且容易上手&#xff0c;学习成本低&a…...

链表——删除元素或插入元素(头插法及尾插法)

目录 链表的结点由一个结构体构成 判断链表是否为空 键盘输入链表中的数据 输出链表中的数据 返回链表的元素个数 清空链表 返回指定位置的元素值 查找数据所在位置 删除链表的元素 插入元素 建立无头结点的单链表 建立有头结点的单链表&#xff08;头插法&#xff…...

oracle容器的使用

oracle容器的使用 1.下载oracle容器 1.1拉取容器 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g拉取国内镜像&#xff0c;该镜像大小为2.99G&#xff0c;已经集成了oracle环境&#xff0c;拉取完可以直接用&#xff0c;推荐使用这款oracle镜像 1.2查看…...

基于springboot会员制医疗预约服务管理信息系统演示【附项目源码】

基于springboot会员制医疗预约服务管理信息系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea M…...

GoogleAdsense国内加载慢怎么解决?

一淘模板 56admin.com 发现GoogleAdsense&#xff08;谷歌广告联盟&#xff09;国内加载慢拖网站速度怎么解决&#xff1f;GoogleAdsense是谷歌旗下的站长广告联盟系统&#xff0c;如果站长没有好的变现渠道&#xff0c;挂谷歌联盟是最好的选择&#xff08;日积月累&#xff09…...

【MySQL专题】03、性能优化之读写分离(MaxScale)

在我们了解了MySQL的主从复制的性能优化之后&#xff0c;紧接着《【MySQL专题】02、性能优化之主从复制》中&#xff0c;我们提及的读写分离&#xff0c;来进行读操作和写操作分散到不同的服务器结构中&#xff0c;同时希望对多个从服务器能提供负载均衡&#xff0c;读写分离和…...

Redis7高级之BigKey(二)

1.MoreKey案例 往redis里面插入大量测试数据key 生成100W条redis批量设置kv的语句保存在redisTest.txt for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done; # 生成100W条redis批量设置kv的语句(keykn,valuevn)写入到/tmp目录下的…...

flex弹性盒子

概念 弹性盒子是一种用于按行或者按列布局的一维布局方法&#xff0c;元素可以膨胀以填充额外的空间&#xff0c;缩小以适应更小的空间 以下属性是给父元素添加的 1.flex-direction --改变轴的方向 row 默认值 默认沿着x轴排版(横向从左到右排列&#xff08;左对齐&#xff…...

[Java Web]Cookie | 一文详细介绍会话跟踪技术中的Cookie

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web 目录Cookie1、工作原理2、如何使用2.1、发送Cookie2.2、获取Cookie3、Cookie的存活时间4、中文错误Coo…...

这可能是2023最全的Java面试八股文,共计1658页,Java技术手册的天花板

前两天有个小伙伴在后台留言&#xff0c;最近的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;庆幸的是最终顺利找到了工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题…...

字节流及存放本地文件上传和下载文件

前言 之前的文章有写过 vuespringboot使用文件流实现文件下载 实现如何通过 D:\file\文件名.文件格式的形式进行下载文件 但是它对于很多业务场景相对适用性不是很广泛。 以及 elementUI加springboot实现上传excel文件给后端并读取excel 也只能是通过elementui的元素类型进行…...

【翻译】下一步:Go 泛型

原文地址&#xff1a; The Next Step for Generics - The Go Blog https://blog.golang.org/generics-next-step 介绍 自从我们上次写下关于在Go中加入泛型的可能性的文章以来&#xff0c;已经快一年了。现在是该更新的时候了。 设计的更新 我们一直在继续完善泛型设计草案。…...

如何简单实现ELT?

在商业中&#xff0c;数据通常和业务、企业前景以及财务状况相关&#xff0c;有效的数据管理可以帮助决策者快速有效地从大量数据中分析出有价值的信息。数据集成(Data Integration)是整个数据管理流程中非常重要的一环&#xff0c;它是指将来自多个数据源的数据组合在一起&…...

细思极恐,第三方跟踪器正在获取你的数据,如何防范?

细思极恐&#xff0c;第三方跟踪器正在获取你的数据&#xff0c;如何防范&#xff1f; 当下&#xff0c;许多网站都存在一些Web表单&#xff0c;比如登录、注册、评论等操作需要表单。我们都知道&#xff0c;我们在冲浪时在网站上键入的数据会被第三方跟踪器收集。但是&#x…...

Java基础之==,equal的区别(温故而知新)-----点点滴滴的积累

1. 为运算符&#xff0c;equal 为String数据类型的比较方法&#xff1b;相同内容的对象地址不一定相同&#xff0c;但相相同地址的对象内容一定相同&#xff1b; 比较的是值是否相等&#xff0c;equal比较的是是否是同一个对象。 2.基本概念不同 1&#xff09;对于&#xff0c…...

SpringBoot项目使用切面编程实现数据权限管理

springBoot项目使用切面编程实现数据权限管理什么是数据权限管理如何实现数据权限管理什么是数据权限管理 不同用户在某页面看到数据不一致&#xff0c;实现每个用户之间数据隔离的效果。 如以下场景&#xff1a; ● 页面期望展示当前登录人所在部门的数据。 ● 页面期望展示当…...

亚马逊测评是做什么的,风险有哪些?

自养号测评顾名思义就是自己养国外的买家账号给自己店铺提升销量和评论&#xff0c;做过多年的跨境卖家都知道测评可以快速提高产品的排名、权重和销量&#xff0c;&#xff08;国内某宝一样的逻辑&#xff09;但随着测评需求日益增大&#xff0c;卖家在寻求真人测评时也很容易…...

安科瑞导轨式智能通讯管理机

安科瑞 李亚娜 一、概述 AWT200 数据通讯网关应用于各种终端设备的数据采集与数据分析。实现设备的监测、控制、计算&#xff0c;为系统与设备之间建立通讯纽带&#xff0c;实现双向的数据通讯。实时监测并及时发现异常数据&#xff0c;同时自身根据用户规则进行逻辑判断&…...

vs2010下 转换到 COFF 期间失败: 文件无效或损坏

因为同一个电脑上安装多个VS&#xff0c;有多个cvtres.exe。按照下面的操作如果还是不行就在C盘搜索cvtres.exe&#xff0c;然后挨个重命名&#xff0c;看看是调用的哪个&#xff0c;然后修改就可以了。 用VS2010编译C项目时出现这样的错误&#xff1a; LNK1123: 转换到 COFF …...

托福高频真词List19 // 附托福TPO阅读真题

目录 3.28单词 3.29真题​​​​​​​ 3.28单词 legitimately/properlyadv.正当地likewise/similarlyadv.同样地reveal/showv.揭示substantiate/confirmv.证实suppress/stop by forcev.镇压trend/tendencyn.趋势empirical/based on observationa.凭借经验的illuminate/li…...

伊春网站推广/百度app免费下载安装

一直向太太推崇Thinkpad系列电脑的种种独特之处&#xff0c;今天在吹嘘屏幕顶灯时&#xff0c;太太一脸不屑&#xff0c;说&#xff1a;把键盘改成夜光不是更好吗&#xff0c;既能看清键盘&#xff0c;还能省电&#xff0c;一举两得。听后&#xff0c;一时语塞&#xff0c;不知…...

网站关键字个数/自动点击器怎么用

NIO虽然称为Non-Blocking IO&#xff08;非阻塞IO&#xff09;&#xff0c;但它支持阻塞IO、非阻塞IO和IO多路复用模式这几种方式的使用。 同步IO模式 NIO服务器端 Slf4j public class NIOBlockingServer {public static void main(String[] args) throws IOException {Ser…...

河北网络公司网站建设/电商网站建设定制

文章目录1.常用注解说明2.配置文件3.小技巧4.配置注解1.常用注解说明 我们可以测验下args参数的作用&#xff1a; 2.配置文件 srpingboot用在企业级开发经常会有多种环境&#xff0c;所以配置文件可以针对不同环境做拆分。拆分遵循如下原则&#xff1a;公共配置放入主配置文…...

定西市住房和城乡建设局网站/2023新闻摘抄大全

一、np.random.normal()函数用法 numpy.random.normal(loc0,scale1e-2,sizeshape) 其参数意义为&#xff1a; 参数loc(float)&#xff1a;正态分布的均值&#xff0c;对应着这个分布的中心。loc0说明这一个以Y轴为对称轴的正态分布&#xff0c; 参数scale(float)&#xff1a;…...

武汉网站提升排名/百度竞价推广开户内容

Java的占位符有两种&#xff1a;% 和 {} String 类对象 只能使用 % 有效。 MessageFormat 类对象 只能使用 {} 有效。 package demo;import java.text.MessageFormat;public class doTest {public static void main(String[] args) throws Exception {System.out.println(Strin…...

衡水网页网站建设/网站推广网站

Linux中有一个基于Netfilter的连接跟踪机制&#xff0c;即ip_conntrack&#xff0c;每一个conntrack表示的就是一个流&#xff0c;该流里面保存了大量的信息字段&#xff0c;这些字段本地有效&#xff0c;指导着数据包的转发策略&#xff0c;但是我觉得这些字段信息还不够详细&…...