缓存

MyCache

使用缓存主要是为解决什么问题,现在的应用在开发的时候虽然使用了数据库连接池但是这种方式依然扛不住大量用户同时进行一个数据库操作的情况。举例来说,现在没执行一次操作基本上都要到数据库张查询两次才能完成。当用户量非常多的时候没有什么数据库能够扛得住这么多的访问量。因此需要缓存机制来解决数据库的瓶颈问题。
在优化缓存的时候首先记住一点使用查询操作的用户要远远多于执行其他数据库操作的人数。
自定义一个缓存的实现类,将查询到的结果集对象放到一个Map集合中,当用户在查询结果的时候不用再从数据库中查找,而是先从Map集合中查找,如果有的话就返回给客户,如果没有的话再从数据库中查找,并将查找到的对象存到Map集合中,将查到的结果返回给客户。这个Map集合解释缓存。
public class MyCache() {
public staitc Map<String,Object> map = new HashMap<String,Object>();

public void put(Sting key, Object value) {
map.put();
}
public Object get(String key) {
map.get();
}
public void deletee(String key) {
map.del();
}
}
使用这种缓存的问题
1、无法实现数据库的数据同步
当修改了自定义缓存中的某个数据的时候,当用户再次查询的时候虽然数据库中的值变了,但是缓存中存放的值依然是 原来的数据,没有更新。
2、内存占用,没法定时清理不常用的数据的内存,这样就会导致数据长期占用内存,而不释放,终有一天,服务器的内存消耗完毕就会冗机。



EhCache

为了实现自动清理内存中长期不用的数据并且解决数据库不同步问题,因此内存清理算法来解决内存占用的问题,现在集中常见的内存清理算法:
FIFO:本着先进先出的原则,当内存空间塞满的时候需要再往里面填入数据的时候就将第一个元素从内存中释放出来,将新插入的元素放进去。这种方法的缺点是当被移除的元素是经常使用的时候就造成了重复的移除添加操作,浪费服务器的资源。
LRU:这种清理算法是根据最近使用时间段内,使用频率最低的来清理出内存,踢掉内存中最不常用的数据所占用的空间,配合这种清理算法,还会有定时清理内存,不管这篇内存空间中的数据是否经常使用。只要过了缓存的存活时间就直接清理。

生产级缓存:
Ehcache

首先使用之前先导入jar包。
使用该缓存是要配置缓存的配置文件。

name用来设置缓存的名字,maxElementInMemory用来设置内存中最大存放的元素数量。eternal用来设置存放的数据是否永久存储,如果存放的数据基本不变的时候可以讲此选项值设置为true。timeToIdleSecond设置元素的闲置时间,当元素在指定的限制时间内还没有被使用的时候就会被清理出内存。闲置时间等于当前时间减去最后访问时间。timeToLiveSeconds用来设置存活时间。当超过存活时间的时候无论是佛经常使用都会被清理出内存。overflowToDisk用来设置当内存中存放最大元素数量已经存不下的时候是否允许将数据写到磁盘中。默认值为true,当写上true的时候存入的对象就必须实现序列化接口。

创建缓存的步骤:
//这个步骤用来读取配置文件
CacheManager cacheManger = new CacheManager();
//获取缓存的名字
Ehcache cache = cacheManager.getCache(cachename);
//创建元素
Element element = new Element(String key,Object value):
cache.put(element);
//获取元素
Element element = cache.get(key);
if(element != null) {
String value = (String) element.getObjectValue();
} else {

}
创建一个工具类应用,这个CacheManager对象应该是一个单例。
在DAO中使用缓存来解决查询单个值的情况,对于查询多个值的情况需要使用缓存的话通过使用含有索引的主键来查询到所有对象。或者对于差性能多个的情况干脆不创建缓存。
当有对数据库进行修改操作的时候就将修改的元素从缓存中移除。


MemCached


支持分布式缓存的一个服务器,使用这种缓存技术的时候首先得装一个服务器
-d install 安装服务器
-d start 启动服务
端口号:11211
使用这种缓存服务器的时候需要客户端支持,常见的Java客户端
spymemcached
xmemcached
使用客户端的时候,性能跟服务器没关系,跟客户端有关系
使用方法:
创建一个客户端
MemcachedClient client = new MemcachedClient(AddrUtil.getAddress(127.0.0.1:11211));
创建客户端的时候构造方法中可以换入一个存放分布式服务器地址的List集合。
//向缓存中加入数据 三个参数分别是键、过期时间、值
client.add(key,expires,value);
//获取指定的值
String value = (String) client.get(key);
删除
client.delete(key);

另一个缓存组件
redis 阿里使用的缓存组件就是这个。

将集合添加到缓存中

第一种方案就是获取集合的ID集合,由于ID是有索引的,根据索引来查找对应的元素,效率比普通的select from效率要高。
第二种方法就是不对集合进行缓存

根据ID来加载对象
Book book = bookDao.finById(id);

一个访问频率非常高的首页如何进行性能提升。
Java中的框架FreeMaker框架
动态生成静态页面。

忘记密码

无论用户名输入是否正确,都要给用户提示,邮件发送成功,不提示用户输入的用户名数据库中不存在这样的错误。
忘记密码的例子
封号的例子
三次密码错误,冬季多长时间
只要和时间有关的操作,都可以使用缓存来进行操作。


原文地址:https://www.cnblogs.com/shininguang/p/4859803.html