Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-15 05:18:51

好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、内存管理以及性能优化方面的知识:

---

### 面试题:实现一个线程安全的缓存系统

**题目描述:**

你需要设计并实现一个线程安全的缓存系统 `SafeCache`,该系统能够存储键值对,并支持以下功能:

1. **添加/更新数据**:可以向缓存中添加或更新指定键的值。
2. **获取数据**:可以根据键获取对应的值。如果键不存在,则返回默认值(`default(T)`)。
3. **删除数据**:可以根据键删除对应的值。
4. **过期机制**:每个键值对可以设置一个过期时间(以秒为单位),如果超过这个时间,键值对会自动从缓存中移除。
5. **容量限制**:缓存有一个最大容量,当缓存中的键值对数量超过最大容量时,需要根据某种策略(例如 LRU - 最近最少使用)移除多余的键值对。

**要求:**
- 缓存必须是线程安全的。
- 实现一个方法来手动清理所有已过期的键值对。
- 提供单元测试以验证你的实现。

---

### 示例代码框架

```csharp
using System;
using System.Collections.Concurrent;
using System.Threading;

public class SafeCache
{
private readonly ConcurrentDictionary> _cache = new ConcurrentDictionary>();
private readonly int _capacity;
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

public SafeCache(int capacity)
{
_capacity = capacity;
}

// 添加或更新键值对
public void AddOrUpdate(string key, T value, int expirationInSeconds);

// 获取键值对
public T Get(string key);

// 删除键值对
public bool Remove(string key);

// 手动清理过期项
public void CleanExpiredItems();

// 内部类表示缓存条目
private class CacheEntry
{
public TValue Value { get; set; }
public DateTime ExpirationTime { get; set; }

public CacheEntry(TValue value, int expirationInSeconds)
{
Value = value;
ExpirationTime = DateTime.UtcNow.AddSeconds(expirationInSeconds);
}

public bool IsExpired => DateTime.UtcNow >= ExpirationTime;
}
}
```

---

### 提示

1. **线程安全**:可以使用 `ReaderWriterLockSlim` 或其他同步机制来确保多线程环境下的安全性。
2. **LRU 策略**:可以使用 `LinkedList` 来记录最近访问的顺序,每次访问或添加时将节点移动到链表头部。
3. **过期清理**:可以通过定时器或手动调用的方式定期清理过期项。

---

### 问题扩展

1. 如果需要支持分布式缓存(例如 Redis),你会如何修改当前的设计?
2. 如何优化缓存的性能,特别是在高并发场景下?

---

这道题考察了候选人在多线程编程、数据结构选择、性能优化以及缓存设计方面的综合能力。希望对你有帮助!

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-06-15 10:52:01

下一篇: c#题例-2025-06-14 23:45:30

精华推荐