【面试】Redis 常见面试题
一、介绍一下什么是 Redis,有什么特点?
Redis 是一个高性能的 key-value 内存数据库。
不同于传统的 MySQL 这样的关系型数据库,Redis 主要使用内存存储数据(当然也支持持久化存储到硬盘上),并非是使用 “表” 这样的结构来组织数据,而是使用键值对的方式。
Redis 没有关系型数据库的复杂查询以及约束等功能,换来的是简单易用和更高的性能。
特点:
- 使用内存存储(高性能)。
- ⽀持多种数据结构。
- 支持持久化。
- 单线程处理请求。
- ⽀持主从复制。
- ⽀持哨兵模式。
- ⽀持集群模式。
- 支持事务。
- ⽀持多语言客户端。
- ... ...
参考:About - Redis
二、Redis 支持哪些数据类型
五种最核心的类型:
- String
- List
- Hashmap
- Set
- ZSet
在后续版本中也逐渐新增了一些新的数据类型:
- Bitmap,通过二进制位表示某个数字是否存在。
- Bitfield,把字符串当做位图,并进行位操作。
- Hyperloglog,基于位图的结构实现 “计数” 效果(统计某个数字出现几次,比 hashmap 节省空间)。
- Geospatial。地理信息,存储经纬度。并且可以进行一些空间计算(比如找出某个点附近 1km 内都有哪些点)。
- Stream,消息队列。
这几个类型都属于特定场景中才会使用的类型,不像前面五个类型通用性那么强。
参考:Understand Redis data types | Docs
三、Redis 数据类型底层的数据结构 / 编码方式是什么
- embstr:是针对短字符串的优化实现。小于等于 39 字节的字符串使用 embstr,大于则使用 raw。
- ziplist:压缩列表,本质上是个字节数组,可以节省内存空间。当有序集合、哈希表、列表元素少,并且元素都是短字符串的时候,会使用这个。
- linklist:链表,需要额外内存开销,容易引入内存碎片。
- skiplist:跳表,能够 O(logN) 的复杂度进行查找元素的复杂链表。
- quicklist:是个链表,每个元素是⼀个 ziplist。
- listpack:从 Redis 7 开始,引入了新的数据结构 listpack,用来代替 ziplist。
使用哪种编码是 redis 内部自动决定的,可以使用 object encoding key 来查看编码。
四、ZSet 为什么使用跳表,而不是使用红黑树来实现
跳表的插入 / 查询 / 删除时间复杂度都是 O(logN),和红黑树是一样的。但是跳表实现起来更简单,而且不需要重新平衡这样的操作。
五、Redis 的常见应用场景有哪些
- 缓存:一些经常被访问到的热点数据,可以使用 Redis 进行缓存,降低查询数据库的次数。
- 计数器:统计点击次数 / 访问次数 / 收藏次数等常见需求。
- 排行榜:可以基于 Redis 的 ZSet 轻松实现。
- 分布式会话:使用 Redis 存储会话信息,可以使用户访问到系统的不同模块时都使用同一个公共的会话。
- 分布式锁:对于分布式系统的并发访问控制,可以基于 Redis 来实现分布式锁,避免并发的竞争问题(类似于线程安全问题)。
- 消息队列:Redis 自身支持 Stream 数据类型,可以作为简单的消息队列使用。
- ... ...
六、如何测试 Redis 服务器的连通性
七、如何设置 key 的过期时间
八、Redis 为什么是单线程模型
Redis 内部的逻辑比较简单,一般的性能瓶颈都是出现在内存或者 IO 上,很少是 CPU。因此使用多线程并没有太大的收益,反而可能会引入线程安全问题。
从 Redis6.0 开始,引入多线程,此时只是使用多个线程去处理网络请求 + 协议解析,真正执行 Redis 命令仍然是单线程完成的,这样做可以进一步提高 IO 的处理效率。
九、Redis 里的 IO 多路复用是怎么回事
Redis 主要是基于了 Linux 提供的 epoll 机制来完成 IO 多路复用。
简单的说,所谓的 “IO多路复用” 就是用一个线程来管理多个 socket(文件描述符),并按需激活线程。
虽然一个 Redis 服务器要处理很多个客户端的请求,但是这些客户端的请求并非是 “同一时刻” 到达的。在一个单位时间内,可能只有两三个客户端的请求到来了,因此如果使用传统的每个线程处理一个连接的方式实现,大部分线程其实都是挂起的(不活跃的)。因此与其搞了一堆线程,但是线程在摸鱼,还不如就用一个线程来处理。上述这样的需求,被操作系统内核封装好了,就是 IO 多路复用。
Linux 中,IO 多路复用有三种实现:
- select
- poll
- epoll
其中,epoll 是最新的版本(2005 年左右引入的),也是最高效的版本。epoll 在内核中维护了一个红黑树,来管理所有的 socket,并且每个节点都关联了一个事件回调。当系统内核感知到网卡收到数据了,进一步判定这个数据是给哪个 socket 的,随之调用对应的回调,进一步唤醒用户线程,来处理这个收到的数据。此时这个用户线程是 “忙碌” 的,要不停的处理来自各个客户端的请求数据。
十、Redis 的持久化机制有哪些
RDB 和 AOF。
参考:【Redis 进阶】持久化(RDB & AOF)_redis 加载rdb-CSDN博客
十一、RDB 的持久化触发条件是怎样的
手动触发:使用 save 或者 bgsave 即可触发持久化。
自动触发:
- 在配置文件中通过 save m n 即可设定 m 秒内发生 n 次修改,就触发持久化。
- 从节点进行全量复制操作,触发持久化。
- 执行 shutdown 命令,关闭 redis server,触发持久化。
十二、AOF 的文件同步策略有哪些
十三、AOF 的重写机制是怎样的
参考:【Redis 进阶】持久化(RDB & AOF)_redis 加载rdb-CSDN博客
十四、Redis 的 key 的过期删除策略是怎样的
惰性过期
只有当访问一个 key 时,才会判断该 key 是否已过期,过期则清除。该策略可以最大化地节省 CPU 资源,却对内存非常不友好。极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。
定期过期
每隔一定的时间,会扫描一定数量的数据库的 expires 字典中⼀定数量的 key,并清除其中已过期的 key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得 CPU 和内存资源达到最优的平衡效果。expires 字典会保存所有设置了过期时间的 key 的过期时间数据,其中 key 是指向键空间中的某个键的指针,value 是该键的毫秒精度的 UNIX 时间戳表示的过期时间。键空间是指该 Redis 集群中保存的所有键。
Redis 中同时使用了惰性过期和定期过期两种过期策略。
- 每隔 100ms 就随机抽取⼀定数量的 key 来检查和删除的。
- 在获取某个 key 的时候,redis 会检查⼀下,这个 key 如果设置了过期时间并且已经过期了,此时就会删除。
十五、如果大量的 key 在同一时间点过期会产生什么问题?如何处理?
如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,Redis 可能会出现短暂的卡顿现象。
为何会出现卡顿呢?
Redis 针对过期 key 的删除,采取定期采样删除 + 惰性删除两种方式结合。
对于定期采样删除来说,Redis 会注册一个定时器,每隔一定时间触发一次采样删除。在删除的时候会先根据事先统计好的过期 key 的个数来决定后续策略。如果过期 key 的数目超过总 key 数目的 25% 以上,就会使 Redis 持续删除过期 key 直到最大时间删除时间(默认是 25ms)。之所以限制这个最大时间,就是为了防止 Redis 被卡住太久。但是即使如此,有些对性能要求较高的场景仍然会因为阻塞 25ms 导致性能下降严重。
解决方案:可以在过期时间上加一个随机值,使得过期时间分散一些。
很多时候过期时间并不一定非得卡的那么精准。比如设定 2s 之后过期,不⼀定非要正好的 2000ms,2001、2002、1999、1998 甚至 2010 这些时间都是问题不大的。因此让过期时间通过随机值分散,就可以避免同⼀时刻过期的 key 太多,从而降低触发 25% 这个阈值的可能性。
十六、Redis 的淘汰策略是怎样的
当 Redis 内存不足时,如果继续尝试添加新的 key,就会触发淘汰策略,把之前的旧 key 给自动删除掉。
Redis 提供的淘汰策略有以下几种:
- volatile-lru 当内存不足以容纳新写入数据时,从设置了过期时间的 key 中使用 LRU(最近最
- 少使用)算法进行淘汰。
- allkeys-lru 当内存不足以容纳新写入数据时,从所有 key 中使用 LRU(最近最少使用)算法进行淘汰。
- volatile-lfu 4.0 版本新增,当内存不足以容纳新写入数据时,在过期的 key 中,使用 LFU 算法进行删除 key。
- allkeys-lfu 4.0 版本新增,当内存不足以容纳新写入数据时,从所有 key 中使用 LFU 算法进行淘汰。
- volatile-random 当内存不足以容纳新写入数据时,从设置了过期时间的 key 中,随机淘汰数据。
- allkeys-random 当内存不足以容纳新写入数据时,从所有 key 中随机淘汰数据。
- volatile-ttl 在设置了过期时间的 key 中,根据过期时间进行淘汰,越早过期的优先被淘汰。
- noeviction 默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
关于 LRU 和 LFU
- LRU:Least Recently Used 最近最久使用算法,哪个 key 上次访问时间最长,就干掉。
- LFU:Least Frequently Used 最近最常使用算法,哪个 key 在最近⼀段时间里使用次数最少,就干掉。
在上述策略中,默认策略一般来说都是比较好的选择。
- 部署 Redis 的机器正常来说,不应该消耗到内存耗尽才做处理,应该有完善的监控报警体系,当内存接近上限的时候提前通知程序员,尽早进行扩容。
- 如果确实出现内存耗尽了,相比于 Redis 偷偷的删除一部分 key,带伤运行(当然,volatile 前缀系列的策略不算带伤),不如尽早显式的把问题暴露出来,及时处理。
- 除非是 Redis 中的数据完全不关键,否则不应该使用 allkeys 系列的策略。
十七、Redis 如果内存用完了,会出现什么情况
会触发 Redis 的淘汰策略,把⼀些 key ⾃动删除掉。
参考十六。
十八、Redis 为什么把数据放到内存中
效率。
访问内存的速度比访问硬盘的速度快 3-4 个数量级。
如下表可以看到:
进行一次内存的随机访问操作是 100ns,进行一次硬盘的随机访问操作是 10 000 000 ns,这个差距还是非常明显的。因此使用内存存储数据让 Redis 相比于 MySQL 等数据库,具有了非常显著的优势。当然,使用内存存储的劣势也是比较明显的:
- 内存的存储空间比硬盘小很多,不过随着硬件的发展,大内存的服务器越来越便宜了,市面上甚至可以看到 1TB 级别的内存的机器了。
- 内存的数据掉电后会丢失,因此 Redis 引入持久化的方式,把数据在硬盘上也备份一遍(当然,增删改查仍然是以内存为主),速度不影响的前提下,保证重启后数据不丢失。
十九、Redis 的主从同步 / 主从复制是怎么回事
解决的问题:
- 提高 Redis 的可用性,避免 Redis 机器 / 进程挂了之后无法提供服务。
- 降低 Redis 服务器的压力,从节点读,主节点写,让单个节点承担的压力更小。
需要有多个服务器,部署多个 Redis 服务器程序。其中⼀个作为主节点,其他作为从节点。在从节点 Redis 启动的时候,通过配置文件或者命令参数 --slaveof 指定当前节点的主节点是哪个。
当从节点启动之后,就会清空自身数据,并把主节点的所有数据都复制过来,并且主节点的数据后续如果进行修改,从节点也能自动随之更新。主节点可以写数据也可以读数据,从节点只能读数据。这样的话,主节点的数据就多了几个 “备份”,当主节点挂了仍然可以通过从节点来读取数据。
另一方面访问 Redis 大多还是读操作,通过从节点就可以分担主节点的读操作的压力。
比如一个 Redis 每单位时间要处理 100 次写请求和 10w 次读请求。
如果使用主从的方式部署,比如一个主节点,三个从节点,此时主节点负责处理 100 次写请求,主节点和从节点再负责处理 2.5w 次读请求,这样主节点的压力就降低到了原来的 1/4 了。
二十、Redis 的 pipeline(流水线 / 管道)是什么
在 Redis 客户端执行 N 个命令,大概的过程如下:
发送命令−> 命令排队−> 命令执⾏−> 返回结果
发送命令−> 命令排队−> 命令执⾏−> 返回结果
发送命令−> 命令排队−> 命令执⾏−> 返回结果
发送命令−> 命令排队−> 命令执⾏−> 返回结果
......
这个过程称为 Round trip time(RTT,往返时间)。
如果我们需要执行多个操作,就需要多个这样的 RTT,其中大量的时间都消耗在发送命令 / 返回结果的网络时间上了。
使用 pipeline 就可以把多个 redis 命令合并到一个请求中,节省网络开销。
发送命令−> 命令排队−> 命令排队−> 命令排队−> 命令执⾏ -> 命令执⾏−> 命令执⾏−> 返回结果
注意 :pipeline 中的这 N 个命令的执行并非是原子的,他们只是同乘⼀趟地铁的陌路人,彼此之间没什么关联关系。
通过 Redis 客户端使用管道,可以基于 Linux 的管道实现。比如把要执行的 N 个命令写入 cmd.txt 文本文件中,每个命令一行。
然后执行:
cat cmd.txt | redis-cli --pipe
通过 pipe 参数即可让 redis-cli 读取执行 cmd.txt 中的内容。如果通过管道执行的命令太多,可能会使服务器被阻塞住。
二十一、介绍一下 Redis 哨兵
参考:【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)_redis sentinel原理-CSDN博客
二十一、Redis 哨兵如果发现主节点宕机了,接下来会做哪些事情
参考:【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)_redis sentinel原理-CSDN博客
二十二、Redis 的集群是干什么的
参考:【Redis 进阶】集群(重点理解流程和原理)-CSDN博客
二十三、Redis 的哈希槽是怎么回事
参考:【Redis 进阶】集群(重点理解流程和原理)-CSDN博客
二十四、Redis 集群的最大节点个数是多少
Redis 作者建议不要超过 1000 个。
参考:why redis-cluster use 16384 slots? · 议题 #2576 · redis/redis (github.com)
二十五、Redis 集群会有些操作丢失吗
Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。比如在写成功一个 key 之后,正好主节点宕机,此时由于这个数据还没有来得及同步到从节点上,也没来得及 AOF 写入日志,就丢失了。
二十六、Redis 集群如何选择数据库
Redis 集群不支持选择数据库,只能使用默认的数据库 0。
二十七、介绍下一致性哈希算法
参考:【Redis 进阶】集群(重点理解流程和原理)-CSDN博客
二十八、如何理解 Redis 的事务和 MySQL 的事务有什么区别
参考:【Redis 进阶】事务-CSDN博客
二十九、Redis 和事务相关的命令有哪些
MULTI、EXEC、DISCARD、WATCH
三十、为什么在生产环境上不应该使用 keys * 命令
keys * 类似于 sql 的 select *,如果存储的数据量特别大,那么这个操作就会耗时非常长,甚至阻塞住 Redis,使 Redis 难以处理其他请求,造成生产环境故障。
三十一、如何使用 Redis 作为消息队列
有三种典型的做法:
- 直接使用 List。Redis 中提供了 BLPOP 和 BRPOP,可以阻塞式的获取元素,就可以让消费者通过 List 来进行阻塞式取元素,生产者通过 RPUSH 或者 LPUSH 即可完成生产操作。
- 使用 PUB / SUB 命令。
- 使用 Redis 5 提供的 Stream 类型。
整体来说,Stream 这个方案提供的功能相对更加完整,但是即使如此,更多的时候还是使用专业的消息队列更合适一些。如果确实某个场景对于 MQ 的功能需求不高,且不想引入额外的 mq 组件依赖,Redis 也可以使用。
三十二、如何使用 Redis 实现分布式锁
参考:【Redis 进阶】Redis 典型应用 —— 分布式锁-CSDN博客
三十三、什么是缓存穿透、缓存雪崩、缓存击穿
参考:【Redis 进阶】Redis 典型应用 —— 缓存(cache)-CSDN博客
三十四、什么是热 key 问题,如何解决
某些 key 的访问频率非常高,称为 “热 key”。有些热 key 可能达到非常热的情况,以一己之力就能把 redis 打挂。
虽然 Redis 通过集群部署的方式能够分散请求的压力。但是由于热 key 是同一个 key,对应访问的机器也是同一组机器,这就会导致其他组的机器虽然硬件资源富裕,但是也无法帮上忙。
如何解决:
- 进一步扩大 Redis 集群的规模,尤其是针对热 key 所属分片,部署更多的 slave 节点分担读压力。
- 应用服务器对热 key 识别出来,并单独的进行二次哈希,也就相当于是把⼀个 key 分散到多个 Redis 分片上存储。
- 应用服务器对热 key 识别出来,把热 key 使用单独的 Redis 集群部署,并赋予更多的机器。
- 使用应用程序本地缓存,降低 Redis 的压力。
三十五、如何实现 Redis 高可用
主从 + 哨兵 + 集群。
三十六、Redis 和 MySQL 如何保证双写一致性
什么是 “双写⼀致性”?
当用户修改数据的时候,需要修改数据库,同时也要更新缓存中的数据。
否则再直接读缓存的数据就是 “脏数据” 了。但是如果直接写数据库并且写 Redis,此时万一有一方写入失败,就容易出现数据不一致的情况。
如何解决?
方案一:延时双删。
- 先删除缓存数据。
- 再更新数据库。
- 再次删除缓存数据。
“双删” 的目的是多一重保证。如果第一次删除失败,第二次删除仍然能够兜底。
只要把 Redis 的数据删了,后续访问该数据的时候就会自动的从数据库读取,并且把结果也写写入 Redis 了,就可以保证 Redis 和数据库一致。
如果直接修改 Redis,由于修改 Redis 和修改 MySQL 并非是原子的,多个应用服务器并发执行的时候,可能就会出现类似于 “线程安全” 的问题了。
服务器 1 和服务器 2 同时都写 Redis 和 MySQL,其中服务器 1 写 Redis 的结果被服务器 2 写 Redis 的结果覆盖了,服务器 2 写 MySQL 的结果被服务器 1 写 MySQL 的结果覆盖了,此时就不一致了。因此,“数据一致” 问题就转换成了能成功删除 Redis 数据的问题。
是否可能第二次删除也失败了呢?
答案是肯定的,但是概率是大大降低了。
方案二:删除缓存重试。
先删除缓存数据,如果删除失败,则把失败的 key 放到一个 mq 中,稍后进行重试。只要删除不成功,这个重试就会反复一直进行。
上述操作确实能更严格的保证删除效果,但是代码实现起来比较复杂。幸运的是,有大佬把这个过程封装好了,我们可以直接使用。例如,阿里巴巴提供了开源工具 canal,可以比较方便的获取到 mysql 的 binlog,并基于此实现上述逻辑。
三十七、生成 RDB 期间,Redis 是否可以处理写请求
- save。这个操作会阻塞 Redis 的主线程,此时无法处理外界的写请求。
- bgsave。这个操作会让 Redis 生成子进程,子进程负责生成 RDB,父进程负责处理写请求。
此时新写的数据不一定会被写入 RDB 文件中,需要触发下一轮 RDB 的时候才能真正确保持久化了。
三十八、Redis 的常用管理命令有哪些
# dbsize 返回当前数据库 key 的数量
# info 返回当前 redis 服务器状态和⼀些统计信息
# monitor 实时监听并返回redis服务器接收到的所有请求信息
# shutdown 把数据同步保存到磁盘上, 并关闭redis服务
# config get parameter 获取⼀个 redis 配置参数信息(个别参数可能⽆法获取)
# config set parameter value 设置⼀个 redis 配置参数信息(个别参数可能⽆法获取)
# debug object key 获取⼀个 key 的调试信息
# debug segfault 制造⼀次服务器当机
# flushdb 删除当前数据库中所有 key, 此⽅法不会失败, ⼩⼼慎⽤
# flushall 删除全部数据库中所有 key, 此⽅法不会失败, ⼩⼼慎⽤
三十九、Redis 用到的网络通讯协议是怎样的
Redis Serialization Protocol(RSP),这个是 Redis 专门实现的应用层协议,用于 Redis 客户端和服务器之间的通信。
RSP 是一种纯文本协议,协议规则参考:Redis serialization protocol specification | Docs
四十、Redis 如何遍历 key
使用 keys * 虽然能一次性获取到所有 key,但是这个操作开销可能非常大,会把 Redis 卡死。更靠谱的方法是使用 scan 命令。
SCAN cursor [MATCH pattern] [COUNT count]
每次 scan 时间复杂度 O(1)。
每次 scan 都能返回一批 keys,同时告知我们下次应该从哪里开始进行 scan。需要使用多次 scan 才能完成整个遍历。
Cursor 表示遍历 key 的光标。从 0 开始,每次执行 scan 都会返回下次开始的光标,当返回结果为 0,则说明遍历结束。
通过 count 可以限制每次获取到的 key 的个数。
Redis 是按照 哈希 的方式来管理 keys 的,因此在遍历的时候得到的 keys 序列并非是 “有序” 的。
每次调用 scan 会返回下一次 scan 的游标和本次的 keys。下次再 scan 的时候根据这个游标继续遍历即可。同理,还提供了 hscan(哈希)、sscan(set)、zscan(zset),用于遍历,用法类似。渐进式遍历解决了阻塞问题,但是如果遍历过程中,键存在变化,则导致重复遍历或者遗漏。
四十一、Redis 如何实现 “查找附近的人”
可以使用 Geospatial 类型,存储每个人的地理位置。
geoadd key [经度] [纬度] member [经度] [纬度] member .......
使用
georadius key [经度] [纬度] [距离]
查询以给定位置为圆心,距离为半径,里面有哪些 member 符合条件。
四十二、什么是 Redis 的 "bigkey" 问题,如何解决
bigkey 指的是某个 key 对应的 value 占据较多的存储空间。比如 value 是字符串类型,是一个非常长的字符串,或者 value 是 hash 或者 set 类型,里面的元素特别多。这样的 bigkey 会导致读写的时候性能下降,如果是集群分片部署,也会引起不同分片的数据倾斜。
解决方案:核心思路就是拆分,把一个大的 key 拆成多个小的 key,每个 key 对应 value 的一部分数据。可以使用 redis-cli --bigkey 查找 bigkey。删除 bigkey 不要直接使用 del,也可能阻塞 Redis,使用 unlink 命令在后台删除更合适。
相关文章:
【面试】Redis 常见面试题
一、介绍一下什么是 Redis,有什么特点? Redis 是一个高性能的 key-value 内存数据库。 不同于传统的 MySQL 这样的关系型数据库,Redis 主要使用内存存储数据(当然也支持持久化存储到硬盘上),并非是使用 “表” 这样…...
扩散模型中,Flow Matching的训练方式相比于 DDPM 训练方法有何优势?
在扩散模型中,Flow Matching(FM)相比DDPM(Denoising Diffusion Probabilistic Models)的训练方法具有以下核心优势: 1. 更简单的训练目标 DDPM:通过逐步预测噪声来间接优化数据分布的变分下界(ELBO),需要设计多步的噪声调度策略,训练目标依赖马尔可夫链的分解。Flow…...
Unity FBXExport导出的FBX无法在Blender打开
将FBX转换为obj: Convert 3D models online - free and secure...
【无标题】基于Unity写一个DelayInvoke方法
没想到来得这么块,程序员可能比司机先失业了。。。。。。。。 //测试过一定要这么调用??奇怪的是,不能(mono 直接引用)??///但AI还是给出了能用的代码 MonoBehaviourExtensions.DelayInvoke(this,()=> { },3); /* 方案一,使用示例(): public class ExampleUsag…...
JavaScript 语言基础之标签语句
标签语句的语法 label: statement label 表示标签名,可以是任何合法的标识符,但不能是 JavaScript 中的保留字。statement 表示被标记的语句块,可以是任何合法的 JavaScript 语句。 用法 标签语句的主要用途是在代码中进行跳转࿰…...
【网络编程】网络编程基础:TCP/UDP 协议
一、什么是网络? 网络是信息传输,接收和共享的虚拟世界,通过把网络上的信息汇聚在一起,将这些资源进行共享。 初衷:知识共享。这里不得不提到Internet 的历史-它其实是“冷战”的产物: 1957年…...
idea 部署 AJ-Report 启动的注意事项
AJ-Report 入门参考: AJ-Report 初学(入门教程) gitee 下载:https://gitee.com/anji-plus/report/releases 根据上面提供的 gitee 下载链接,点击直接下载 最上面的就是最新版本的,旧版本往下拉就可以找到,有三个下载…...
C# 生成二维码隐藏ASCII码
在 C# 中生成二维码时,如果需要隐藏或过滤掉 ASCII 码中的控制字符或不可见字符,可以在生成二维码之前对输入文本进行处理。以下是完整的实现步骤和代码示例: 1. 过滤 ASCII 码中的控制字符 ASCII 码中,0 到 31 以及 127 是控制字…...
python有没有不同精度的整型类型?
在 Python 中,不像 C、Java 等语言有明确的不同精度整型类型(如 int8、int16、int32、int64 等),Python 提供了统一的整数类型 int,它可以处理任意大小的整数,没有固定的精度限制。不过,Python …...
Python多线程编程理解面试题解析
一、多线程介绍 Python 的多线程是一种实现并发编程的方式,允许程序同时执行多个任务。然而,由于 Python 的全局解释器锁(GIL)的存在,多线程在某些场景下可能无法充分利用多核 CPU 的性能。以下是对 Python 多线程的理…...
网络协议相关知识有哪些?
前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...
【并发压测】高并发下Linux流量监控
在高并发环境下,Linux流量监控至关重要,可以帮助您确保网络性能和稳定性。以下是一些常用的Linux流量监控工具和方法: 1. **iftop**:iftop 是一款实时的网络流量监控工具,可以显示当前服务器上每个网络接口的流量使用情…...
Spring Boot项目中解决跨域问题(四种方式)
目录 一,跨域产生的原因二,什么情况下算跨域三,实际演示四,解决跨域的方法 1,CrossOrigin注解2,添加全局过滤器3,实现WebMvcConfigurer4,Nginx解决跨域5,注意 开发项目…...
革新之力:数字科技——重塑未来的超越想象之旅
在21世纪的科技浪潮中,数字科技如同一股不可阻挡的洪流,正以前所未有的速度和广度改变着我们的生活、工作乃至整个社会的结构。它不仅是技术的简单迭代,更是对人类社会认知边界的拓宽,对经济模式、社会治理、文化形态等多方面的深…...
matlab和java混合编程经验分享
最常用的就是可以查到再控制栏deploytool选择library complier打包,但是有问题就是比如果用了外部的求解器比如yalmip或者cplex的话用这个方法会找不到外部的求解器,网上找了很多,基本都大同小异。 后面分享一个亲测有效的打包方法࿰…...
rk3588/3576板端编译程序无法运行视频推理
图片推理可以,但是视频不行,运行视频推理报错:segment fault. 我遇到的问题原因是ffmpeg安装有问题,可以先在板端运行:ffmpeg -version ffmpeg version 4.2.4-1ubuntu1.0firefly6 Copyright (c) 2000-2020 the FFmpe…...
MATLAB在数据分析和绘图中的应用:从基础到实践
引言 股票数据分析是金融领域中的重要研究方向,通过对历史价格、成交量等数据的分析,可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具,提供了丰富的数据处理和可视化功能,非常适合用于股票数据的…...
【CS285】高斯策略对数概率公式的学习笔记
公式介绍 在【CS285】中提到了高斯策略对数概率公式的公式如下: log π θ ( a t ∣ s t ) − 1 2 ∥ f ( s t ) − a t ∥ Σ 2 const \log \pi_{\theta}(\mathbf{a}_t | \mathbf{s}_t) -\frac{1}{2} \left\| f(\mathbf{s}_t) - \mathbf{a}_t \right\|_{\S…...
windows环境下用docker搭建php开发环境dnmp
安装WSL WSL即Linux子系统,比虚拟机占用资源少,安装的前提是系统必须是win10以上。 WSL的安装比较简单,网上有很多教程,例如:WSL简介与安装流程(Windows 下的 Linux 子系统)_wsl安装-CSDN博客&…...
区块链中的递归长度前缀(RLP)序列化详解
文章目录 1. 什么是RLP序列化?2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化? 递归长度前缀(RLP&…...
PHP建立MySQL持久化连接(长连接)及mysql与mysqli扩展的区别
如果在 PHP 5.3 的版本以前想要创建MySQL的持久化连接(长连接),需要显式调用 pconnect 创建: $con mysql_pconnect($server[host], $server[username], $server[password]); if (!($con false)) { if (mysql_select_db($server[database], $con) fals…...
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
运行截图 功能介绍 前台功能包括:首页、详情页、订单、用户中心。后台功能包括:首页、轮播图管理、管理员、卖家管理、买家管理、景区管理、订单管理非开源功能(分类管理,地区管理,收藏管理,评论管理&a…...
架构学习第七周--Prometheus
目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…...
基于Nanopi duo2的WiFi智能摄像头
1.固件包烧录 https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E8.BF.9E.E6.8E.A5WiFi 固件包链接以及烧录工具都在上面链接中 烧录过程 使用读卡器将SD卡插入到电脑,然后打开烧录工具 2.通过串口工具连接板子使其连接WiFi 对应的串口工具,就是这个HyperT…...
Hive Orc表数据导出和导入
导出到hdfs:hive执行 INSERT OVERWRITE DIRECTORY /test/hdfs_dir ROW FORMAT DELIMITED FIELDS TERMINATED BY \t STORED AS ORC SELECT * FROM hive_table; HDFS导出到本地:shell执行 hdfs dfs -get /test/hdfs_dis/file_name /linux_dir/xxx 本…...
Python爬虫实战:从零到一构建数据采集系统
文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代,数据采…...
Ubuntu 的RabbitMQ安装
目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a)添加用户名:admin,密码࿱…...
七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…...
cuda安装
cuda WSL2急速搭建CUDA体验环境_wsl2 cuda-CSDN博客 cudnn cuDNN Archive | NVIDIA Developer pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数
ngx_os_init 声明在 src/os/unix/ngx_os.h ngx_int_t ngx_os_init(ngx_log_t *log); 定义在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX…...
记录一次部署PC端网址全过程
当我查看我之前写的文章时、顿时惊奇发出感慨:啥时候写的?是我写的么?疑惑重重… 所以说,好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步:第一步:申请域名并映射到外网IP ࿰…...
QML 实现一个动态的启动界面
QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...
视频HDR技术详解,你的电脑怎么播放HDR视频?
闲聊:前两天在b站上面看到影视飓风的视频,让我有点疑惑,我不知道为什么播放视频有设备撑不住一说,所以感兴趣去ytb下载了4k原片30hz刷新的,然后测试一下我的电脑能不能播放,发现还是可以的,视觉…...
Spring统一功能处理:拦截器、响应与异常的统一管理
目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核功能之,主要来拦截的请求,在指定法前后,根据业务需要执预先设定的代码。 也就是说,允许开发员提前预定义些逻辑,在的请…...
2025年度福建省职业院校技能大赛高职组“信息安全管理与评估”赛项规程
2025 年度福建省职业院校技能大赛 高 职组“ 信息安全管理与评估 ”赛项规程 一、赛项名称 省赛编号:GZ032 赛项名称:信息安全管理与评估 赛项组别:高职组 竞赛形式: 团体赛 二、竞赛目的 为全面贯彻落实国家网络强国战略&#x…...
Vue 中 nextTick 的原理详解
1. 为什么需要 nextTick Vue 采用 异步渲染机制,当响应式数据发生变化时,Vue 并不会立即更新 DOM,而是将这些变化放入一个 队列 中,并在 同一事件循环(Event Loop)中合并相同的修改,最后执行批…...
vue 手写分页
【先看效果】 (1)内容小于2页 不展示页码 (2)1 < 内容页数< 限定展示页码 展示:页码、上下页;隐藏:首页、末页图标,上、下一区间码。即:(页数&#…...
跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现
小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…...
DuodooBMS源码解读之 sale_change模块
销售变更模块用户使用手册 一、模块概述 本扩展模块主要包含两个主要的 Python 文件:sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py,提供了销售变更报表查看和销售变更单下载的功能。以下是详细的使用说明…...
基于 Highcharts 实现 Vue 中的答题统计柱状图组件
在现代 Web 开发中,数据可视化是一个重要的组成部分,而 Highcharts 是一个广泛使用的 JavaScript 图表库,可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中,我们将基于 Highcharts 创建一个用于答题统计的柱状图&#…...
MySQL 插入更新语句(insert…on duplicate key update语句 )
我们日常在使用 insert into 语句向表中插入数据时,一定遇到过主键或唯一索引冲突的情况,当遇到这种情况时,MySQL默认的反应是报错并停止执行后续的语句,为了避免这种情况,你有3种选择: 使用insert ignore…...
Jenkins整合Jmeter实现接口自动化测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…...
基于LM Arena 的 LLM 基准测试排行榜:DeepSeek-R1 排名第 5
打开 Arena 网站:https://lmarena.ai/,点开 Leaderboard 可以看到上图的排行榜,可以看到 DeepSeek-R1 排名第 5。...
游戏引擎学习第116天
回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化,尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库,而是深入理解代码并进行优化。当前阶段正进行SIMD(单指令多数据)优化,使用Intel推荐…...
【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)
大卫• 霍克尼,很喜欢这个老头,“艺术是一场战斗”。老先生零九年有了iphone,开始用iphone画画,一零年开始用ipad画画,用指头划拉,据说五分钟就能画一幅,每天早上随手画几幅送给身边的朋友。很c…...
当湖南家具遇上DeepSeek:极满家开启智能家居新时代
在湖南的街头巷尾,总流传着这样一句话:家具有温度,生活才有味道。走进铂乐极满家的展厅,只有被阳光浸润的原木香气,和智能家居跳动的温暖建议。DeepSeek就推荐了能自动调节高度的智能款,连护眼灯角度都算好…...
#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…...
Docker挂载数据显式挂载和隐式挂载的区别
项目使用的Docker file 创建数据卷挂载点,结果发现宿主机目录中的数据卷路径下是空的,才知道docker file中创建的数据卷是隐式挂载,并不会在宿主机上留下持久化数据,随着容器被删除隐式挂载的数据卷也会跟着被删除 后面改为在jen…...
深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)
HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在H…...
MySQL八股学习笔记
文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器(1)词法分析(2)语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute(1…...