自己动手写缓存Version1
实现一个最简单最主要的缓存系统。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Text;
using System.Threading;
using System.Collections.Generic;
using System.Reflection; namespace ConsoleApplication1
{
public class MyCache<T> where T : new()
{
//缓存的数据
private List<T> data; private void SetData(List<T> data)
{
this.data = data;
} public List<T> GetData()
{
return this.data;
} //缓存过期时间
public int timeoutSecond; //缓存读取数据库的SQL
public string sql; /// <summary>
/// 启动缓存
/// </summary>
public void StartCache()
{
Console.WriteLine("缓存启动,開始初始化缓存数据..."); DataTable dt = GetDataFromDB(this.sql); SetData(ConvertHelper<T>.ConvertToList(dt)); Console.WriteLine("缓存启动,初始化数据完毕."); //定时更新缓存
TimerCallback tcb = new TimerCallback(UpdateCache);
Timer tmr = new Timer(tcb, null, timeoutSecond, timeoutSecond); } /// <summary>
/// 依据配置的SQL从数据库取得数据
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private DataTable GetDataFromDB(string sql)
{
//TODO:依据SQL从数据库取得数据
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("UserName", typeof(String)));
DataRow dr; int n = new Random().Next(6);
for (int i = 0; i < n; i++)
{
dr = dt.NewRow();
dr[0] = i;
dr[1] = "第" + i.ToString() + "个记录的内容";
dt.Rows.Add(dr);
}
return dt;
} /// <summary>
/// 更新缓存
/// </summary>
/// <param name="data"></param>
private void UpdateCache(object data)
{
DataTable dt = GetDataFromDB(this.sql);
List<T> newList= ConvertHelper<T>.ConvertToList(dt);
SetData(newList); Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("缓存更新完毕...");
foreach (T t in newList)
{
Console.WriteLine(t.ToString());
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection; namespace ConsoleApplication1
{
/// <summary>
/// DataTable转换为List的辅助类
/// </summary>
/// <typeparam name="T"></typeparam>
public class ConvertHelper<T> where T : new()
{
/// <summary>
/// 利用反射和泛型
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ConvertToList(DataTable dt)
{ // 定义集合
List<T> ts = new List<T>(); // 获得此模型的类型
Type type = typeof(T);
//定义一个暂时变量
string tempName = string.Empty;
//遍历DataTable中全部的数据行
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
//遍历该对象的全部属性
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;//将属性名称赋值给暂时变量
//检查DataTable是否包括此列(列名==对象的属性名)
if (dt.Columns.Contains(tempName))
{
// 推断此属性是否有Setter
if (!pi.CanWrite) continue;//该属性不可写,直接跳出
//取值
object value = dr[tempName];
//假设非空,则赋给对象的属性
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
//对象加入到泛型集合中
ts.Add(t);
} return ts; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; } public override string ToString()
{
return "ID:" + this.ID + ",UserName:" + this.UserName;
}
}
}
測试方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading; namespace ConsoleApplication1
{ class MyCacheTest
{
public static void Main()
{
MyCache<UserInfo> mycache = new MyCache<UserInfo>(); //5秒更新一次缓存
mycache.timeoutSecond = 5000;
mycache.sql = "";
//启动缓存
mycache.StartCache(); for (int i = 0; i < 100; i++)
{
//读取缓存
Console.WriteLine("_______________读取缓存,缓存内容例如以下:");
List<UserInfo> userList = mycache.GetData();
foreach (UserInfo userInfo in userList)
{
Console.WriteLine(userInfo.ToString());
} //1秒读取一次缓存
Thread.Sleep(1000); } } }
}
測试结果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTI2MjgwMDA5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这仅仅是一个最简单的缓存系统。下一个版本号希望可以实现例如以下功能:
1、支持key-value的查找、加入、删除。
2、加入缓存配置文件。
详细的配置文件例如以下:
<?xml version="1.0" encoding="utf-8" ? > <SQLCommands> <!--全部的用户缓存-->
<SQLCommand ListType="UserInfo" CommandString="SELECT * FROM UserInfo" CacheOverTime="0,5,0"></SQLCommand> <!--未处理的订单缓存-->
<SQLCommand ListType="UnHandleOrder" CommandString="SELECT * FROM OrderInfo WHERE Orderstatus = 0" CacheOverTime="0,5,0"></SQLCommand> </SQLCommands>
自己动手写缓存Version1的更多相关文章
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
- 自己动手写ORM的感受
之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...
- 自己动手写PHP MVC框架
自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍
将陆续上传本人写的新书<自己动手写处理器>(尚未出版).今天是第四篇.我尽量每周四篇 1.4 MIPS32指令集架构简单介绍 本书设计的处理器遵循MIPS32 Release 1架构,所以 ...
- 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图
我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...
- 动手写一个简单版的谷歌TPU-指令集
系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...
- 【原创】自己动手写控件----XSmartNote控件
一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...
- 【原创】自己动手写工具----XSmartNote [Beta 2.0]
一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...
随机推荐
- nginx -t "nginx: [warn] only the last index in "index" directive should be absolute in 6 "的问题解决
修改完nginx的配置文件之后,执行nginx -t命令提示"nginx: [warn] only the last index in "index" directive ...
- 关于CPU亲和性的测试
今天看到运维的同事在配置nginx的CPU亲和性时候,运维同事说他在所有的机器上都是按照8核的方式来配置worker进程的CPU亲和性的. 但我觉得就是有点不太对劲,就查了一下nginx的处理work ...
- web storm使用和配置
官网:http://www.jetbrains.com/webstorm/ webStorm,File=>setting=>JavaScript-Libraries How WebStor ...
- 手势识别官方教程(2)识别常见手势用GestureDetector+手势回调接口/手势抽象类
简介 GestureDetector识别手势. GestureDetector.OnGestureListener是识别手势后的回调接口.GestureDetector.SimpleOnGesture ...
- Centos4.3安装MySQL-python-1.2.3,出现error: command 'gcc' failed with exit status 1
在Linux Centos 4.3上安装MySQL-python-1.2.3的时候出现error: command 'gcc' failed with exit status 1, 具体原因是因为没有 ...
- bzoj3796
好像已经很久没有做后缀数组的题目,导致这种题一开始没想出来看到公共子串肯定想到后缀数组吧,但我都忘了最长公共子串怎么求了重要的性质:最长公共子串=max(h[i])名次相邻的两个后缀要分别属于s1,s ...
- BZOJ2351: [BeiJing2011]Matrix
2351: [BeiJing2011]Matrix Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 589 Solved: 171[Submit][S ...
- nvidia gpu fan speed control
nvidia在linux上控制风扇速度,需要起X,在无显示器链接的服务器上显得有点坑,这里汇总一下整个流程 1.nvidia-xconfig --cool-bits=4 生成xorg.conf 2.在 ...
- Journal.Today 1.0.0
我喜欢把一天的日记都放在一个文件中,而不是每次都新建一个文件. 写了一个脚本,检测当天是否已经新建日记,已经新建则打开,未新建则新建并打开. 其中我不太喜欢Wiz日记本来的标题命名方式,所以都 ...
- Maven详解 之 聚合与继承
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...