Redis(二)实战:五大数据类型在消息队列与排行榜中的应用
1. 从入门到实战为什么Redis的五大数据类型是“瑞士军刀”上次我们聊了Redis五大数据类型的基本操作就像认识了工具箱里的锤子、螺丝刀、扳手。但光知道工具叫什么名字、长什么样离真正修好家里的水管或者组装好一个书架还差得远。今天我们就来点“真家伙”看看这些工具在真实的项目战场上比如处理蜂拥而至的订单消息或者实时刷新游戏排行榜到底该怎么用。很多刚接触Redis的朋友会有个误区觉得它就是个“超级快的缓存”把数据库查询结果往里一丢就完事了。这确实是最常见的用法但只发挥了Redis三成的功力。Redis真正厉害的地方在于它用五种极其精炼的数据结构String, List, Hash, Set, Sorted Set直接为你封装好了许多高级编程模型。你不用自己吭哧吭哧去写复杂的队列逻辑或者排序算法直接调用几个命令一个高性能、高可用的解决方案就搭好了。我经历过不少项目早期为了快速上线用数据库的表来模拟消息队列或者用应用内存来维护排行榜结果用户量一上来数据库连接池被打满、应用内存溢出各种问题接踵而至。后来引入Redis用List做消息队列用Sorted Set做排行榜不仅性能提升了几个数量级代码量也减少了七八成维护起来清爽多了。所以这篇文章我们不谈枯燥的理论就聚焦两个最经典、最实用的高级场景用List打造一个轻量却可靠的消息队列以及用Sorted Set构建一个实时又精准的排行榜系统。我会手把手带你写代码分析每一步的考量还会分享我在实际使用中踩过的坑和总结的最佳实践。无论你是正在做毕业设计的学生还是工作中需要快速解决实际问题的开发者相信都能直接“抄作业”获得立竿见影的效果。2. List类型实战构建一个简易却强大的消息队列消息队列是什么你可以把它想象成一条传送带。生产者比如用户下单的请求把包裹消息放到传送带的一端消费者比如处理订单的库存服务在传送带的另一端按顺序取走包裹进行处理。它的核心作用就是解耦和削峰填谷下单服务不用等库存处理完就能返回成功高峰期的大量订单也可以先在队列里排好队后台服务按自己的能力慢慢处理避免被瞬间冲垮。用Redis的List来实现这个“传送带”简直是天作之合。List的LPUSH/RPUSH命令可以在列表头部或尾部快速插入元素而LPOP/RPOP命令则可以原子性地从另一端取出并移除元素。这个“取出并移除”的动作是关键它保证了同一个消息不会被重复处理。2.1 基础模型LPUSH与RPOP的经典组合最经典的模式是生产者从左边推入消息消费者从右边取出消息这构成了一个先入先出FIFO的队列。生产者代码示例Python:import redis import json # 连接Redis redis_client redis.Redis(hostlocalhost, port6379, db0) def send_order_message(order_id, user_id, product_info): 发送订单消息到队列 message { order_id: order_id, user_id: user_id, product: product_info, timestamp: time.time() } # 关键操作从列表左侧插入消息 redis_client.lpush(order_queue, json.dumps(message)) print(f订单 {order_id} 已加入队列) # 模拟用户下单 send_order_message(ORD20231027001, user123, {id: 101, name: Redis实战指南, price: 69.9})消费者代码示例Python:def process_order_queue(): 处理订单队列的消费者 while True: # 关键操作从列表右侧阻塞式取出消息timeout0表示无限等待 # BRPOP 是 RPOP 的阻塞版本如果队列为空它会一直等待直到有消息到来 result redis_client.brpop(order_queue, timeout0) if result: queue_name, message_data result message json.loads(message_data) print(f开始处理订单: {message[order_id]}, 用户: {message[user_id]}) # 这里模拟实际的业务处理比如扣减库存、生成发货单等 # time.sleep(0.5) # 模拟处理耗时 print(f订单 {message[order_id]} 处理完毕)这个模型非常简单直接但它已经能解决80%的轻量级异步任务需求。比如用户注册后发送欢迎邮件、上传图片后生成缩略图、记录操作日志等都可以用这个模式。我自己的个人博客用户评论的通知就是用这种方式处理的非常稳定。2.2 进阶技巧可靠性提升与死信队列基础模型有个问题如果消费者从队列里取出了消息RPOP但在处理过程中程序崩溃了这条消息就永远丢失了。为了解决这个问题Redis提供了更可靠的命令组合RPOPLPUSH或者BRPOPLPUSH阻塞版本。这个命令的精妙之处在于它原子性地执行两个动作从源列表右边取出一个元素同时将其插入到另一个“备份列表”的左边。这样消息在真正被处理前会先有一个“暂存”的地方。改进后的消费者代码:def reliable_order_consumer(): 可靠的订单消费者使用RPOPLPUSH模式 processing_list order_queue:processing # 处理中的消息备份列表 while True: # 原子操作从主队列取出并备份到处理队列 message_data redis_client.brpoplpush(order_queue, processing_list, timeout0) if message_data: try: message json.loads(message_data) print(f开始处理订单: {message[order_id]}) # 模拟业务处理... # 处理成功后从处理队列中移除这条消息 redis_client.lrem(processing_list, 1, message_data) # 移除刚处理成功的消息 print(f订单 {message[order_id]} 处理成功已从备份队列清除) except Exception as e: print(f处理订单 {message.get(order_id)} 时发生错误: {e}) # 处理失败消息会留在 processing_list 中等待后续排查或重试这样一来即使消费者在处理消息时突然宕机消息也还安全地躺在order_queue:processing这个列表里。我们可以额外启动一个监控服务定期检查这个“处理中队列”如果发现有消息停留时间过长比如超过30分钟就认为它处理失败了可以将其重新放回主队列 (LPUSH回order_queue) 进行重试或者转移到专门的“死信队列”供人工干预。死信队列监控示例:def monitor_dead_letter(): 监控处理超时的消息将其移入死信队列 dead_letter_queue order_queue:dead processing_list order_queue:processing while True: # 获取处理队列中所有消息 all_messages redis_client.lrange(processing_list, 0, -1) current_time time.time() for msg_data in all_messages: try: msg json.loads(msg_data) # 假设消息结构里存了开始处理的时间戳或者我们根据插入processing_list的时间判断 # 这里简化逻辑如果消息在processing中超过30分钟视为死信 if current_time - msg.get(entered_processing_at, current_time) 1800: print(f发现超时消息: {msg.get(order_id)}移入死信队列) redis_client.lpush(dead_letter_queue, msg_data) redis_client.lrem(processing_list, 1, msg_data) except: pass time.sleep(60) # 每分钟检查一次通过RPOPLPUSH和死信队列的机制我们用一个简单的List就实现了一个具备基本可靠性的消息队列。这在很多对可靠性要求不是极端严苛比如金融交易的场景下已经完全够用而且架构复杂度远低于引入Kafka、RabbitMQ等重型中间件。3. Sorted Set类型实战打造实时排行榜系统排行榜是另一个Redis大放异彩的场景。无论是游戏里的战力榜、积分榜还是电商的销量榜、热评榜核心需求就两点快速更新和高效获取排名。如果用数据库来做每次更新分数都要UPDATESELECT ... ORDER BY ... LIMIT数据量一大性能瓶颈立马出现。而Redis的Sorted Set有序集合天生就是为这个而生的。Sorted Set里每个成员都有一个分数scoreRedis会根据分数自动为成员排序。分数可以重复但成员member必须唯一。这完美契合了排行榜的需求用户ID是唯一的成员他的积分、分数、销售额就是对应的score。3.1 核心操作更新分数与获取排名假设我们正在做一个游戏需要实时更新玩家的得分并展示全球排行榜。更新玩家分数:def update_player_score(player_id, score_delta): 更新玩家分数 :param player_id: 玩家唯一ID :param score_delta: 分数变化量可为正加分或负扣分 key game:global_rank # 使用 ZINCRBY 命令原子性地增加玩家的分数。如果玩家不存在会自动创建并设置初始分数为0delta new_score redis_client.zincrby(key, score_delta, player_id) print(f玩家 {player_id} 分数变化 {score_delta}新分数: {new_score}) return new_score # 模拟玩家得分 update_player_score(player_001, 100) # 玩家001获得100分 update_player_score(player_002, 150) update_player_score(player_001, 50) # 玩家001又获得50分现在总分150ZINCRBY命令是排行榜的“神器”它保证了在高并发下多个请求同时为同一个玩家加分时分数也能准确累加不会出现并发错误。获取排行榜:排行榜的查询需求多种多样Sorted Set 提供了丰富的命令来满足。def get_rankings(): key game:global_rank # 1. 获取前10名分数从高到低第1名是冠军 # ZREVRANGE 返回分数从高到低排序的成员 top_10 redis_client.zrevrange(key, 0, 9, withscoresTrue) print( 全球排行榜 TOP10 ) for rank, (player_id, score) in enumerate(top_10, start1): print(f第{rank}名: 玩家 {player_id.decode()} - 分数 {score}) # 2. 获取某个玩家的具体排名和分数 player_id player_001 # ZREVRANK 获取从高到低的排名0-based rank redis_client.zrevrank(key, player_id) # ZSCORE 获取具体分数 score redis_client.zscore(key, player_id) if rank is not None: print(f\n玩家 {player_id} 排名第 {rank 1} 名分数为 {score}) # 3. 获取分数区间内的玩家例如展示所有超过1000分的大神 masters redis_client.zrangebyscore(key, min1000, maxinf, withscoresTrue) print(f\n分数超过1000的大神玩家有 {len(masters)} 位)这里有个细节需要注意ZREVRANGE和ZRANGE的区别。ZREVRANGE是按分数降序排列第一名分数最高适合显示“顶尖排行榜”。ZRANGE是升序。在排行榜场景下我们几乎总是用ZREVRANGE。3.2 高级玩法多维度排行与分段统计真实的排行榜往往更复杂。比如我们可能想要“本周排行榜”每天清零重置。或者除了全球榜还想有“好友榜”。Sorted Set 同样可以优雅地实现。实现每日排行榜关键是为排行榜的Key加上日期后缀自动实现日切。from datetime import datetime, timedelta def get_daily_rank_key(): 生成当日排行榜的key例如 game:rank:20231027 today_str datetime.now().strftime(%Y%m%d) return fgame:rank:{today_str} def update_daily_score(player_id, score_delta): 更新玩家当日分数 daily_key get_daily_rank_key() new_score redis_client.zincrby(daily_key, score_delta, player_id) # 同时可以更新一个总榜 global_key game:rank:global redis_client.zincrby(global_key, score_delta, player_id) # 设置每日排行榜Key的过期时间为48小时留出一些缓冲时间供查询 redis_client.expire(daily_key, 172800) return new_score实现好友排行榜好友排行榜的本质是“全局排行榜”的一个子集。我们可以利用Sorted Set的ZINTERSTORE命令它能够计算多个有序集合的交集并对交集成员的分数进行聚合求和、取最大值等。def get_friend_ranking(player_id): 获取某个玩家与其好友的排行榜 global_key game:rank:global friend_set_key ffriends:{player_id} # 假设用一个Set存储该玩家的好友ID列表 # 临时存储交集结果的Key temp_rank_key ftemp:friend_rank:{player_id} # 计算全局榜和好友集的交集分数取全局榜的分数WEIGHTS 1 0 表示只取第一个集合的分数 # 这个命令的意思是将 global_key 和 friend_set_key 对应的集合做交集 # 交集成员的分数 (global_key中成员的分数 * 1) (friend_set_key中成员的分数 * 0) # 因为friend_set_key是Set没有分数所以默认为1但乘以0后不影响结果。 redis_client.zinterstore(temp_rank_key, [global_key, friend_set_key], aggregateMAX) # 获取这个临时好友榜的前20名 friend_top redis_client.zrevrange(temp_rank_key, 0, 19, withscoresTrue) # 删除临时Key避免内存泄漏 redis_client.delete(temp_rank_key) print(f 玩家 {player_id} 的好友排行榜 ) for rank, (fid, score) in enumerate(friend_top, start1): print(f第{rank}名: 好友 {fid.decode()} - 分数 {score}) return friend_top这个方案非常巧妙它没有把好友数据冗余存储而是通过集合运算实时生成子榜。虽然ZINTERSTORE有一定计算开销但对于好友数量在几百上千这个量级性能完全不是问题。我在一个在线答题项目中就用过这个方案用户可以看到自己在全国的总排名也可以切换到“仅显示同事排名”体验非常好。4. 其他数据类型的组合拳应用虽然List和Sorted Set是消息队列和排行榜的绝对主角但在一个完整的业务场景里其他数据类型也常常扮演重要的配角打好“组合拳”能让你的方案更健壮。4.1 String与Hash缓存与原子计数String作为最简单的类型除了缓存热点数据如商品信息、用户会话在队列和排行榜场景中一个重要的用途是作为分布式锁或者状态标志。例如在处理队列消息时为了防止同一个消息被多个消费者进程重复处理在更复杂的分布式环境下可能出现我们可以用String的SET key value NX PX 30000命令来实现一个简单的分布式锁确保处理逻辑的互斥性。Hash则非常适合用来存储一个对象的多个字段并且能对单个字段进行原子操作。在排行榜场景里除了分数我们可能还想快速查到玩家的名字、头像、等级等信息。def update_player_info(player_id, score_delta, extra_infoNone): 更新玩家分数及详细信息 # 1. 更新排行榜分数 rank_key game:rank:global redis_client.zincrby(rank_key, score_delta, player_id) # 2. 使用Hash存储玩家的详细信息 player_info_key fplayer:info:{player_id} # 如果额外有信息更新比如本次获得的金币 if extra_info: redis_client.hincrby(player_info_key, gold_coins, extra_info.get(gold_earned, 0)) # 同时可以更新最后活跃时间 redis_client.hset(player_info_key, last_active, datetime.now().isoformat()) # 3. 可以很方便地一次性获取玩家的所有信息 info redis_client.hgetall(player_info_key) return info这样当展示排行榜时我们先用ZREVRANGE拿到前100名的玩家ID再用HGETALL批量获取这些ID的详细信息可以通过Pipeline管道优化前端就能渲染出一个包含头像、昵称、分数的完整榜单了。这种“分数存在ZSet详情存在Hash”的模式是性能与灵活性的最佳平衡。4.2 Set去重与关系判断Set的“唯一性”和“集合运算”能力在社交相关的排行榜里特别有用。前面提到的“好友排行榜”就用到了Set来存储好友关系。另一个常见场景是每日签到或活动去重。比如一个“每日登录领奖”的活动需要判断用户今天是否已经领过奖。def daily_checkin(user_id): 用户每日签到 today_key activity:checkin: datetime.now().strftime(%Y%m%d) # SADD 添加成员如果成员已存在则返回0 result redis_client.sadd(today_key, user_id) if result 1: print(f用户 {user_id} 签到成功) # 签到成功发放奖励例如增加积分到排行榜 redis_client.zincrby(user:points, 10, user_id) # 设置这个签到Key在48小时后过期清理数据 redis_client.expire(today_key, 172800) return True else: print(f用户 {user_id} 今天已经签到过了) return False这个SADD操作是原子性的完美解决了并发下可能重复签到的问题。同时我们还可以用SCARD命令快速统计出今天有多少人签到用SINTER找出连续签到7天的用户取最近7天签到集合的交集从而发放“连续签到”大奖。这些操作如果放到数据库里都会是复杂的查询而在Redis里只是一两条命令的事。5. 性能调优与生产环境避坑指南纸上谈兵终觉浅把方案部署到线上面对真实的流量和复杂的网络环境才是考验的开始。这部分我结合自己踩过的坑分享几个让Redis队列和排行榜更稳的关键点。连接管理是生命线。千万不要在每次操作Redis时都创建新连接然后用完就关。TCP三次握手的开销在频繁操作下是灾难性的。一定要使用连接池。以Python的redis-py库为例默认的Redis()客户端就已经内置了连接池。# 正确做法使用单例模式的客户端 import redis pool redis.ConnectionPool(hostlocalhost, port6379, db0, max_connections10) redis_client redis.Redis(connection_poolpool) # 在你的整个应用生命周期内都使用这个 redis_clientPipeline管道化操作。如果你需要连续执行多个Redis命令比如先获取排行榜前100名再逐个查询他们的详细信息使用Pipeline可以将多个命令打包一次性发送大幅减少网络往返延迟RTT。def get_top_players_with_details(limit100): rank_key game:rank:global # 1. 不使用Pipeline低效 # top_ids redis_client.zrevrange(rank_key, 0, limit-1) # details [] # for pid in top_ids: # detail redis_client.hgetall(fplayer:info:{pid.decode()}) # details.append(detail) # 2. 使用Pipeline高效 pipe redis_client.pipeline() pipe.zrevrange(rank_key, 0, limit-1) # 命令1获取ID列表 top_ids pipe.execute()[0] # 执行第一轮拿到ID for pid in top_ids: pipe.hgetall(fplayer:info:{pid.decode()}) # 命令2-N批量获取详情 details pipe.execute() # 一次性执行所有hgetall命令 return list(zip([pid.decode() for pid in top_ids], details))内存监控与淘汰策略。Redis是内存数据库数据都在内存里。用作消息队列时如果消费者挂了消息会不断堆积用作排行榜时历史数据可能越积越多。必须设置合理的内存上限和数据淘汰策略。在配置文件redis.conf中关注这两个参数maxmemory 2gb设置最大内存。maxmemory-policy allkeys-lru设置内存满时的淘汰策略。对于队列和排行榜allkeys-lru最近最少使用或volatile-lru只淘汰设置了过期时间的Key中的LRU通常是好选择。对于队列一定要给队列Key设置过期时间防止永久堆积。持久化与数据安全。默认的RDB快照可能几分钟才存一次盘如果这时候宕机最近几分钟的数据就丢了。对于排行榜这种对数据准确性要求高的场景可以考虑开启AOF持久化appendonly yes并设置为每秒同步appendfsync everysec在性能和可靠性间取得平衡。记住没有一种持久化能保证绝对不丢数据重要的数据要有回源机制比如定期将Redis排行榜数据同步到数据库。最后也是我踩过最深的一个坑处理网络闪断和Redis超时。在消费者代码里brpop或brpoplpush是阻塞的网络不稳定时可能抛出连接错误。你的代码必须有健壮的重试和异常处理机制不能因为一次网络波动就让整个消费者进程崩溃。def robust_consumer(): while True: try: message_data redis_client.brpoplpush(main_queue, backup_queue, timeout30) if message_data: process_message(message_data) except redis.exceptions.ConnectionError as e: print(fRedis连接异常: {e}等待5秒后重试...) time.sleep(5) # 这里可以加入重连逻辑 except Exception as e: print(f处理消息时发生未知错误: {e}) # 记录日志但不要退出循环继续处理下一条消息 time.sleep(1)把这些细节做到位你的Redis队列和排行榜才能真正扛住生产环境的考验。从简单的LPUSH/RPOP到可靠的RPOPLPUSH从基础的ZINCRBY到复杂的ZINTERSTORE多维度排行Redis用最简洁的API提供了最强大的能力。

相关新闻

Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力

Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力

Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力 1. 引言:当音频遇见文字,精准对齐的魔法 你有没有遇到过这样的场景? 一段精彩的演讲录音,你想为它配上精准的字幕,但手动一句一句去…

2026/7/5 1:27:16 阅读更多 →
3步打造高效桌面:NoFences效率工具让混乱图标秒变有序

3步打造高效桌面:NoFences效率工具让混乱图标秒变有序

3步打造高效桌面:NoFences效率工具让混乱图标秒变有序 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天面对布满数十个图标的电脑桌面,寻找一个文件…

2026/7/4 20:21:34 阅读更多 →
ChatGPT API Key安全获取与管理的实战指南

ChatGPT API Key安全获取与管理的实战指南

ChatGPT API Key安全获取与管理的实战指南 在AI应用开发如火如荼的今天,ChatGPT的API无疑是众多开发者手中的利器。然而,这把利器也伴随着一个不容忽视的风险点——API Key的安全管理。一次不经意的密钥泄露,轻则导致账单飙升,重…

2026/7/3 15:52:49 阅读更多 →

最新新闻

AI 压测数据回放:让模型读报告之前先校准口径

AI 压测数据回放:让模型读报告之前先校准口径

AI 压测数据回放:让模型读报告之前先校准口径 一、压测报告不能直接丢给模型 AI 可以帮助分析压测结果,但前提是输入数据口径清楚。很多压测报告里混着预热阶段、限流阶段、错误重试、下游故障和业务噪声。如果直接让模型总结,很容易得到一段…

2026/7/5 1:22:14 阅读更多 →
AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比 一、评测体系设计与方法论 AI编码助手已成为开发效率的关键杠杆。本次评测聚焦三项主流工具的实际表现。从四个维度建立可复现的量化评测框架。 %%{init: {theme: base}}%% radartitle AI编码助手…

2026/7/5 1:20:14 阅读更多 →
PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader 一、训练慢不一定是模型慢 PyTorch 训练时,很多人看到速度慢就先改模型、调 batch size、换显卡。但如果 GPU 利用率忽高忽低,可能瓶颈根本不在模型,而在数据加载。图片解码、文本…

2026/7/5 1:20:14 阅读更多 →
群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 你是否…

2026/7/5 1:20:14 阅读更多 →
云原生可观测性:构建全链路监控体系

云原生可观测性:构建全链路监控体系

引言在微服务架构和容器化部署成为主流的当下,系统的复杂性呈指数级增长。一个请求可能跨越数十个服务实例,传统的日志查看和单点监控已无法满足故障排查的需求。云原生可观测性(Observability)应运而生,它通过Metrics…

2026/7/5 1:18:13 阅读更多 →
工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车PCB设计实战:从四路驱动到主控布局的进阶指南在工程训练综合能力竞赛的智能物流搬运赛项中,一辆性能卓越的小车往往始于精良的PCB设计。当现成模块难以满足定制化需求时,自主设计PCB不仅能显著降低成本,更能实现整车…

2026/7/5 1:18:13 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻