码迷,mamicode.com
首页 > 其他好文 > 详细

自己动手写缓存Version1

时间:2014-10-13 18:54:32      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   os   ar   for   文件   sp   数据   


实现一个最简单最基本的缓存系统。


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

    }
}



测试结果如下:

bubuko.com,布布扣bubuko.com,布布扣


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

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

标签:blog   http   io   os   ar   for   文件   sp   数据   

原文地址:http://blog.csdn.net/q262800095/article/details/40047497

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!