其实商品分类只与商品有关系,所以它也是整个项目中最简单的一个。
用户在进入主页时,需要将数据库中的商品分类加载到页面上显示,所涉及到的SQL语句也只有查询而已。但这里有个知识点就是在查询时用到了缓存。
因为商品分类一般情况下时不会变的,不需要每次进主页时都去数据库查询,可以使用缓存将第一次查询到的数据存下来,以后
直接取缓存即可。
缓存技术常用的有以下几种:
1、EHCache:它是Hibernate框架中使用的缓存技术,用作二级缓存。也是我们在这里用到的。
2、Memecache:只支持内存缓存
3、Redis:一个缓存服务器,也是我们以后在工作中经常会用到的缓存技术。
缓存这里会用到几种元素过期算法:
LRU:最近最少使用,先判断是否是最近,再判断是否是最少使用的。也是一种常用的算法。
LFU:最少使用
FIFO:先进先出
简单介绍一下这里用到的EHCache:
常用API:
核心类:CacheManager
读取配置文件:create()
获取缓存区:getCache()
获取缓存中的list:get()
获取缓存中的数据:getObejct()
把一个元素存到缓存中:put()
配置文件:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="C:/ehcache"/>
<cache
name="categoryCache"//缓存区名称
maxElementsInMemory="10000"//元素的总个数
eternal="false"//是否常驻内存
timeToIdleSeconds="120"//上面选否是才会触发
timeToLiveSeconds="120"//缓存存在的时间
overflowToDisk="true"//是否存到硬盘
maxElementsOnDisk="10000000"
diskPersistent="false"//服务器重启后是否数据是否生效
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"//元素过期使用的算法
/>
</ehcache>
具体的代码:
// 读取配置文件
CacheManager cacheManager = CacheManager.create(CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));
// 从配置文件中获取名称为categoryCache缓存区
Cache cache = cacheManager.getCache("categoryCache");
// 判断缓存中是否有list集合:
Element element = cache.get("list");
List<Category> list = null;
if(element == null){
// 缓存中没有数据
System.out.println("缓存中没有数据 ,查询数据库=====");
CategoryDao categoryDao = new CategoryDaoImpl();
list = categoryDao.findAll();
element = new Element("list",list);
cache.put(element);
}else{
// 缓存中已经存在数据
System.out.println("缓存中有数据 ,没有查询数据库=====");
list = (List<Category>)element.getObjectValue();
}
以上是对一个缓存技术做的简单的总结,但缓存也被称为nosql,就是存在缓存里的一般不会存在数据库,存在数据库里的
一般不会存在缓存里。所以这里没有选择这样做。
另一种方式是,将查询出的数据存在session域中,再次使用时从session域中获取,也可以达到节省资源的目的。所以一般
做法是在过滤其中查询出所有商品分类,存到session中,页面展示时直接获取session中的数据即可。