在 .NET Core 中,Redis 支持多种核心数据类型,每种类型都有其独特的应用场景和性能优势。以下是主要数据类型及其详细使用场景:
---
### **1. String(字符串)**
- **描述**:最基本的数据类型,可存储文本、二进制数据(如序列化对象)或数字,最大支持 **512MB**。
- **使用场景**:
- **缓存**:存储高频访问数据(如商品详情页),减少数据库压力[1](@ref)[63](@ref)[69](@ref)。
- **会话管理**:保存用户登录状态或临时会话信息(如 `SessionId`)[1](@ref)[68](@ref)[74](@ref)。
- **计数器**:通过 `INCR`/`DECR` 实现原子操作(如文章阅读量、秒杀库存)[39](@ref)[62](@ref)[73](@ref)。
- **分布式锁**:结合 `SETNX` 或 RedLock 实现高并发锁机制[74](@ref)。
- **示例代码**(StackExchange.Redis):
```csharp
IDatabase db = redis.GetDatabase();
db.StringSet("product:1001", JsonConvert.SerializeObject(product), TimeSpan.FromMinutes(10));
string value = db.StringGet("product:1001");
```
---
### **2. Hash(哈希表)**
- **描述**:键值对集合,适合存储结构化对象,字段和值均为字符串。
- **使用场景**:
- **购物车**:以用户 ID 为键,存储商品 ID 和数量等属性[66](@ref)[68](@ref)[71](@ref)。
- **用户信息**:存储用户的多字段属性(如姓名、邮箱、地址)[68](@ref)。
- **详情页缓存**:避免序列化整个对象,按需获取字段[62](@ref)[73](@ref)。
- **示例代码**:
```csharp
db.HashSet("user:1001", new HashEntry[] {
new("name", "Alice"),
new("email", "alice@example.com")
});
string name = db.HashGet("user:1001", "name");
```
---
### **3. List(列表)**
- **描述**:有序字符串集合,支持双向插入(`LPUSH`/`RPUSH`)和范围查询。
- **使用场景**:
- **消息队列**:实现简单的生产者-消费者模型(如订单处理队列)[62](@ref)[66](@ref)[74](@ref)。
- **最新动态**:存储用户最近操作记录(如最近的 10 条浏览记录)[62](@ref)。
- **任务队列**:异步处理耗时任务(如邮件发送)[74](@ref)。
- **示例代码**:
```csharp
db.ListRightPush("order_queue", "order:20250310001");
string order = db.ListLeftPop("order_queue");
```
---
### **4. Set(集合)**
- **描述**:无序且元素唯一的集合,支持交并差集操作。
- **使用场景**:
- **标签系统**:存储用户兴趣标签(如“科技”“旅行”),用于个性化推荐[65](@ref)[70](@ref)[75](@ref)。
- **共同好友/关注**:通过 `SINTER` 计算用户共同关注的人[62](@ref)[68](@ref)。
- **去重统计**:记录 IP 黑名单或已参与活动的用户 ID[73](@ref)。
- **示例代码**:
```csharp
db.SetAdd("user:1001:tags", "technology");
var commonTags = db.SetIntersect("user:1001:tags", "user:1002:tags");
```
---
### **5. Sorted Set(有序集合)**
- **描述**:元素唯一且按 `score` 排序的集合,支持范围查询和排名。
- **使用场景**:
- **排行榜**:实时更新游戏积分、商品销量排名[66](@ref)[68](@ref)[74](@ref)。
- **延时任务**:通过 `score` 存储任务执行时间,定时轮询获取到期任务[74](@ref)。
- **优先级队列**:按优先级处理任务(如 VIP 用户优先)[66](@ref)。
- **示例代码**:
```csharp
db.SortedSetAdd("leaderboard", "player:1001", 1500);
var topPlayers = db.SortedSetRangeByRank("leaderboard", 0, 9, Order.Descending);
```
---
### **6. Bitmap(位图)**
- **描述**:通过二进制位存储状态(0/1),支持高效位操作。
- **使用场景**:
- **用户签到**:按日期偏移量标记签到状态,统计连续签到天数[61](@ref)[66](@ref)。
- **布隆过滤器**:判断元素是否存在(如缓存穿透防护)[39](@ref)[54](@ref)。
- **实时统计**:统计活跃用户数(如日活、月活)[61](@ref)。
- **示例代码**:
```csharp
int dayOffset = DateTime.Now.Day - 1;
db.StringSetBit("user:1001:202503", dayOffset, 1);
long totalSigns = db.StringBitCount("user:1001:202503");
```
---
### **7. HyperLogLog**
- **描述**:概率型数据结构,用于基数统计(去重计数),误差率约 0.81%。
- **使用场景**:
- **UV 统计**:统计网站或活动的独立访客数[61](@ref)[66](@ref)。
- **大数据分析**:估算大规模数据集中的唯一元素数量[54](@ref)[74](@ref)。
- **示例代码**:
```csharp
db.HyperLogLogAdd("daily_uv", "user:1001", "user:1002");
long uvCount = db.HyperLogLogLength("daily_uv");
```
---
### **8. Geo(地理位置)**
- **描述**:基于有序集合实现,支持地理位置存储与半径查询。
- **使用场景**:
- **附近的人**:根据坐标查找附近的商家或用户[66](@ref)[74](@ref)。
- **轨迹记录**:存储用户移动轨迹(如外卖员位置)[61](@ref)。
- **示例代码**:
```csharp
db.GeoAdd("shops", new GeoEntry(116.40, 39.90, "shop:1001"));
var nearbyShops = db.GeoRadius("shops", 116.41, 39.91, 10, GeoUnit.Kilometers);
```
---
### **总结**
| **数据类型** | **核心优势** | **典型场景** |
|-------------------|--------------------------|------------------------------|
| String | 简单高效,支持多种数据类型 | 缓存、计数器、会话管理 |
| Hash | 结构化对象存储 | 购物车、用户信息 |
| List | 有序队列操作 | 消息队列、最新动态 |
| Set | 唯一性与集合运算 | 标签系统、共同好友 |
| Sorted Set | 排序与优先级处理 | 排行榜、延时任务 |
| Bitmap | 高效位操作 | 签到统计、布隆过滤器 |
| HyperLogLog | 海量数据基数估算 | UV 统计、大数据分析 |
| Geo | 地理位置查询 | 附近的人、轨迹记录 |
**推荐库**:
- **StackExchange.Redis**:官方推荐,适合复杂场景[1](@ref)[8](@ref)。
- **FreeRedis**:轻量高效,支持更灵活的序列化[9](@ref)[74](@ref)。
通过合理选择数据类型,可以显著提升 .NET Core 应用的性能和可维护性。具体实现时需结合业务需求与 Redis 特性进行优化。