Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-16 15:52:24

好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、性能优化和并发控制等高级主题:

---

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

**问题描述:**

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

1. **添加/更新键值对**:如果键已经存在,则更新其值;如果键不存在,则插入新的键值对。
2. **获取值**:根据键获取对应的值。如果键不存在,返回默认值(`default(TValue)`)。
3. **删除键值对**:根据键删除对应的键值对。
4. **过期机制**:每个键值对可以设置一个过期时间(以秒为单位)。如果超过指定的时间未被访问或修改,则自动从缓存中移除。
5. **清理机制**:定期检查并清理所有已过期的键值对。

**要求:**

- 必须是线程安全的,允许多个线程同时操作缓存。
- 使用高效的并发数据结构(如 `ConcurrentDictionary` 或其他)来实现。
- 提供一种机制来定期清理过期的键值对(可以使用定时器或其他方式)。
- 考虑性能优化,尽量减少锁的使用频率和范围。

**接口定义:**

```csharp
public class ThreadSafeCache
{
// 添加或更新键值对,并可选设置过期时间(秒)
public void Set(TKey key, TValue value, int? expirationInSeconds = null);

// 获取键对应的值,如果键不存在或已过期,返回 default(TValue)
public TValue Get(TKey key);

// 删除指定键的键值对
public void Remove(TKey key);

// 清理所有已过期的键值对
public void CleanupExpiredItems();
}
```

**提示:**

- 可以使用 `ConcurrentDictionary>` 作为底层存储,其中 `CacheItem` 包含值、过期时间和最后访问时间。
- 定时清理可以使用 `System.Timers.Timer` 或 `Task.Delay` 实现。
- 需要考虑如何最小化锁的使用,例如通过读写锁(`ReaderWriterLockSlim`)或无锁算法。

---

### 示例用法:

```csharp
var cache = new ThreadSafeCache();

cache.Set("key1", "value1", 10); // 设置 key1,过期时间为 10 秒
cache.Set("key2", "value2");

Console.WriteLine(cache.Get("key1")); // 输出 "value1"
Console.WriteLine(cache.Get("key3")); // 输出 null (默认值)

cache.Remove("key2");

// 模拟等待 11 秒后
Thread.Sleep(11000);
Console.WriteLine(cache.Get("key1")); // 输出 null,因为已过期
```

---

这道题目考察了以下几个方面:
1. 对 C# 并发编程的理解(如 `ConcurrentDictionary`、锁机制等)。
2. 对缓存过期机制的设计能力。
3. 性能优化意识(如何减少锁的使用)。
4. 多线程环境下的代码安全性。

希望这道题目能够满足你的需求!如果有需要进一步调整的地方,请告诉我。

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

上一篇:无

下一篇: c#题例-2025-06-16 10:19:06

精华推荐