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

Redis100道高频面试题

一、Redis基础

Redis是什么?主要应用场景有哪些?

Redis 是一个开源的、基于内存的数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合等),可以用作数据库、缓存和消息中间件。 主要应用场景:

  1. 缓存:利用Redis的高性能读写能力,作为应用的缓存层,减少对后端数据库的压力。

  2. 会话存储:存储用户的会话信息,实现分布式环境下的Session共享。

  3. 消息队列:通过发布/订阅模式或列表数据结构实现消息队列功能。

  4. 计数器与排行榜:利用Redis的原子操作实现实时计数和排行榜功能。

  5. 实时分析:处理实时数据流,进行统计分析。

  6. 分布式锁:实现跨服务的分布式锁。


Redis与Memcached的区别是什么?
特性RedisMemcached
数据持久化支持RDB和AOF持久化不支持持久化
数据类型支持多种数据结构(字符串、哈希等)仅支持简单的键值对
单线程/多线程单线程多线程
内存管理更灵活的内存管理固定大小的内存分配(Slab机制)
事务支持支持事务不支持事务
插件扩展性支持Lua脚本不支持脚本

Redis支持哪些数据类型?分别举例说明。

Redis支持以下数据类型:

  1. 字符串(String):存储简单的键值对。例如:SET name "Qwen"

  2. 哈希(Hash):存储字段-值对。例如:HSET user:1001 name "Alice" age 25

  3. 列表(List):存储有序的字符串列表。例如:LPUSH queue item1 item2

  4. 集合(Set):存储无序且唯一的字符串集合。例如:SADD fruits apple banana

  5. 有序集合(Sorted Set):存储带分数排序的集合。例如:ZADD scores 100 user1 90 user2

  6. 位图(Bitmap):用于高效存储布尔值。例如:SETBIT bitmap 10 1

  7. HyperLogLog:用于估算唯一值的数量。例如:PFADD visitors user1 user2


Redis为什么是单线程的?单线程为何高效?
  1. 单线程的原因

    • Redis的核心操作(如读写、命令执行)非常简单且高效,单线程可以避免多线程间的上下文切换开销。

    • 使用I/O多路复用技术(epoll/kqueue/select)来处理并发连接,保证高吞吐量。

  2. 单线程高效的原理

    • 减少了锁竞争和线程切换的开销。

    • 命令执行时间短,适合内存操作。

    • 数据结构简单,减少了复杂度。


Redis的持久化机制有哪些?RDB和AOF的区别?

持久化机制

  1. RDB(快照持久化):定期将内存中的数据保存到磁盘上。

  2. AOF(追加日志持久化):记录每个写操作的命令日志,重启时重新执行这些命令恢复数据。

RDB与AOF的区别

特性RDBAOF
持久化方式定期生成数据快照记录操作命令日志
恢复速度较慢
数据安全性可能丢失最后一次快照后的数据数据更安全,但可能有重复命令问题
文件大小较小较大

如何配置Redis的RDB持久化?

在Redis配置文件 redis.conf 中设置以下参数:

save 900 1    # 900秒内至少有1个key发生变化时触发快照
save 300 10   # 300秒内至少有10个key发生变化时触发快照
save 60 10000 # 60秒内至少有10000个key发生变化时触发快照
rdbcompression yes   # 是否压缩RDB文件
rdbchecksum yes      # 是否计算校验和

AOF重写(AOF Rewrite)的作用是什么?

AOF重写的作用是压缩AOF文件,通过合并冗余命令生成一个新的更小的日志文件,从而节省磁盘空间并提高加载效率。例如,多个INCR命令可以合并为一个最终值。


Redis的过期键删除策略有哪些?

Redis提供了三种过期键删除策略:

  1. 定时删除:在设置键过期时间时启动定时器,立即删除。

  2. 惰性删除:只有当访问某个键时才检查是否已过期,过期则删除。

  3. 定期删除:后台定期扫描一部分键空间,删除已过期的键。


解释Redis的LRU内存淘汰机制。

LRU(Least Recently Used)是一种内存淘汰策略,Redis会在内存不足时优先淘汰最近最少使用的键值对。 例如:maxmemory-policy allkeys-lru 表示在所有键中使用LRU算法淘汰数据。


Redis的事务(MULTI/EXEC)与数据库事务有何区别?
特性Redis事务数据库事务
隔离性不提供隔离性,命令间可能会被其他客户端打断提供ACID特性,严格隔离
回滚支持不支持回滚支持回滚
执行方式将命令打包成队列,一次性执行在事务块中执行多个SQL语句
锁机制无锁机制使用行锁、表锁等机制

总结:Redis事务更轻量级,适用于快速操作场景;而数据库事务更适合复杂的业务逻辑。

二、Redis数据结构


String类型的底层实现是什么?

Redis的String类型底层使用SDS(Simple Dynamic String,简单动态字符串)实现。 SDS的特点:

  1. 内部是一个结构体,包含长度信息、分配的空间大小和实际存储的字符数组。

  2. 提供了预分配冗余空间机制,减少内存分配频率。

  3. 相比C语言的字符串,SDS更安全(避免缓冲区溢出),且支持快速获取字符串长度。


如何用Redis实现分布式锁?

Redis可以利用其原子性和过期时间特性实现分布式锁。以下是基本实现步骤:

  1. 使用SET key value NX PX timeout命令尝试设置锁(NX表示只有键不存在时才设置,PX指定超时时间)。

  2. 如果设置成功,则获得锁;否则等待一段时间后重试。

  3. 解锁时,确保当前客户端持有的锁与加锁时的值一致,避免误删其他客户端的锁。可以通过Lua脚本实现解锁操作。

示例代码(Lua脚本解锁):

if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
elsereturn 0
end

List类型的应用场景有哪些?(如消息队列)

List类型适用于以下场景:

  1. 消息队列:通过LPUSH将任务推入队列,RPOPBLPOP消费任务。 示例:LPUSH queue task1BRPOP queue

  2. 最新N条数据缓存:如保存最新的100条评论。 示例:LTRIM list 0 99 保留前100个元素。

  3. 发布/订阅系统:配合PUBLISHSUBSCRIBE实现简单的消息通知。


Hash类型适合存储什么数据?

Hash类型适合存储对象属性或结构化数据,例如用户信息、商品详情等。 示例:

HSET user:1001 name "Alice" age 25 gender "female"
HGETALL user:1001

优点:

  • 数据紧凑,占用较少内存。

  • 支持原子性更新字段值。


Set和Sorted Set的区别是什么?
特性SetSorted Set
数据结构无序集合,存储唯一值带分数排序的有序集合
排序功能不支持排序按分数排序
典型命令SADD、SMEMBERS、SINTERZADD、ZRANGE、ZREVRANGE
应用场景存储唯一值(如好友列表)排行榜、带权重的数据排序

Sorted Set的底层数据结构是什么?

Sorted Set的底层由两个数据结构组成:

  1. 跳跃表(Skip List):用于按分数排序,支持快速查找和插入。

  2. 哈希表:用于存储成员到分数的映射关系,保证成员唯一性。

跳跃表的优点是能在O(log N)时间内完成插入、删除和查找操作。


HyperLogLog的作用是什么?误差率多少?

HyperLogLog是一种概率数据结构,用于估算唯一值的数量(即基数)。 特点:

  • 内存占用极低,适合处理大规模数据集。

  • 误差率默认为 0.81%,可以通过调整精度参数进一步优化。

典型应用场景:

  • 统计独立访客数(UV)。

  • 计算不重复的IP地址数量。

示例:

PFADD visitors user1 user2 user3
PFCOUNT visitors

Bitmap的应用场景有哪些?(如用户签到)

Bitmap是一种基于位的操作方式,每个位表示一个布尔值(0或1)。 典型应用场景:

  1. 用户签到:记录用户某天是否签到。 示例:SETBIT user:1001 1 1 表示用户1001在第2天签到。

  2. 统计活跃用户:记录某段时间内的活跃状态。

  3. 权限管理:用位图表示用户的权限集合。

优点:内存占用非常小,适合大规模数据统计。


GEO类型如何实现地理位置查询?

Redis的GEO类型基于地理空间索引实现,支持存储经纬度坐标并进行距离计算。 常用命令:

  • GEOADD:添加地理坐标。 示例:GEOADD places 116.4074 39.9042 "Beijing"

  • GEODIST:计算两点间距离。 示例:GEODIST places Beijing Shanghai

  • GEORADIUS:查询某个范围内的位置。 示例:GEORADIUS places 116.4074 39.9042 10 km

底层使用GeoHash算法编码经纬度,支持高效的空间查询。


Stream类型的作用是什么?

Stream是Redis 5.0引入的一种新数据结构,专为消息流设计,具有以下特点:

  1. 高可靠性:消息不会丢失,支持持久化。

  2. 消费者组:支持多消费者并发消费消息。

  3. 回溯能力:可以读取历史消息。

  4. 分片扩展:支持水平扩展以处理海量消息。

典型应用场景:

  • 实时日志处理。

  • 分布式任务队列。

  • 消息中间件替代方案。

示例:

XADD stream * field1 value1 field2 value2  # 添加消息
XREAD STREAMS stream ID                      # 读取消息

三、持久化与高可用


RDB持久化的优缺点是什么?

优点:

  1. 恢复速度快:RDB文件是紧凑的二进制快照,加载时速度较快。

  2. 文件体积小:相比AOF日志,RDB文件占用空间更少。

  3. 适合全量备份:便于定期备份和迁移。

缺点:

  1. 数据安全性较低:由于是周期性快照,可能会丢失最后一次快照后的数据。

  2. 保存过程阻塞:在保存RDB文件时,可能会影响Redis性能(可通过BGSAVE异步保存缓解)。


AOF持久化的优缺点是什么?

优点:

  1. 数据安全性高:几乎不会丢失数据,每次写操作都会记录到AOF文件中。

  2. 可配置同步频率:支持always(每次写入)、everysec(每秒同步)和no(由操作系统决定)三种同步策略。

缺点:

  1. 文件体积大:AOF文件记录了所有写操作命令,文件增长较快。

  2. 恢复速度慢:重启时需要重新执行AOF文件中的所有命令,耗时较长。

  3. 冗余信息多:可能存在重复或冗长的日志记录(可通过AOF重写优化)。


如何同时启用RDB和AOF?

可以在redis.conf中同时开启RDB和AOF:

save 900 1    # 配置RDB快照规则
appendonly yes # 开启AOF

当两者同时启用时,Redis会优先使用AOF进行数据恢复(因为AOF的数据更新更及时)。如果AOF文件损坏,则会回退到RDB恢复。


Redis主从复制的原理是什么?

Redis主从复制的基本原理:

  1. 全量复制

    • 主节点将内存数据生成RDB快照并发送给从节点。

    • 从节点接收RDB文件并加载到内存。

  2. 增量复制

    • 主节点将后续的写操作以命令形式追加到从节点。

    • 如果网络中断导致命令丢失,可以通过部分重同步机制(PSYNC)恢复。


主从复制如何配置?

在从节点的redis.conf中添加以下配置:

slaveof <master-ip> <master-port>

或者通过命令动态设置:

SLAVEOF <master-ip> <master-port>

主节点默认允许从节点连接,无需额外配置。如果需要密码验证,可以设置requirepass并在从节点配置masterauth


什么是哨兵(Sentinel)模式?作用是什么?

哨兵模式是一种高可用解决方案,Redis Sentinel负责监控主从节点的状态,并在主节点故障时自动切换到新的主节点。 主要作用:

  1. 监控:实时检测主从节点是否正常运行。

  2. 故障转移:当主节点不可用时,选举一个从节点升级为主节点。

  3. 通知:向客户端或其他系统发送故障通知。


哨兵如何选举新的主节点?

哨兵选举新主节点的过程:

  1. 多数投票:多个哨兵节点协商,确保大多数哨兵同意切换。

  2. 选择从节点

    • 优先选择与原主节点同步数据最多的从节点。

    • 如果同步数据相同,则选择优先级最高的从节点(通过slave-priority配置)。

    • 如果优先级相同,则选择运行时间最长的从节点。

  3. 升级为新主节点:被选中的从节点执行SLAVEOF NO ONE命令,成为新的主节点。


Redis Cluster如何实现数据分片?

Redis Cluster通过哈希槽(Hash Slot)实现数据分片:

  1. 整个集群有16384个哈希槽,每个键根据其哈希值映射到一个槽。

  2. 每个节点负责一部分槽,数据存储在对应的槽中。

  3. 客户端通过计算CRC16(key) % 16384确定键所属的槽,并找到负责该槽的节点。


Redis Cluster的节点间通信协议是什么?

Redis Cluster使用Gossip协议进行节点间通信,主要包括以下几种消息类型:

  1. Ping消息:用于心跳检测,确认节点状态。

  2. Pong消息:对Ping消息的响应。

  3. Meet消息:新节点加入集群时广播自身信息。

  4. Fail消息:通知其他节点某个节点已失效。

通过这些消息,节点之间可以共享集群拓扑信息、槽分布情况和节点状态。


如何解决Redis Cluster的扩容和缩容问题?

扩容

  1. 添加新节点到集群。

  2. 使用CLUSTER ADDSLOTS分配部分槽给新节点。

  3. 使用redis-trib工具或手动迁移数据到新节点。

缩容

  1. 将目标节点上的槽迁移到其他节点。

  2. 使用CLUSTER DELSLOTS移除槽。

  3. 将目标节点从集群中移除。

注意事项:

  • 扩容和缩容过程中需确保集群始终处于稳定状态(至少一半的主节点在线)。

  • 数据迁移可能会影响性能,建议在低峰期操作。

四、性能与优化


Redis的QPS一般能达到多少?

Redis的QPS(每秒查询次数)取决于硬件配置和使用场景,通常在单线程模式下:

  • 普通操作:如GETSET,QPS可达10万~20万

  • 复杂操作:如ZINTERSTORESORT等,QPS可能降至几千。

通过多核部署(如Cluster模式)或优化网络延迟,可以进一步提升QPS。


如何监控Redis的性能?(如INFO命令)

Redis提供了多种方式监控性能:

  1. INFO命令

    • INFO stats:查看命中率、内存使用、连接数等统计信息。

    • INFO memory:检查内存分配情况。

    • INFO replication:监控主从复制状态。

  2. MONITOR命令:实时查看所有执行的命令。

  3. SLOWLOG命令:查看慢查询日志。

  4. 外部工具:如redis-cli --stat、Prometheus + Grafana等。


Redis的Pipeline有什么作用?

Pipeline是一种批量处理机制,允许客户端一次性发送多个命令并接收响应,减少网络往返时间。 优点:

  • 提高吞吐量,降低延迟。

  • 适合批量操作场景,如批量写入或读取。

示例:

MULTI
SET key1 value1
SET key2 value2
EXEC

如何解决Redis的大Key问题?

大Key会占用大量内存,并可能导致删除时阻塞主线程。解决方案包括:

  1. 分片存储:将大Key拆分为多个小Key存储。

  2. 渐进式删除:使用UNLINK命令异步释放内存。

  3. 定期清理:通过监控工具(如SCAN命令)查找并删除大Key。

  4. 限制大小:设置最大Key大小,超出时拒绝写入。


什么是热Key问题?如何解决?

热Key问题是指某些Key被高频访问,导致单个节点负载过高甚至崩溃。 解决方法:

  1. 数据分片:将热点数据分散到多个节点。

  2. 本地缓存:在应用层缓存热Key,减少对Redis的请求。

  3. 随机前缀:为热Key添加随机前缀,分散访问压力。

  4. 分布式锁限流:控制对热Key的访问频率。


Redis的慢查询日志如何配置?

redis.conf中配置慢查询日志:

slowlog-log-slower-than 10000 # 记录执行时间超过10ms的命令(单位:微秒)
slowlog-max-len 128          # 慢查询日志的最大条数

通过SLOWLOG GET命令查看慢查询记录。


如何优化Redis的内存占用?
  1. 选择合适的数据结构

    • 使用Hash代替多个String

    • 使用BitmapHyperLogLog节省内存。

  2. 启用LRU淘汰策略:自动清理不常用的Key。

  3. 压缩数据:对字符串值进行编码压缩。

  4. 避免过期Key堆积:合理设置过期时间,定期清理无用数据。

  5. 调整持久化频率:减少RDB/AOF文件生成频率以降低内存开销。


Redis的过期策略对性能有什么影响?

Redis的过期策略包括惰性删除定期删除

  1. 惰性删除:只有当访问某个Key时才检查是否已过期,可能会导致过期Key堆积。

  2. 定期删除:后台定时扫描部分Key空间,删除已过期的Key,但可能增加CPU负担。

建议:

  • 对于写密集型场景,适当调高定期删除频率。

  • 避免设置过多短生命周期的Key。


Redis的SCAN命令与KEYS命令有何区别?
特性SCANKEYS
执行方式渐进式扫描,分批返回结果一次性遍历所有Key
性能影响不会阻塞主线程可能导致主线程阻塞
使用场景安全地遍历大量Key快速查找少量Key

推荐使用SCAN命令替代KEYS,尤其是在生产环境中。


如何避免Redis的缓存穿透?

缓存穿透是指查询一个不存在的Key,导致每次请求都直接访问数据库。解决方案:

  1. 布隆过滤器:在应用层使用布隆过滤器预判Key是否存在。

  2. 空值缓存:将不存在的Key缓存为特殊值(如NULL),设置较短的过期时间。

  3. 接口校验:在请求到达缓存之前,验证参数合法性。

示例(空值缓存):

GET non_existent_key
// 如果返回空,设置空值缓存
SET non_existent_key NULL EX 60

五、缓存问题与解决方案


什么是缓存穿透?如何解决?

缓存穿透是指查询一个不存在的Key,导致每次请求都直接访问数据库。 解决方法:

  1. 布隆过滤器:在应用层使用布隆过滤器预判Key是否存在。

  2. 空值缓存:将不存在的Key缓存为特殊值(如NULL),并设置较短的过期时间。

  3. 接口校验:在请求到达缓存之前,验证参数合法性。

示例(空值缓存):

GET non_existent_key
// 如果返回空,设置空值缓存
SET non_existent_key NULL EX 60

什么是缓存雪崩?如何预防?

缓存雪崩是指大量缓存同时失效,导致短时间内数据库压力骤增。 预防方法:

  1. 设置随机过期时间:为不同Key设置不同的过期时间,避免集中失效。

  2. 预热缓存:在高并发场景下,提前加载热点数据到缓存中。

  3. 限流降级:对数据库请求进行限流或熔断,防止系统崩溃。

  4. 持久化缓存:使用Redis的RDB/AOF机制保存缓存数据。


什么是缓存击穿?如何解决?

缓存击穿是指某个热点Key突然失效,大量请求瞬间涌向数据库。 解决方法:

  1. 延迟双删策略:在删除Key时,设置一个短暂的过期时间,防止立即失效。 示例:

    DEL key
    SET key value EX 10 // 设置10秒过期时间
  2. 互斥锁:通过分布式锁确保同一时间只有一个请求可以更新缓存。

  3. 永不过期:对于极热点数据,设置永不过期,并定期异步更新缓存。


如何保证缓存与数据库的一致性?
  1. 写入时更新缓存

    • 写数据库成功后,更新或删除缓存(Write Through模式)。

  2. 读取时修复缓存

    • 如果缓存未命中,则从数据库读取数据并更新缓存(Read Through模式)。

  3. 双写机制

    • 同时写入数据库和缓存,但需注意顺序一致性。

  4. 消息队列异步更新

    • 使用消息队列解耦缓存和数据库的更新操作。


延迟双删策略是什么?

延迟双删策略是一种解决缓存击穿的方法:

  1. 删除Key时,不立即彻底清除,而是设置一个短暂的过期时间(如几秒)。

  2. 在这段时间内,允许部分请求命中缓存,避免所有请求直接打到数据库。

示例:

DEL key
SET key value EX 5 // 设置5秒过期时间

如何用Redis实现分布式Session?
  1. 存储Session数据

    • 将用户的Session信息存储在Redis中,Key为用户ID,Value为Session内容。

    • 设置合理的过期时间以清理无效Session。

  2. 跨服务共享

    • 所有服务通过Redis访问Session数据,实现分布式环境下的Session共享。

示例:

SET session:1001 "{\"user_id\":1001, \"username\":\"Alice\"}" EX 3600
GET session:1001

Redis如何实现消息队列?(如List、Stream)
  1. 基于List

    • 使用LPUSH将任务推入队列,RPOPBLPOP消费任务。

    • 示例:

      LPUSH queue task1
      BRPOP queue
  2. 基于Stream

    • 使用XADD添加消息,XREADXREADGROUP消费消息。

    • 支持消费者组和消息确认机制。

    • 示例:

      XADD stream * field1 value1
      XREAD STREAMS stream ID

如何用Redis实现排行榜功能?

使用Sorted Set实现排行榜功能:

  1. Key为排行榜名称,Score为排名分数,Member为用户ID。

  2. 添加或更新排名:

    ZADD leaderboard 100 user1
    ZADD leaderboard 200 user2
  3. 查询排名:

    ZRANGE leaderboard 0 10 WITHSCORES // 获取前10名
    ZREVRANK leaderboard user1         // 获取用户1的排名

Redis如何实现限流(Rate Limiting)?
  1. 令牌桶算法

    • 使用INCR命令增加令牌计数,结合EXPIRE设置时间窗口。

    • 示例:

      INCRBY user:1001:requests 1
      EXPIRE user:1001:requests 60 // 60秒内有效
      GET user:1001:requests
  2. 漏桶算法

    • 使用LPUSHLTRIM模拟漏桶行为,限制请求速率。


如何用Redis实现布隆过滤器?

Redis本身不直接支持布隆过滤器,但可以通过Bitmap实现类似功能:

  1. 使用Bitmap记录Hash函数的结果。

  2. 检查多个Bit位是否全为1来判断Key是否存在。

示例:

# 添加元素
SETBIT bloomfilter (hash1(key)) 1
SETBIT bloomfilter (hash2(key)) 1# 查询元素
GETBIT bloomfilter (hash1(key)) AND GETBIT bloomfilter (hash2(key))

布隆过滤器的特点:

  • 空间效率高,适合海量数据。

  • 可能存在误判率,需根据需求调整Hash函数数量和Bitmap大小。

八、Java与Redis集成


Java常用的Redis客户端有哪些?(如Jedis、Lettuce)

常用的Redis Java客户端包括:

  1. Jedis:轻量级、阻塞式客户端,适合单线程或少量并发场景。

  2. Lettuce:基于Netty的非阻塞客户端,支持多线程和高并发。

  3. Redisson:功能强大的Redis客户端,内置分布式锁、队列等高级特性。

  4. Spring Data Redis:Spring框架提供的Redis抽象层,封装了Jedis或Lettuce。


Jedis和Lettuce的区别是什么?
特性JedisLettuce
并发模型阻塞式(每个连接独占线程)非阻塞式(基于Netty,共享连接池)
线程安全性不线程安全(需手动管理连接池)线程安全
连接复用每次请求需要从连接池获取新连接单个连接可被多个线程复用
性能较低更高
集群支持需要额外配置Cluster模式原生支持Redis Cluster

Spring Data Redis如何配置连接池?

使用JedisLettuce作为连接池时,可以通过以下方式配置:

  1. Jedis连接池配置

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6379);JedisClientConfiguration jedisConfig = JedisClientConfiguration.builder().usePooling().poolConfig(new GenericObjectPoolConfig()).build();return new JedisConnectionFactory(config, jedisConfig);
    }
  2. Lettuce连接池配置

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6379);LettuceClientConfiguration lettuceConfig = LettuceClientConfiguration.builder().commandTimeout(Duration.ofSeconds(5)).build();return new LettuceConnectionFactory(config, lettuceConfig);
    }

如何用Spring Boot整合Redis?
  1. 添加依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  2. 配置application.yml

    spring:redis:host: localhostport: 6379password:timeout: 5000mslettuce:pool:max-active: 8max-idle: 8min-idle: 0
  3. 使用RedisTemplateStringRedisTemplate操作Redis。


RedisTemplate和StringRedisTemplate的区别?
特性RedisTemplateStringRedisTemplate
Key/Value类型支持任意类型(需序列化)仅支持字符串类型
序列化方式默认使用JdkSerializationRedisSerializer使用StringRedisSerializer
使用场景复杂对象存储简单字符串存储

示例:

// RedisTemplate
redisTemplate.opsForValue().set("key", myObject);// StringRedisTemplate
stringRedisTemplate.opsForValue().set("key", "value");

如何用Redis实现Spring Cache?
  1. 添加依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
  2. 配置application.yml

    spring:cache:type: redis
  3. 在方法上添加@Cacheable注解:

    @Cacheable(value = "users", key = "#id")
    public User getUserById(String id) {// 查询数据库逻辑
    }

Redis如何实现分布式锁(RedLock算法)?

RedLock算法是一种改进的分布式锁实现,适用于跨多个Redis节点的环境。步骤如下:

  1. 获取当前时间戳。

  2. 尝试在多个Redis实例上加锁,超时时间为短时间(如10ms)。

  3. 如果超过半数实例加锁成功,则认为锁获取成功。

  4. 计算锁的有效期为最小成功锁的剩余时间减去一定安全缓冲时间。

  5. 如果失败,则释放所有已加的锁。


Redis的分布式锁在Java中如何实现?

使用Redisson库可以轻松实现分布式锁:

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.config.Config;public class DistributedLockExample {public static void main(String[] args) throws InterruptedException {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);RLock lock = redisson.getLock("myLock");lock.lock(); // 加锁try {// 执行业务逻辑} finally {lock.unlock(); // 解锁}}
}

如何解决Redis连接池资源泄漏问题?
  1. 确保连接正确关闭

    • 使用try-with-resourcesfinally块确保连接归还到池中。

    • 示例:

      try (Jedis jedis = jedisPool.getResource()) {jedis.set("key", "value");
      }
  2. 监控连接池状态

    • 定期检查连接池的活跃连接数和空闲连接数。

    • 如果发现异常,及时调整连接池配置。

  3. 设置连接超时

    • 配置合理的timeout值,避免连接长时间占用。


如何监控Java应用中的Redis性能?
  1. 使用Spring Actuator

    • 添加依赖:

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
    • 访问/actuator/metrics/redis查看Redis指标。

  2. 自定义监控

    • 使用INFO命令获取Redis运行状态。

    • 结合Prometheus + Grafana进行可视化监控。

  3. 第三方工具

    • 使用Redis自带的redis-cli --stat实时监控。

    • 使用专业监控工具(如RedisInsight)。

九、场景设计题


如何设计一个短链生成服务?
  1. 短链生成

    • 使用UUIDBase64编码生成唯一短码。

    • 确保短码不重复(可结合Redis的SETNX命令)。

  2. 存储映射关系

    • 使用Redis的Hash类型存储长链接和短链接的映射关系。

      HSET url_map short_code long_url
  3. 访问解析

    • 用户访问短链接时,通过HGET获取对应的长链接并重定向。


如何实现用户签到功能?
  1. 使用Bitmap

    • 将用户的签到记录存储在Bitmap中,每个位表示一天。

      SETBIT user:1001:sign 1 1 // 表示用户1001第2天签到
  2. 查询连续签到天数

    • 使用BITCOUNT统计签到总天数。

    • 使用GETRANGE检查连续性。

  3. 奖励机制

    • 根据连续签到天数发放奖励。


如何统计网站的UV(独立访客)?
  1. 使用HyperLogLog

    • HyperLogLog适合估算唯一值数量(如IP地址或用户ID)。

      PFADD uv_set user_id_123
      PFCOUNT uv_set
  2. 按时间分组

    • 按天、小时等粒度存储UV数据,便于历史统计。


如何实现秒杀系统的库存扣减?
  1. 使用分布式锁

    • 在扣减库存时加锁,避免并发问题。

      RLock lock = redisson.getLock("product:1001:lock");
      lock.lock();
      try {if (inventory > 0) {inventory--;}
      } finally {lock.unlock();
      }
  2. 使用原子操作

    • 使用DECR命令直接扣减库存。

      DECR product:1001:inventory

如何设计一个实时排行榜?
  1. 使用Sorted Set

    • Key为排行榜名称,Score为排名分数,Member为用户ID。

      ZADD leaderboard 100 user1
      ZADD leaderboard 200 user2
  2. 更新分数

    • 使用ZINCRBY动态更新用户分数。

  3. 查询排名

    • 获取前N名:ZRANGE leaderboard 0 N WITHSCORES

    • 查询某个用户排名:ZREVRANK leaderboard user1


如何用Redis实现延迟队列?
  1. 基于ZSet

    • 使用Score表示任务的执行时间。

      ZADD delay_queue <timestamp> task_id
  2. 轮询任务

    • 定期检查当前时间之前的任务并执行。

      ZRANGEBYSCORE delay_queue 0 now
      ZREM delay_queue task_id

如何实现微博的关注/粉丝列表?
  1. 关注列表

    • 使用Set存储用户关注的人。

      SADD follow:1001 1002 1003
  2. 粉丝列表

    • 使用Set存储用户的粉丝。

      SADD follower:1002 1001
  3. 互相关注

    • 使用SINTER查找共同关注的人。

      SINTER follow:1001 follow:1002

如何缓存商品详情页并解决并发更新?
  1. 缓存策略

    • 使用String类型存储商品详情页的HTML内容。

      SETEX product:1001:detail "<html>..." 3600
  2. 并发更新

    • 使用SETNX确保只有一个线程更新缓存。

    • 更新完成后设置过期时间。


如何实现分布式环境下的全局ID生成?
  1. 基于时间戳

    • 使用Unix时间戳 + 机器ID + 序列号生成唯一ID。

  2. 使用Redis自增

    • 使用INCR命令生成递增ID。

      INCR global_id
  3. Snowflake算法

    • 分布式环境下推荐使用Snowflake算法,包含时间戳、机器ID和序列号。


如何用Redis实现自动补全(搜索提示)?
  1. 基于Prefix Tree(Trie)

    • 使用Sorted Set存储以不同前缀开头的词。

      ZADD autocomplete "apple" 0
      ZADD autocomplete "app" 0
  2. 模糊匹配

    • 使用ZRANGEBYLEX查询以特定前缀开头的词。

      ZRANGEBYLEX autocomplete [apple [appz
  3. 优化性能

    • 对常用前缀进行预加载,减少查询次数。

十、故障排查与运维


Redis内存占用过高如何排查?
  1. 检查大Key

    • 使用SCAN命令查找占用内存较大的Key。

      SCAN 0 MATCH * COUNT 1000
  2. 分析内存分布

    • 使用MEMORY USAGE key查看单个Key的内存占用。

    • 使用INFO memory获取整体内存使用情况。

  3. 检查淘汰策略

    • 确保启用了合适的淘汰策略(如LRU)。

  4. 清理无用数据

    • 删除过期或无效的Key。


Redis的CPU使用率过高可能是什么原因?
  1. 慢查询

    • 使用SLOWLOG GET查看耗时较长的命令。

  2. 频繁的RDB/AOF操作

    • 持久化操作可能导致CPU占用升高。

  3. 复杂命令

    • KEYSSORT等全局扫描命令会阻塞主线程。

  4. 主从复制

    • 全量同步时,主节点生成RDB文件会消耗大量CPU。

解决方案:

  • 优化慢查询。

  • 调整持久化频率。

  • 避免使用耗时命令。


主从复制延迟过大如何解决?
  1. 网络问题

    • 检查主从节点间的网络延迟。

  2. 主节点压力过大

    • 分担主节点负载,减少写入频率。

  3. 从节点性能不足

    • 增加从节点资源(CPU、内存)。

  4. 调整同步策略

    • 使用replicaof no one暂时断开从节点,手动同步后重新连接。


AOF文件损坏如何修复?
  1. 手动修复

    • 找到损坏的日志部分,删除或修正命令。

  2. 使用redis-check-aof工具

    • Redis自带工具可以检测和修复AOF文件。

      redis-check-aof --fix aof_file
  3. 重置AOF文件

    • 如果无法修复,可以通过全量快照重新生成AOF文件。

      BGREWRITEAOF

如何安全地重启Redis实例?
  1. 备份数据

    • 确保启用了RDB持久化,并生成最新快照。

  2. 停止写操作

    • 在业务低峰期暂停写请求。

  3. 优雅关闭

    • 使用SHUTDOWN命令确保所有数据已保存。

  4. 启动实例

    • 启动Redis并验证数据完整性。


Redis的CLUSTER NODES命令返回什么信息?

CLUSTER NODES命令返回当前Redis Cluster的拓扑信息,包括:

  1. 节点ID:每个节点的唯一标识。

  2. 地址:节点的IP和端口。

  3. 状态:节点是否在线(connecteddisconnected)。

  4. 槽分配:节点负责的哈希槽范围。

  5. 角色:节点是主节点还是从节点。

  6. 其他信息:如最后通信时间、配置版本等。

示例输出:

c8f3d9...fe7e2a 192.168.1.1:6379@16379 master - 0 1626516339000 1 connected 0-5460

如何备份和恢复Redis数据?
  1. 备份

    • 使用BGSAVE生成RDB快照文件。

    • 将RDB文件拷贝到安全位置。

  2. 恢复

    • 将备份的RDB文件放到Redis数据目录。

    • 启动Redis时自动加载RDB文件。


Redis的日志文件如何分析?
  1. 日志级别

    • Redis支持debugverbosenoticewarning四种日志级别。

    • 修改redis.conf中的loglevel参数。

  2. 常见日志内容

    • 客户端连接/断开记录。

    • 错误信息(如OOM、持久化失败)。

    • 慢查询记录。

  3. 分析工具

    • 使用grepawk提取关键信息。

    • 结合ELK(Elasticsearch + Logstash + Kibana)进行集中化分析。


如何升级Redis版本?
  1. 备份数据

    • 确保启用了RDB持久化并生成最新快照。

  2. 停止服务

    • 使用SHUTDOWN命令优雅关闭Redis。

  3. 安装新版本

    • 替换旧版Redis二进制文件。

  4. 验证兼容性

    • 检查新版本的配置文件是否有变化。

  5. 启动服务

    • 启动Redis并验证数据和功能正常。


如何实现Redis的监控报警?
  1. 使用内置命令

    • 定期执行INFO命令监控指标(如内存使用、连接数、命中率)。

  2. 集成监控工具

    • 使用Prometheus + Grafana采集和展示Redis指标。

    • 配置Alertmanager设置报警规则。

  3. 第三方工具

    • 使用RedisInsight、RedisLive等可视化工具。

  4. 自定义脚本

    • 编写Shell或Python脚本定期检查Redis状态,并通过邮件/SMS发送报警。

相关文章:

Redis100道高频面试题

一、Redis基础 Redis是什么&#xff1f;主要应用场景有哪些&#xff1f; Redis 是一个开源的、基于内存的数据结构存储系统&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表、集合等&#xff09;&#xff0c;可以用作数据库、缓存和消息中间件。 主要应用场景&…...

Mac OS Homebrew更换国内镜像源(中科大;阿里;清华)

omebrew官方的源一般下载包之类的会很慢&#xff0c;所以通常我们都是用国内的镜像源来代替&#xff0c;这样会提高我们的效率。Homebrew主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。 代码语言&#xff1a;javascript 代码运行次数&#xf…...

excel vlookup的精确查询、模糊查询、反向查询、多列查询

目录 入门 精确查询 模糊查询 反向查询 (搭配 if 函数) 多列查询 (搭配 match 函数) 入门 精确查询 需求: 查找 学生编号是008 所在的班级 操作: 在I2单元格输入公式如下,VLOOKUP(H2,B1:E12,4,FALSE), 得出结果 看一下vlookup 公式每一个参数应该怎么写? 语法: vlookup…...

linux的文件系统及文件类型

目录 一、Linux支持的文件系统 二、linux的文件类型 2.1、普通文件 2.2、目录文件 2.3、链接文件 2.4、字符设备文件: 2.5、块设备文件 2.6、套接字文件 2.7、管道文件 三、linux的文件属性 3.1、关于权限部分 四、Linux的文件结构 五、用户主目录 5.1、工作目录…...

MySQL 安装配置(完整教程)

文章目录 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL 5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&am…...

C# Unity 唐老狮 No.4 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...

给没有登录认证的web应用添加登录认证(openresty lua实现)

这阵子不是deepseek火么&#xff1f;我也折腾了下本地部署&#xff0c;ollama、vllm、llama.cpp都弄了下&#xff0c;webui也用了几个&#xff0c;发现nextjs-ollama-llm-ui小巧方便&#xff0c;挺适合个人使用的。如果放在网上供多人使用的话&#xff0c;得接入登录认证才好&a…...

R语言绘图:韦恩图

韦恩分析 韦恩分析&#xff08;Venn Analysis&#xff09;常用于可视化不同数据集之间的交集和并集。维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图、温氏图、韦恩图、范氏图&#xff0c;用于显示元素集合重叠区域的关系型图表&#xff0c;通过图形与图形…...

STM32——串口通信 UART

一、基础配置 Universal Asynchronous Receiver Transmitter 异步&#xff0c;串行&#xff0c;全双工 TTL电平 &#xff1a;高电平1 低电平0 帧格式&#xff1a; 起始位1bit 数据位8bit 校验位1bit 终止位1bit NVIC Settings一栏使能接受中断。 之前有设置LCD&#xff0c;…...

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型 1.3 基于Transformer 的语言模型1.3.1 Transformer1&#xff09;注意力层&#xff08;AttentionLayer&#xff09;2&#xff09;全连接前馈层&#xff08;Fully-connected Feedforwad Layer&#xff09;3&#xff09;层正…...

靶场(二)---靶场心得小白分享

开始&#xff1a; 看一下本地IP 21有未授权访问的话&#xff0c;就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...

大学至今的反思与总结

现在是2025年的3月5日&#xff0c;我大三下学期。 自大学伊始&#xff0c;我便以考研作为自己的目标&#xff0c;有时还会做自己考研上岸头部985,211&#xff0c;offer如潮水般涌来的美梦。 但是我却忽略了一点&#xff0c;即便我早早下定了决心去考研&#xff0c;但并没有早…...

【大模型】Llama 3.2 大语言模型初探:模型权重下载

文章目录 一、简介二、权重下载2.1 方法一&#xff1a;Meta 官网申请下载2.2 方法二&#xff1a;使用 hugging face 下载 一、简介 Llama&#xff08;Large Language Model Meta AI&#xff09;是 Meta&#xff08;原 Facebook&#xff09;开发的一系列开源大型语言模型。它的目…...

unity学习63,第2个小游戏:用fungus做一个简单对话游戏

目录 1 目标用fungus做一个简单的剧情对话游戏 1.1 先创建一个新的3D项目 1.2 fungus是什么 1.2.1 怎么获得 1.2 在AssetStore里搜索fungus (插件类)--千万别买收费的错的&#xff01; 1.3 fungus的官网 1.3.1 官网给的3个下载链接&#xff0c;unity的果然已经失效了 …...

笔记:代码随想录算法训练营day36:LeetCode1049. 最后一块石头的重量 II、494. 目标和、474.一和零

学习资料&#xff1a;代码随想录 1049.最后一块石头的重量II 力扣题目链接 思路&#xff1a;如何讲该问题转化为背包问题&#xff1a;还是对半分去碰&#xff0c;对半分去碰碰剩下的就是最小的。然后背包容量就是一半儿&#xff0c;物品重量等于物品价值等于stones[i] 和上…...

Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验

目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...

Android实现漂亮的波纹动画

Android实现漂亮的波纹动画 本文章讲述如何使用二维画布canvas和camera、矩阵实现二、三维波纹动画效果&#xff08;波纹大小变化、画笔透明度变化、画笔粗细变化&#xff09; 一、UI界面 界面主要分为三部分 第一部分&#xff1a;输入框&#xff0c;根据输入x轴、Y轴、Z轴倾…...

qt实践教学(编写一个代码生成工具)持续更新至完成———

前言&#xff1a; 我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具&#xff0c;可以把我平时用到的代码整合一下全部放入这个软件中&#xff0c;做一个我自己专门的代码生成工具&#xff0c;我初步的想法是在下拉选框中拉取需要配置的功能&#xff0c;然后就弹出对…...

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…...

vue3(笔记)4.0 vueRouter.导航守卫.ElementPuls知识点

---vueRouter 创建路由: 完整写法(懒加载): 默认写法与vue2一致: 导入 然后 写成component: LoginPage import { createRouter, createWebHistory } from vue-routerconst router createRouter({history: createWebHistory(import.meta.env.BASE_URL), routes: [{path:/lo…...

[数字图像处理]实验三:直方图增强

目录 一、实验目的 二、实验原理 三、实验内容&#xff08;附代码&#xff09; 四、实验结果及分析 五、实验小结 一、实验目的 1.了解图像增强的意义和目的 2.掌握各种图像增强的基本原理和方法 3.使用MATLAB实现图像增强 二、实验原理 图像增强方法从增强的作用域…...

图像分类项目1:基于卷积神经网络的动物图像分类

1、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;从…...

并发编程(线程池)面试题及原理

1. 执行原理/核心参数 1.1 核心参数 核心参数 corePoolSize 核心线程数目maximumPooISize 最大线程数目 &#xff08;核心线程&#xff0b;救急线程的最大数目&#xff09;keepAliveTime 生存时间- 救急线程的生存时间&#xff0c;生存时间内没有新任务&#xff0c;此线程资…...

初次使用 IDE 搭配 Lombok 注解的配置

前言 在 Java 开发的漫漫征程中&#xff0c;我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式&#xff0c;巧妙地在编译阶段为我们生成那些繁琐的样板代码&#xff0c;比如 getter、setter、构造函数等。然而&…...

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…...

2024四川大学计算机考研复试上机真题

2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列&#xff1a; 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...

【GPU使用】如何在物理机和Docker中指定GPU进行推理和训练

我的机器上有4张H100卡&#xff0c;我现在只想用某一张卡跑程序&#xff0c;该如何设置。 代码里面设置 import os # 记住要写在impot torch前 os.environ[CUDA_VISIBLE_DEVICES] "0, 1"命令行设置 export CUDA_VISIBLE_DEVICES0,2 # Linux 环境 python test.py …...

汽车免拆诊断案例 | 2023款丰田雷凌汽油版车行驶中偶尔出现通信故障

故障现象  一辆2023款丰田雷凌汽油版车&#xff0c;搭载1.5 L发动机&#xff0c;累计行驶里程约为4700 km。车主反映&#xff0c;行驶中偶尔组合仪表上的发动机转速信号丢失&#xff0c;转向变重&#xff0c;且有“闯车”感&#xff0c;同时车辆故障警报蜂鸣器鸣响。 故障诊断…...

千里科技亮相吉利AI智能科技发布会,共启“AI+车”新纪元

今天&#xff0c;在三亚举行的吉利AI智能科技发布会上&#xff0c;千里科技董事长印奇发表了主题为《从“车AI”到“AI车”》的演讲。印奇重点分享了对于“AI车”未来趋势的判断&#xff0c;并重点介绍了在吉利AI科技生态体系下&#xff0c;围绕智驾、智舱等领域的创新合作。基…...

汽车零部件厂如何选择最适合的安灯系统解决方案

在现代制造业中&#xff0c;安灯系统作为一种重要的生产管理工具&#xff0c;能够有效提升生产线的异常处理效率&#xff0c;确保生产过程的顺畅进行。对于汽车零部件厂来说&#xff0c;选择一套适合自身生产需求的安灯系统解决方案尤为重要。 一、安灯系统的核心功能 安灯系统…...

spring boot + vue 搭建环境

参考文档&#xff1a;https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建环境 一、浏览器二、jd…...

spaCy 入门:自然语言处理的高效工具

spaCy 入门&#xff1a;自然语言处理的高效工具 引言 spaCy 是一个功能强大的开源 Python 库&#xff0c;专注于工业级的自然语言处理&#xff08;NLP&#xff09;。它以其高效的性能、简洁的 API 和对多种语言的支持而闻名。无论是进行文本分析、信息提取还是构建智能聊天机…...

Stable Diffusion模型高清算法模型类详解

Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4&#xff0c;分块尺寸768px★★★★★☆皮肤纹理细腻&#xff0c;但高对比场景易出现…...

数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解

目录 一.冒泡排序 二.堆排序 三.插入排序 四.选择排序 五.希尔排序 六.快速排序 1.Lomuto版本&#xff08;前后指针法&#xff09; 2.Lomuto版本的非递归算法 3.hoare版本&#xff08;左右指针法&#xff09; 4.挖坑法找分界值&#xff1a; 七.归并排序 八.计数排序…...

QT-对象树

思维导图 写1个Widget窗口&#xff0c;窗口里面放1个按钮&#xff0c;按钮随便叫什么 创建2个Widget对象 Widget w1,w2 w1.show() w2不管 要求&#xff1a;点击 w1.btn ,w1隐藏&#xff0c;w2显示 点击 w2.btn ,w2隐藏&#xff0c;w1 显示 #include <QApplication> #inc…...

随机播放音乐 伪随机

import java.util.*;/*** https://cloud.tencent.com.cn/developer/news/1045747* 伪随机播放音乐*/ public class MusicPlayer {private List<String> allSongs; // 所有歌曲列表private List<String> playedSongs; // 已经播放过的歌曲列表private Map<String…...

spring boot打包插件的问题

在spring boot项目中声明了 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> 执行mvn clean package&…...

海康摄像头接入流媒体服务器实现https域名代理播放

环境 操作系统&#xff1a;Ubuntu 22.04流媒体服务器&#xff1a;srs 官网安装教程srs开启GB28181协议 官网开启教程进行海康摄像头的配置 官网配置教程srs使用systemctl实现开机自启 官网配置教程 nginx配置说明 server {listen 80;server_name a.com;return 301 https://$…...

Stable Diffusion模型Pony系列模型深度解析

Stable Diffusion模型Pony系列模型深度解析 一、技术架构与核心特性 基于SDXL的深度优化 Pony系列模型以SDXL为基础框架&#xff0c;通过针对二次元/动漫风格的微调&#xff0c;强化了在该领域的生成能力&#xff0c;同时保留了对写实场景的兼容性‌。其训练数据特别侧重于人…...

性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术

??关注&#xff0c;带你探索Java的奥秘&#xff01;?? ??超萌技术攻略&#xff0c;轻松晋级编程高手&#xff01;?? ??技术宝库已备好&#xff0c;就等你来挖掘&#xff01;?? ??订阅&#xff0c;智趣学习不孤单&#xff01;?? ??即刻启航&#xff0c;编…...

【Kubernets】K8S内部nginx访问Service资源原理说明

文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...

Markdown HTML 图像语法

插入图片 Markdown ![图片描述](图片链接)一般来说&#xff0c;直接复制粘贴过来就行了&#xff0c;部分网页/应用可以拖拽&#xff0c;没人会真敲图片的链接吧…… 示例图片&#xff1a; ![Creeper?](https://i-blog.csdnimg.cn/direct/f5031c8c4f15421c9882d7eb23540b8…...

2503,D比C更易重构

我发现C程序很少超越其初始设计.问题是,很难重构C程序.如 struct S { int a; }; struct S s; s.a 3; struct S *p; p->a 3;即.用来直接访问,->用来间接访问.假设想把按值传递S改为按指针传递S.现在你必须更新每个使用,而不仅是声明. 这是它在D中的工作方式: struct …...

Scala 中 val 和对象内部状态的关系

在 Scala 中&#xff0c;val 用于声明不可变的变量&#xff0c;这意味着一旦 val 被赋值&#xff0c;它的引用&#xff08;即指向的内存地址&#xff09;就不能再改变。然而&#xff0c;这并不影响对象内部的状态&#xff08;即对象的属性&#xff09;是否可以改变。具体来说&a…...

疫情管理系统设计与实现(代码+数据库+LW)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本疫情管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…...

记Android12上一个原生bug引起的system_server crash

一. 现象描述 近日测试上报一个几乎必现的crash&#xff0c;描述如下: 现象: launcher编辑状态与锁屏解锁交互时系统概率性重启 操作步骤: 进入launcher组件编辑状态按电源键灭屏后亮屏&#xff0c;锁屏界面上滑解锁launcher编辑状态向右或向左滑动重复1&#xff0c;2&#x…...

代码随想录算法训练营第六天|Leetcode454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

15. 三数之和 建议&#xff1a;本题虽然和 两数之和 很像&#xff0c;也能用哈希法&#xff0c;但用哈希法会很麻烦&#xff0c;双指针法才是正解&#xff0c;可以先看视频理解一下 双指针法的思路&#xff0c;文章中讲解的&#xff0c;没问题 哈希法很麻烦。 题目链接/文章讲…...

大数据环境(单机版) Flume传输数据到Kafka

文章目录 前言一、准备二、安装三、配置环境变量四、修改配置4.1、kafka配置4.2、Flume配置 五、启动程序5.1、启动zk5.2、启动kafka5.3、启动flume 六、测试6.1、启动一个kafka终端&#xff0c;用来消费消息6.2、写入日志 其他 前言 flume监控指定目录&#xff0c;传输数据到…...

计算机毕业设计SpringBoot+Vue.js高校教师科研管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

C++课程设计【宿舍管理查询软件】

宿舍管理查询软件 一、题目描述二、源码以及说明宿舍管理查询软件设计与实现1. 系统设计思路1.1 功能需求1.2 数据结构2. 系统实现3. 代码说明3.1 数据结构3.2 功能实现3.3 文件存储4. 示例运行输入输出5. 总结其他QT文章推荐一、题目描述 (一)问题描述 为宿舍管理人员编写一…...