当前位置:编程学习 > C#/ASP.NET >>

asp.net三层架构中缓存层如何搭建,求大神指教~!

新手一枚,才学的缓存,想问下各位大神,三层架构中加一层缓存层,该如何搭建?求大神指点下 ASP.NET Cache --------------------编程问答-------------------- 缓存层 是工具层
我有在BLL中用缓存,也有在UI层中用缓存 --------------------编程问答-------------------- 由前台缓存和后台缓存
前台页面缓存的话 和三层无关,你在相应的输出页面  指定If-Modified-Since头和输出304类型即可
如果是后台缓存的话 建议在DAL层取数据的时候操作,就是在BLL像DAL取数据时如果DAL发现有缓存 就直接返回缓存,如果没有再从新从数据库取数据,这样就不会影响BLL业务层的变更 --------------------编程问答--------------------
 /// <summary>
        /// 建立缓存
        /// </summary>
        public static object TryAddCache(string key, object value, CacheItemPriority priority)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null);
            else
                return null;
        }

        /// <summary>
        /// 建立定时不访问便移除的缓存
        /// </summary>
        public static object TryAddCache(string key, object value, TimeSpan slidingExpiration, CacheItemPriority priority)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, Cache.NoAbsoluteExpiration, slidingExpiration, priority, null);
            else
                return null;
        }

        /// <summary>
        /// 建立缓存,并在移除时执行事件
        /// </summary>
        public static object TryAddCache(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemovedCallback)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, absoluteExpiration, slidingExpiration, priority, onRemovedCallback);
            else
                return null;
        }


        /// <summary>
        /// 移除缓存
        /// </summary>
        public static object TryRemoveCache(string key)
        {
            if (HttpRuntime.Cache[key] != null)
                return HttpRuntime.Cache.Remove(key);
            else
                return null;
        }

        /// <summary>
        /// 移除键中带某关键字的缓存
        /// </summary>
        public static void RemoveMultiCache(string keyInclude)
        {
            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
            while (CacheEnum.MoveNext())
            {
                if (CacheEnum.Key.ToString().IndexOf(keyInclude.ToString()) >= 0)
                    HttpRuntime.Cache.Remove(CacheEnum.Key.ToString());
            }
        }

        /// <summary>
        /// 移除所有缓存
        /// </summary>
        public static void RemoveAllCache()
        {
            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
            while (CacheEnum.MoveNext())
            {
                HttpRuntime.Cache.Remove(CacheEnum.Key.ToString());
            }
        }
--------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Web;
using System.Web.Caching;

namespace BLL
{
    public class Caches
    {
        /// <summary>
        /// 建立缓存
        /// </summary>
        public static object TryAddCache(string key, object value, CacheItemPriority priority)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null);
            else
                return null;
        }

        /// <summary>
        /// 建立定时不访问便移除的缓存
        /// </summary>
        public static object TryAddCache(string key, object value, TimeSpan slidingExpiration, CacheItemPriority priority)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, Cache.NoAbsoluteExpiration, slidingExpiration, priority, null);
            else
                return null;
        }

        /// <summary>
        /// 建立缓存,并在移除时执行事件
        /// </summary>
        public static object TryAddCache(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemovedCallback)
        {
            if (HttpRuntime.Cache[key] == null && value != null)
                return HttpRuntime.Cache.Add(key, value, null, absoluteExpiration, slidingExpiration, priority, onRemovedCallback);
            else
                return null;
        }


        /// <summary>
        /// 移除缓存
        /// </summary>
        public static object TryRemoveCache(string key)
        {
            if (HttpRuntime.Cache[key] != null)
                return HttpRuntime.Cache.Remove(key);
            else
                return null;
        }

        /// <summary>
        /// 移除键中带某关键字的缓存
        /// </summary>
        public static void RemoveMultiCache(string keyInclude)
        {
            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
            while (CacheEnum.MoveNext())
            {
                if (CacheEnum.Key.ToString().IndexOf(keyInclude.ToString()) >= 0)
                    HttpRuntime.Cache.Remove(CacheEnum.Key.ToString());
            }
        }

        /// <summary>
        /// 移除所有缓存
        /// </summary>
        public static void RemoveAllCache()
        {
            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
            while (CacheEnum.MoveNext())
            {
                HttpRuntime.Cache.Remove(CacheEnum.Key.ToString());
            }
        }
    }
}

Cache类代码! --------------------编程问答--------------------
引用 2 楼 yyl8781697 的回复:
由前台缓存和后台缓存
前台页面缓存的话 和三层无关,你在相应的输出页面  指定If-Modified-Since头和输出304类型即可
如果是后台缓存的话 建议在DAL层取数据的时候操作,就是在BLL像DAL取数据时如果DAL发现有缓存 就直接返回缓存,如果没有再从新从数据库取数据,这样就不会影响BLL业务层的变更


那如果我只是想缓存 一个页面上的某部分html代码呢~ --------------------编程问答--------------------
引用 5 楼 moonwrite 的回复:
Quote: 引用 2 楼 yyl8781697 的回复:

由前台缓存和后台缓存
前台页面缓存的话 和三层无关,你在相应的输出页面  指定If-Modified-Since头和输出304类型即可
如果是后台缓存的话 建议在DAL层取数据的时候操作,就是在BLL像DAL取数据时如果DAL发现有缓存 就直接返回缓存,如果没有再从新从数据库取数据,这样就不会影响BLL业务层的变更


那如果我只是想缓存 一个页面上的某部分html代码呢~


看你的网站使用何种编写方式了
比如:
1:用ajax,该html片段自成立一个页面,再前台加载该页面显示即可实现片段缓存(用iframe也可以),这种方式对SEO不是很友好
2:可以放入静态变量中,这样方便,但是过期时间不好控制
3:可以使用缓存数据库,比如memcached,redis等,需要第三方软件的配合
4:如果4L的代码可行的话 不也可以缓存html片段吗,不过没使用过。。。

纯属个人想法哈
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,