C#如何实现分页缓存_C#结合Redis缓存数据库多页查询结果【避坑】

千杰君_6208

千杰君_6208

2026-04-30

485人浏览

原创

分页缓存不能直接缓存 offset + limit 查询结果,因偏移量变化导致缓存键不连续、数据重叠、一致性差,且排序字段重复时 offset 本身不稳定;应改用游标式分页,以唯一标识(如 id 或时间戳)为缓存键,并统一序列化、防穿透雪崩。

c#如何实现分页缓存_c#结合redis缓存数据库多页查询结果【避坑】

分页缓存为什么不能直接缓存 OFFSET + LIMIT 查询结果

因为分页偏移量变化时,缓存键不连续,导致大量缓存冗余甚至击穿。比如 page=1 和 page=2 的数据可能有重叠(新增/删除行后),但缓存里却是两份独立快照,既浪费空间,又无法保证一致性。

更关键的是:数据库排序字段若存在重复值(如多个记录 CreatedTime 相同),OFFSET 分页本身就不稳定 —— 同一查询多次执行可能返回不同行,缓存只会放大这个问题。

  • 用 OFFSET 缓存页码 → 缓存键难设计、易失效、更新成本高
  • 真实业务中数据增删频繁 → page=5 的“第一页”可能在下次请求时已不是原来那批数据
  • Redis 里存大量小 key(如 user:list:page:1、user:list:page:2)→ 内存碎片+淘汰压力大

Redis 中该缓存什么:游标式分页 + 范围键设计

把“页码”换成“最后一条记录的唯一标识”,比如 Id 或复合游标 CreatedTime:Id。缓存结构变成:user:list:cursor:15234,表示“从 Id=15234 之后取 20 条”。这样每页缓存键可预测、可复用、可续查。

实际操作中建议用 SortedSet 存原始数据(按时间或 ID 排序),再用 GETRANGE 类似逻辑分段读取;或者用 String 缓存序列化后的 List<t></t>,但必须带版本号或时间戳校验。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 缓存 key 示例:user:list:v2:since:1672531200000(按时间戳分段)
  • 避免用 page 当 key 的一部分,改用 cursor、min_id、max_created_time
  • 写入缓存前加 EXPIRE,且过期时间要略大于数据库慢查询阈值(比如设为 90 秒,而非 30 秒)
  • 如果用 StackExchange.Redis,记得调用 Database.StringSetAsync(key, value, expiry) 显式传入 TimeSpan

StackExchange.Redis 序列化踩坑:不要依赖默认 JsonSerializer

默认序列化器(Newtonsoft.Json 或 System.Text.Json)对 DateTime、decimal、空集合等处理不一致,尤其跨服务部署时容易反序列化失败,报错类似:Cannot deserialize the current JSON array 或 Invalid cast from 'Int64' to 'DateTime'。

更隐蔽的问题是:某些实体含 [JsonIgnore] 或 [DataMember],而 Redis 客户端没走统一序列化管道,导致缓存内容缺失关键字段,分页时数据错位。

  • 统一使用 System.Text.Json 并配置 JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase
  • 显式指定 JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
  • 对 DateTime 字段,强制用 DateTimeKind.Utc 入库和序列化,避免时区混淆
  • 缓存前先本地 JsonSerializer.Serialize 一次验证能否 round-trip,别等从 Redis 取出来才崩

缓存穿透与雪崩:分页场景下最容易被忽略的两个点

用户猛刷 page=9999 或构造超大 cursor 值,后端直接透传到 DB 查空结果,缓存里还存了个空集合 —— 下次请求照样打库。这是典型的穿透;而大量分页 key 同时过期(比如凌晨批量刷新),所有请求瞬间涌向数据库,就是雪崩。

分页场景特殊在于:“无效页”比普通接口更多见,且前端常自动预加载下一页,导致无效请求密度更高。

  • 对空结果也缓存,但用短过期时间(如 2 秒)+ 单独 key 后缀(:empty),防止污染正常数据
  • 用布隆过滤器(BloomFilter)预判游标是否可能有效,但注意它只适合“ID 类型游标”,时间范围类不适用
  • 给分页缓存加随机过期偏移(expiry.AddSeconds(new Random().Next(0, 30))),避免集体失效
  • 数据库查不到时,检查游标是否明显越界(如 id > MAX(Id) FROM table),直接返回空并跳过缓存写入
缓存分页不是把 SQL 拆成几块存进去那么简单,真正麻烦的是游标生成逻辑、边界判断、序列化一致性,以及怎么让缓存“知道”某一页已经不存在了。这些地方不细抠,上线后问题都是凌晨三点弹出来的。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1032

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

2951

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

885

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2615

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

312

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

389

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

631

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

329

20

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4549

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习