`

一个简单的缓存使用

阅读更多

背景:
    今晚遇到一个高手,高一开始编程,获得全国编程大赛三等奖,现在上大二,大部分是自学,因为是兴趣。好像是软件工程专业。最近刚发布了自己独立完成的论坛,用Java做的,说是自己写的框架 + Struts,论坛的亮点就是一个字——快,两个字——很快,三个字——相当快。采用的技术是全Model缓存+查询缓存,用的是淋漓尽致。在浏览的时候确实是很快。 (PS:这样的大学生少见啊!)
    网址:http://www.smsj.net.cn/web/wzb32/java.html(网站已关2009-05-03)

    服务器开启时间:10:00到23:00(挂在自己的电脑上的,好像是昨天晚上刚开通)
    给了我个缓存模拟的小例子(其实缓存就是一个Map),确实挺好的

public class CacheDome {	
		 static Map cache = new HashMap(); //说白了缓存就是个map		
		 public static void main(String[] args) {		
			User u1 = getUser(1);  //u1是从数据库中取出来的		
			User u2 = getUser(1); //u2是从缓存中取出来的		
			User u3 = getUser(1); //u3也是从缓存中取出来的		
			updateUser(u1);		
			User u4 = getUser(1); //u3是从数据库中取出来的	
		}		
		public static User getUser(int id) {		
			String key = User.class.getName() + id;		
			User user = (User) cache.get(key); //从缓存中去取		
			if (user == null) { //如果缓存中没找到就从数据库中去取,然后再放入缓存中			
				 user = getFormDB(); 			
				 cache.put(key, user);		
			}		
			return user;	
		}		
		public static void updateUser(User user) {		
			updateDB(user); //更新数据库		
			String key = User.class.getName() + user.getId();		
			cache.remove(key); //移除缓存中的User	
		}
	}

  

 我用到我的小例子上:ArticleDAOImpl.java

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.demo.article.entity.Article;
import com.demo.article.dao.ArticleDAO;

public class ArticleDAOImpl extends HibernateDaoSupport implements ArticleDAO {

	private Map<String, Article> cacheArticle = new HashMap<String, Article>();
	private Map<String, List<Article>> cacheArticles = new HashMap<String, List<Article>>();
	/**
	 * 增
	 * */
	public void add(Article article) {		
		getHibernateTemplate().save(article);
		String key = Article.class.getName() + "list";
		cacheArticles.remove(key);	//当添加一条记录时,要删除缓存(map),才能得到最新数据list
	}
	/**
	 * 删
	 * */
	public void delete(Integer id) {
		Article article = (Article) getHibernateTemplate().get(Article.class, id);
		if(article != null){
			getHibernateTemplate().delete(article);
			String key = Article.class.getName() + "list";
			cacheArticles.remove(key);	//当删除一条记录时,要删除缓存(map),才能得到最新数据list
		}
	}
	/**
	 * 修改
	 * */
	public void update(Article article) {		
		getHibernateTemplate().update(article);
		String key = Article.class.getName() + article.getId();
		String key_list = Article.class.getName() + "list";
		cacheArticle.remove(key);		//删除缓存中的该条记录
		cacheArticles.remove(key_list);	//删除缓存中的list
	}
	/**
	 * 根据ID得到该文章记录
	 * 注:经测试想要显示Acrticle的category对象一般是left join fetch a.category
	 *    但是当web.xml中配置org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
	 *    就可以不用添加left了,但在本类中测试是错误的,在进行web浏览时正常显示
	 * */
	/**
	 * 查一条记录
	 **/
	public Article findById(final Integer id) {
		String key = Article.class.getName() + id;
		Article article = cacheArticle.get(key);						//从缓存中查找
		if(article == null){											//缓存中没有就从数据库中查找
			article = (Article) getHibernateTemplate().get(Article.class, id);
			cacheArticle.put(key, article);								//存到缓存中
		}
		return article;
	}	
	/**
	 * 查询全部
	 * */
	@SuppressWarnings("unchecked")
	public List<Article> queryAll() {									//和上面的一样
		String key = Article.class.getName() + "list";
		List<Article> articles = cacheArticles.get(key);
		if(articles == null){
			articles = getHibernateTemplate().find("from Article");
			cacheArticles.put(key, articles);
		}
		return articles;
	}	
	
	//测试
	public static ArticleDAOImpl getFromApplicationContext(ApplicationContext ctx) {
		return (ArticleDAOImpl) ctx.getBean("articleDAO");
	}
	public static void main(String args[]){
		@SuppressWarnings("unused")
		ArticleDAOImpl dao = getFromApplicationContext(new ClassPathXmlApplicationContext("spring/applicationContext.xml"));
		
	}
}

 

 

3
5
分享到:
评论
7 楼 konggang1988 2009-04-01  
zhangzi 写道

konggang1988 写道
我怎么感觉只有查询的时候缓存有用,增删改看不出来 增删改后数据改变,是删除缓存的(如果缓存存在的话) 删除缓存是为了,在查询时得到最新数据(从数据库中查)。我只是演示了查询缓存。略知一二,共同交流!

哦,增删改只是为让查询出来的数据正确
6 楼 zhangzi 2009-03-31  
konggang1988 写道

我怎么感觉只有查询的时候缓存有用,增删改看不出来

增删改后数据改变,是删除缓存的(如果缓存存在的话)
删除缓存是为了,在查询时得到最新数据(从数据库中查)。我只是演示了查询缓存。略知一二,共同交流!
5 楼 konggang1988 2009-03-30  
我怎么感觉只有查询的时候缓存有用,增删改看不出来
4 楼 zhangzi 2009-03-21  
heipn 写道

我不知道是否我没看懂,hiberate自带了缓存系统,也可以接第三方的缓存系统,再一个如何保证缓存中数据的线程安全? 不过学生能写这样还是很强,加油哦

Hibernate缓存是在一次请求中的,请求完后会清除,而这种的是第一次是从数据库中读取,以后都是从缓存中读取。
3 楼 heipn 2009-03-18  
我不知道是否我没看懂,hiberate自带了缓存系统,也可以接第三方的缓存系统,再一个如何保证缓存中数据的线程安全?

不过学生能写这样还是很强,加油哦
2 楼 yananay 2009-03-18  
这,这,,,,,,,,
1 楼 charles751 2009-03-18  
一个学生能写出这样的代码,真是厉害,呵呵

相关推荐

    spring简单的缓存

    参考链接提供的CSDN博客文章《[Spring简单缓存实现](http://blog.csdn.net/maoyeqiu/article/details/50238035)》中,作者详细介绍了如何在Spring项目中实现缓存,包括配置、注解使用以及注意事项,是一个很好的学习...

    Go-一个简单高效用于go的LRU缓存包

    在Go语言中,有许多库可以帮助开发者实现LRU缓存,其中"Go-一个简单高效用于go的LRU缓存包"就是一个这样的工具。这个包为Go程序员提供了简单、高效的LRU缓存接口,便于在应用程序中管理和优化数据存储。 在Go语言中...

    一个简单至极的php缓存类

    第一个参数是缓存秒数,第二个参数是缓存路径,根据需要配置。 默认情况下,缓存时间是 3600 秒,缓存目录是 cache/ 3、读取缓存 $value = $cache-&gt;get('data_key'); 4、写入缓存 $value = $cache-&gt;put('data_key',...

    php一个简单的文件缓存类.zip

    要构建一个简单的文件缓存类,首先我们需要定义几个核心方法: 1. **`__construct()`**:构造函数,初始化类的属性,例如设置缓存目录、默认缓存有效期等。 2. **`get($key)`**:根据键获取缓存内容。首先检查文件...

    cache/ehcache缓存使用

    以下是一个简单的示例,展示了如何在Java代码中使用Ehcache: ```java import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; public class JDBCEhcache { public static void main(String[] ...

    java map 实现缓存技术

    缓存中的数据不是永久存储的,通常会有一个有效期,过了这个期限,数据就会被自动清除,以防止占用过多内存或保持数据的新鲜度。这里的时间Out参数表示缓存的超时时间,将其乘以1000是为了将秒转换为毫秒,因为Java...

    mybatis一级缓存和二级缓存简单示例

    创建一个简单的 MyBatis 示例,包括一级缓存和二级缓存的使用: 1. 定义实体类 `User` 和对应的 `UserMapper` 接口。 2. 编写 `UserMapper.xml` 映射文件,开启二级缓存配置。 3. 在 Service 层中调用 `UserMapper`...

    Java缓存技术的使用实例

    Java缓存技术是提高应用程序性能的关键工具,尤其是在处理大量数据时。...这个“Java缓存技术的使用实例”提供了一个动手学习的机会,加深了对缓存工作原理的理解,并为实际开发中的缓存使用提供了参考。

    swift-CarlosSwift实现一个简单但灵活的缓存

    "Carlos"是一个专门为Swift设计的缓存库,它提供了一个简单但功能强大的解决方案,允许开发者根据需求定制不同的缓存策略。本文将深入探讨Carlos库的核心特性、用法以及其在实际开发中的应用场景。 首先,Carlos的...

    Python-一个采用Python开发的简单缓存服务器

    标题中的"Python-一个采用Python开发的简单缓存服务器"揭示了我们将探讨如何使用Python构建这样一个系统。 缓存服务器是提高应用性能的关键技术之一,它通过存储常用数据或计算结果,减少对原始数据源(如数据库或...

    Go-kache一个使用go编写的简单内存中缓存

    Go-kache是一个基于Go语言实现的轻量级内存缓存库,它的设计目标是提供一个简单易用且高效的缓存解决方案。在理解Go-kache的工作原理和应用之前,我们需要先了解缓存在计算机科学中的基本概念。 缓存是一种存储技术...

    C#缓存的使用

    下面是一个简单的C#内存缓存小程序,展示了如何插入、获取和移除缓存项: ```csharp using System.Runtime.Caching; class Program { static void Main() { var cache = MemoryCache.Default; // 插入缓存 ...

    缓存、缓存算法和缓存框架简介.docx

    在上述描述的面试场景中,Programmer One 使用哈希表实现了一个简单的缓存,但并未考虑到缓存的扩展性和管理策略。缓存的容量并非无限,因此当达到其最大容量时,必须采取一定的策略来决定哪些数据应该被移除以腾出...

    memcached缓存使用演示

    - **缓存策略选择**:根据业务需求选择合适的缓存系统,如简单缓存场景可选用Memcached,复杂数据结构或需持久化的场景则考虑Redis。 - **缓存失效策略**:除了LRU外,还可以采用Time-To-Live(TTL)、手动清除等方式...

    iBATIS缓存的使用方法

    本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL映射文件中应用这些缓存设置。 #### 一、缓存的基本概念 缓存是存储数据的一种临时区域,目的是减少重复查询数据库...

    ASimpleCache一个简单的缓存框架.zip

    总之,ASimpleCache是一个为Java开发设计的简易缓存框架,通过其提供的API和示例代码,开发者可以方便地在自己的项目中实现高效的缓存功能。同时,通过深入学习源码,还能了解到更多关于缓存系统设计和实现的技巧,...

    etCache 是一个基于 Java 的缓存系统封装,提供统一的 API 和注解来简化缓存的使用.rar

    当前有四个实现,RedisCache、TairCache、CaffeineCache和一个简易的LinkedHashMapCache,要添加新的实现也是非常简单。它的特性: 通过统一的API访问Cache系统 通过注解实现声明式的方法缓存 通过注解创建并配置...

    缓存使用场景,介绍redis/内存等缓存的使用场景,更新策略等

    缓存刷新策略是缓存使用场景中的一个重要概念。被动刷新是比较常用的刷新方式,存入缓存的数据会被设置一个过期时间。查询请求进来时,当缓存中有数据时则从缓存取,缓存中没有数据时,则从数据库查询数据,并更新至...

    winform简单缓存类实例

    在.NET Framework中,WinForm应用程序通常使用C#来开发,而缓存机制是提升应用程序性能的一个重要手段。本文将深入探讨如何在WinForm应用中实现一个简单的缓存类,主要基于System.Web.Caching命名空间中的Cache对象...

    面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答?.docx

    解决缓存穿透可使用布隆过滤器,将所有可能存在的数据哈希到一个位图中,无效的查询会被拦截;另一种简单方法是将空结果也缓存,但设置较短的过期时间。 3. **缓存预热** 缓存预热是在系统上线前或重启后,提前...

Global site tag (gtag.js) - Google Analytics