从缓存中获取 _info 表中的所有数据
从缓存中获取数据的具体实现方式取决于你使用的缓存机制和编程环境。以下是一个通用的思路和示例代码,展示如何从缓存中获取数据。假设你正在使用一个内存缓存(如
IMemoryCache 在 ASP.NET Core 中)来存储数据库表 _info 的数据。1. 缓存数据的存储
在将数据存储到缓存之前,你需要从数据库中查询数据,并将其存入缓存。以下是一个示例:
示例代码(C# + ASP.NET Core)
csharp复制
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
public class EDRProcessInfoService
{
private readonly IMemoryCache _cache;
private readonly string _connectionString;
public EDRProcessInfoService(IMemoryCache cache, string connectionString)
{
_cache = cache;
_connectionString = connectionString;
}
public List<EDRProcessInfo> GetAllDataFromCache()
{
// 缓存键
const string cacheKey = "_info";
// 尝试从缓存中获取数据
if (_cache.TryGetValue(cacheKey, out List<EDRProcessInfo> cachedData))
{
// 缓存命中,直接返回缓存数据
return cachedData;
}
// 缓存未命中,从数据库中查询数据
var data = LoadDataFromDatabase();
// 将数据存入缓存
_cache.Set(cacheKey, data, TimeSpan.FromMinutes(30)); // 缓存有效期为 30 分钟
return data;
}
private List<EDRProcessInfo> LoadDataFromDatabase()
{
var result = new List<EDRProcessInfo>();
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var command = new SqlCommand("SELECT * FROM _info", connection);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var item = new EDRProcessInfo
{
Id = reader.GetInt32(reader.GetOrdinal("Id")),
ProcessName = reader.GetString(reader.GetOrdinal("ProcessName")),
// 其他字段...
};
result.Add(item);
}
}
}
return result;
}
}
public class EDRProcessInfo
{
public int Id { get; set; }
public string ProcessName { get; set; }
// 其他字段...
}
2. 从缓存中获取数据
在上述代码中,
GetAllDataFromCache 方法会尝试从缓存中获取数据。如果缓存中没有数据,则从数据库中加载数据,并将其存入缓存。关键点:
-
缓存键:使用一个唯一的键(如
"_info")来标识缓存中的数据。 -
缓存有效期:设置一个合理的缓存有效期(如 30 分钟),以确保数据不会过时。
-
数据库查询:如果缓存未命中,则从数据库中查询数据,并将其存入缓存。
3. 使用缓存的好处
-
性能提升:减少了对数据库的频繁查询,降低了数据库的负载。
-
响应速度:缓存数据可以直接从内存中读取,响应速度更快。
-
可扩展性:减轻了数据库的压力,使系统更容易扩展。
4. 其他缓存机制
如果你使用的是其他缓存机制(如 Redis、Memcached 或分布式缓存),实现方式类似,但需要使用相应的客户端库来操作缓存。例如:
使用 Redis 缓存(C# + StackExchange.Redis)
csharp复制
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
public class EDRProcessInfoService
{
private readonly IDatabase _redisDatabase;
private readonly string _connectionString;
public EDRProcessInfoService(IDatabase redisDatabase, string connectionString)
{
_redisDatabase = redisDatabase;
_connectionString = connectionString;
}
public List<EDRProcessInfo> GetAllDataFromCache()
{
const string cacheKey = "_info";
// 尝试从 Redis 缓存中获取数据
var cachedData = _redisDatabase.StringGet(cacheKey);
if (!cachedData.IsNull)
{
// 缓存命中,反序列化数据
return JsonConvert.DeserializeObject<List<EDRProcessInfo>>(cachedData);
}
// 缓存未命中,从数据库中加载数据
var data = LoadDataFromDatabase();
// 将数据序列化后存入 Redis 缓存
_redisDatabase.StringSet(cacheKey, JsonConvert.SerializeObject(data), TimeSpan.FromMinutes(30));
return data;
}
private List<EDRProcessInfo> LoadDataFromDatabase()
{
var result = new List<EDRProcessInfo>();
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var command = new SqlCommand("SELECT * FROM _info", connection);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var item = new EDRProcessInfo
{
Id = reader.GetInt32(reader.GetOrdinal("Id")),
ProcessName = reader.GetString(reader.GetOrdinal("ProcessName")),
// 其他字段...
};
result.Add(item);
}
}
}
return result;
}
}
5. 总结
无论你使用哪种缓存机制,从缓存中获取数据的核心逻辑是:
-
尝试从缓存中获取数据。
-
如果缓存未命中,则从数据库中加载数据,并将其存入缓存。
-
设置合理的缓存有效期,以确保数据的时效性。
浙公网安备 33010602011771号