在.net core 下 redis 数据类型 有哪些 ?请详细说明各种数据类型的使用场景

 

在 .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 特性进行优化。

 

posted on 2025-03-10 16:23  是水饺不是水饺  阅读(4)  评论(0)    收藏  举报

导航