Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-18 14:45:55

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

---

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

**题目描述:**

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

1. **添加/更新键值对**:提供方法 `Set(TKey key, TValue value)`,用于将键值对存储到缓存中。如果键已存在,则更新其值。
2. **获取值**:提供方法 `TValue Get(TKey key)`,用于根据键获取对应的值。如果键不存在,返回默认值(`default(TValue)`)。
3. **删除键值对**:提供方法 `Remove(TKey key)`,用于从缓存中删除指定的键值对。
4. **过期机制**:每个键值对可以设置一个过期时间(以秒为单位)。当键值对超过指定的时间后,自动从缓存中移除。
5. **线程安全**:确保在多线程环境下,缓存的操作是安全的。

**额外要求:**
- 使用 `ConcurrentDictionary` 或其他合适的并发集合来实现。
- 尽量减少锁的使用,避免性能瓶颈。
- 提供一个示例代码,展示如何使用该缓存系统。

---

### 示例代码框架

以下是部分代码框架,您可以在此基础上完成实现:

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

public class ThreadSafeCache
{
private readonly ConcurrentDictionary> _cache = new ConcurrentDictionary>();

public void Set(TKey key, TValue value, int expirationInSeconds = 0)
{
// TODO: 实现 Set 方法
}

public TValue Get(TKey key)
{
// TODO: 实现 Get 方法
return default(TValue);
}

public bool Remove(TKey key)
{
// TODO: 实现 Remove 方法
return false;
}

private class CacheItem
{
public T Value { get; }
public DateTime? ExpirationTime { get; }

public CacheItem(T value, DateTime? expirationTime)
{
Value = value;
ExpirationTime = expirationTime;
}

public bool IsExpired => ExpirationTime.HasValue && DateTime.UtcNow > ExpirationTime.Value;
}
}

// 测试代码
class Program
{
static void Main(string[] args)
{
var cache = new ThreadSafeCache();

// 添加键值对,设置过期时间为 5 秒
cache.Set("key1", "value1", 5);

// 获取键值对
Console.WriteLine(cache.Get("key1")); // 输出 "value1"

// 等待 6 秒后再次获取
Thread.Sleep(6000);
Console.WriteLine(cache.Get("key1")); // 应输出默认值 (null)

// 删除键值对
cache.Remove("key1");
}
}
```

---

### 解题提示

1. **过期机制**:
- 可以为每个缓存项添加一个 `DateTime? ExpirationTime` 属性。
- 在 `Get` 方法中检查当前时间是否已经超过 `ExpirationTime`,如果是,则移除该项。

2. **线程安全**:
- 使用 `ConcurrentDictionary` 来保证字典操作的安全性。
- 对于过期检查,可以通过定期任务或懒加载的方式清理过期数据。

3. **性能优化**:
- 避免全局锁,尽量使用局部锁或无锁操作。
- 如果需要定期清理过期数据,可以使用 `Timer` 或 `Task` 定时执行清理任务。

---

这道题目考察了候选人的多线程编程能力、并发集合的使用、以及缓存系统的实现经验。希望这对您有帮助!

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

上一篇:无

下一篇: c#题例-2025-06-18 09:12:19

精华推荐