首页 > 代码库 > 自己动手写缓存Version1

自己动手写缓存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 = http://www.mamicode.com/data;>



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 = http://www.mamicode.com/dr[tempName];>




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);
 
            }
               
        }

    }
}



测试结果如下:


这只是一个最简单的缓存系统,下一个版本希望能够实现如下功能:

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