c#题例-2025-06-15 05:18:51
日期: 2025-06-15 分类: AI写作 23次阅读
好的!以下是一道专家级别的 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
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
标签:AI写作
精华推荐