c#题例-2025-06-16 15:52:24
日期: 2025-06-16 分类: AI写作 14次阅读
好的!以下是一道专家级别的 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
- 定时清理可以使用 `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
标签:AI写作
上一篇:无
精华推荐