如何不使用数据库缓存,还达到实时更新

运维 数据库运维
不使用缓存,更新耗时,效率低,作者又不希望使用依赖项。那么如何能在不使用数据库缓存依赖项,又能达到实时更新的效果呢?请看下文...

先说下当前项目的场景:

后台人员1天不定时的,添加新闻和视频图片10条左右,数量不多

不使用缓存,回和数据库打交道,非常耗时,造成效率低,尤其是在数据量非常庞大的情况下

可是加了缓存,加多少时间的缓存?新闻要保证实时更新,一发布立刻显示出来

微软给出了解决方法,数据库缓存依赖项,但是貌似只能用在SQL上,而且要配置些东西;

还有,并不透明~ 一些东西看不到

这里提供另一种方法:

先说下大概思路,在所有查找操作时,都把结果插入 cache 在对数据库有操作时(增删改) 删除cache

有了思路,开始解决问题,这里会遇到两个问题

*** : 所有查找时,cache建怎么定义,保证不重复呢

第二:微软没有提供删除所有cache的方法,只有cache["键值名"].Remove(); 而没有removeall();

下面上代码和解决办法 以及思路

  1. #region##根据条件得到新闻  
  2.      /// <summary>  
  3.      /// 根据条件得到新闻  
  4.      /// </summary>  
  5.      /// <param name="tableName"></param>  
  6.      /// <param name="whereStr"></param>  
  7.      /// <param name="topCount"></param>  
  8.      /// <returns></returns>  
  9.      public List<CmsDemoModels.NewsInfo> GetByCondition(string whereStr, string topCount)  
  10.      {  
  11.          string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);  
  12.          if (HttpRuntime.Cache[cacheKey] != null)  
  13.          {  
  14.              return HttpRuntime.Cache[cacheKey] as List<CmsDemoModels.NewsInfo>;  
  15.          }  
  16.          else 
  17.          {  
  18.              //从数据库里查找并插入缓存  
  19.              using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())  
  20.              {  
  21.                  List<NewsInfo> newsList=ns.GetByCondition(whereStr, topCount);  
  22.                  HttpRuntime.Cache.Insert(cacheKey,newsList, null, DateTime.Now.AddDays(1), TimeSpan.Zero);  
  23.                  return newsList;  
  24.              }  
  25.          }  
  26.      } 

看上面的代码

  1. string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount); 

我定义这缓存键值不重复的方法是,用当前类+方法名+所有参数名的组合,来保证***性这样把所有查询的方法 以及查询结果都缓存起来了~

  1. public static void ClearOutputCache()  
  2.     {  
  3.         //移除自定义缓存  
  4.         foreach (var item in HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray())  
  5.         {  
  6.             HttpRuntime.Cache.Remove((string)item.Key);  
  7.         }  
  8.    }  

上面的方法,是删除所有缓存

可是又有个问题,我们有视频表、图片表、新闻等等,我现在更新个新闻,就要删除所有的缓存,其实只用删除所有新闻的缓存就行了

  1. #region 删除缓存  
  2.  
  3.  /// <summary>  
  4.  /// 根据名字开头删除缓存  
  5.  /// </summary>  
  6.  /// <param name="StartName">缓存名字开头</param>  
  7.  public void RemoveAllCache(string StartName)  
  8.  {  
  9.      //移除自定义应用程序缓存  
  10.      DictionaryEntry[] de = HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray();  
  11.      foreach (var item in de)  
  12.      {  
  13.          string cacheKey = item.Key.ToString();  
  14.          if (cacheKey.StartsWith(StartName))  
  15.          {  
  16.              HttpRuntime.Cache.Remove((string)item.Key);  
  17.          }  
  18.      }  
  19.  }  
  20.  
  21.  #endregion 

稍微改进下 效率又大大的提高了

当我们数据库有变化时,比如添加了个新闻调用

  1. p.RemoveAllCache(GetType().ToString()); 
  1. #region##添加新闻  
  2.      /// <summary>  
  3.      /// 添加新闻  
  4.      /// </summary>  
  5.      /// <param name="info"></param>  
  6.      /// <returns></returns>  
  7.      public int Add(CmsDemoModels.NewsInfo info)  
  8.      {  
  9.  
  10.          using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())  
  11.          {  
  12.              info.ViewCount = 0;  
  13.              info.State = 0;  
  14.              info.SortIndex = GetMaxSort() + 1;  
  15.              int i= ns.Add(info);  
  16.              PubClass p = new PubClass();  
  17.              p.RemoveAllCache(GetType().ToString());  
  18.              return i;  
  19.          }  
  20.      }  
  21.      #endregion 

这样就把所有以GetType().ToString() 开头的删除掉了~~ 实现新闻的删除新闻的,视频的删除视频的

PS: 这里新闻添加和查找都是在BLL层下的NewInfoManager类下,所以他们的 GetType().ToString() 会一样大概思路就这样

有什么问题,可以留言交流,欢迎讨论~

原文链接:http://www.cnblogs.com/wlflovenet/archive/2011/06/30/Cache.html

【编辑推荐】

  1. 关于商城系统中商品类别的设计
  2. 关于商城系统中商品类别的设计(续篇)
  3. 数据库是怎么进行压缩的?
  4. 知道数据库设计的三大范式吗
  5. 数据库应用呈三大趋势 DBA要如何应对

 

责任编辑:艾婧 来源: wlf的博客
相关推荐

2014-12-22 09:48:58

DBCAOracle 11

2022-04-14 09:00:00

开发数据库工具

2021-02-05 14:40:56

overflow: h代码前端

2010-05-13 11:45:56

MySQL数据库

2018-03-28 09:26:43

数据库缓存层优化

2021-03-19 07:40:22

缓存数据库日志

2010-06-10 10:50:17

MySQL数据库

2011-03-02 13:54:39

MySQL数据库

2021-01-13 05:23:27

缓存数据库高并发

2017-05-25 08:52:08

SQL Server数据库

2015-04-22 14:41:04

云迁移Redis缓存数据模型调整

2024-01-09 16:02:11

数据库流服务大数据

2019-10-08 15:54:42

SQL数据库技术

2009-03-19 10:08:09

C#数据库查询

2019-07-11 08:45:00

MySQL数据库缓存

2011-07-28 17:02:59

MYSQL数据库跨表更新数据并合

2011-04-18 16:03:28

SSB数据库

2021-08-02 10:53:28

PythonMySQL数据库

2011-06-07 17:01:44

2016-12-08 17:14:03

数据库性能
点赞
收藏

51CTO技术栈公众号