先去緩存中查,如果沒有存到緩存中
簡單的map 緩存(緩存就是鍵值對)
package com.kaishengit.utils.cache;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.Map;
/**
* @author Wgs
* @version 1.0
* @create:2017/10/24
*/
@Repository
public class SimpleCache {
private static Map<String, Object> cacheMap = new HashMap<>();
/**
* 獲取對象
*
* @param key
* @return
*/
public static Object get(String key) {
if (cacheMap.containsKey(key)) {
return cacheMap.get(key);
}
return null;
}
/**
* 設(shè)置緩存
* @param key
*
*/
public static void set(String key,Object value) {
cacheMap.put(key, value);
}
/**
* 刪除
*
* @param key
*/
public static void remove(String key) {
cacheMap.remove(key);
}
}
測試
/**
* 根據(jù)id查找對象
*
* @param userid
* @return
*/
@Override
public User findById(Integer userid) {
User user = (User) simpleCache.get("user:" + String.valueOf(userid));
if (user == null) {
user = userMapper.findById(userid);
simpleCache.set("user" + userid, user);
}else {
logger.debug("load user from cache.........................");
}
return user;
}
cache(注意insert update delete 需要刪除緩存)
測試
package test.java.com.kaishengit.service.impl;
import org.junit.Test;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Element;
import org.junit.Test;
/**
* @author Wgs
* @version 1.0
* @create:2017/10/24
*/
public class cacheTest {
@Test
public void testCache() {
CacheManager cacheManager = new CacheManager();
Ehcache ehcache = cacheManager.getEhcache("user");
//添加
Element element = new Element("user:1", "jack");
ehcache.put(element);
//刪除
//ehcache.removeAll();
//ehcache.remove("user:1");
//取值
Element e = ehcache.get("user:1");
System.out.println(e.getObjectValue());
}
}
Ehcache的使用
Ehcache
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.4.0</version>
</dependency>
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<ehcahe>
<!--
java.io.tmpdir 獲取當(dāng)前操作系統(tǒng)登錄用戶的臨時文件夾路徑
-->
<diskStore path="java.io.tmpdir"/>
<cache name="user"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="30"
overflowToDisk="true"
/>
<cache name="book"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="300"
overflowToDisk="false"
/>
</ehcahe>
工具類
package com.kaishengit.util;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Element;
import java.io.Serializable;
/**
* Ehcache工具類
*/
public class EhCacheUtil {
private static CacheManager cacheManager = new CacheManager();
public Ehcache getEhCache(String cacheName) {
return cacheManager.getCache(cacheName);
}
public void set(Ehcache ehcache,Serializable key,Serializable value) {
Element element = new Element(key,value);
ehcache.put(element);
}
public void set(String cacheName,Serializable key,Serializable value) {
Element element = new Element(key,value);
getEhCache(cacheName).put(element);
}
public void set(String cacheName,Object key,Object value) {
Element element = new Element(key,value);
getEhCache(cacheName).put(element);
}
public Object get(String cacheName,Serializable key) {
Element element = getEhCache(cacheName).get(key);
return element == null ? null : element.getObjectValue();
}
public Object get(Ehcache ehcache,Serializable key) {
Element element = ehcache.get(key);
return element == null ? null : element.getObjectValue();
}
public void removeAll(String cacheName) {
getEhCache(cacheName).removeAll();
}
public void removeAll(Ehcache ehcache) {
ehcache.removeAll();
}
public void remove(String cacheName,Serializable key) {
getEhCache(cacheName).remove(key);
}
public void remove(Ehcache ehcache,Serializable key) {
ehcache.remove(key);
}
}
Guava
// 發(fā)送激活用戶賬號的郵件,寫進去時間,如果沒人訪問就過期,有人訪問就延期時間
private static Cache<String, String> cache = CacheBuilder
.newBuilder()
.expireAfterWrite(6, TimeUnit.HOURS)
.build();
// 找回密碼token
private static Cache<String, String> passwordCache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.MINUTES)
.build();
// 限制操作pinlv
private static Cache<String, String> activeCache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
package com.kaishengit.service;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.kaishengit.dao.UserDao;
import com.kaishengit.entity.User;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class UserServiceWithGuava {
private UserDao userDao = new UserDao();
private static Cache<String,User> cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(10,TimeUnit.MINUTES)
.build();
public User findById(Integer id) {
User user = null;
try {
user = cache.get("user:" + id, new Callable<User>() {
@Override
public User call() {
return userDao.findById(id);
}
});
} catch (ExecutionException e) {
e.printStackTrace();
}
return user;
}
/*private static LoadingCache<String,User> cache = CacheBuilder
.newBuilder()
.maximumSize(100)
.expireAfterAccess(50, TimeUnit.SECONDS)
.build(new CacheLoader<String, User>() {
@Override
public User load(String key) {
UserDao userDao = new UserDao();
return userDao.findById(Integer.valueOf(key));
}
});
public User findById(Integer id) {
User user = cache.getUnchecked(id.toString()); //cache.get("user:"+id);
return user;
}*/
}
測試
// 發(fā)送激活用戶賬號的郵件,寫進去時間,如果沒人訪問就過期,有人訪問就延期時間
private static Cache<String, String> cache = CacheBuilder
.newBuilder()
.expireAfterWrite(6, TimeUnit.HOURS)
.build();
// 找回密碼token
private static Cache<String, String> passwordCache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.MINUTES)
.build();
// 限制操作pinlv
private static Cache<String, String> activeCache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
@Override
public User findByName(String username) {
return userMapper.findByUsername(username);
}
@Override
public User findByEmail(String email) {
return userMapper.finByEmail(email);
}
/**
* 注冊用戶
*
* @param user
* @throws UserExistException
*/
@Override
public void saveNewUser(User user) throws UserExistException {
User u = userMapper.findByUsername(user.getUsername());
if (u != null) {
throw new UserExistException("用戶名已經(jīng)存在");
}
user.setPassword(DigestUtils.md5Hex(user.getPassword() + salt));
user.setState(User.USERSTATE_UNACTIVE);
user.setAvatar(User.DEFAULT_AVATAR_NAME);
logger.info("鹽值:{}" + salt);
logger.info("加密后密碼是: {}", user.getPassword());
userMapper.saveNewUser(user);
// 創(chuàng)建線程發(fā)激活郵件
getThread(user);
}
/**
* 使用線程發(fā)送激活郵件
*
* @param user
*/
private void getThread(User user) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 發(fā)送激活郵件
String uuid = UUID.randomUUID().toString().replace("-", "");
String url = "http://localhost/user/active?_=" + uuid;
// 放入緩存等待6小時
cache.put(uuid, user.getUsername());
String html = "<h3>Dear " + user.getUsername() + ":</h3>請點擊<a href='" + url + "'>該鏈接</a>去激活你的賬號. <br> 凱盛軟件";
Email email = getEmail(smpt, port, username, password, formmail);
logger.info("郵箱:{}" + email);
EmailUtil.sendHtmlEmail(email, user.getEmail(), "用戶激活郵件", html);
}
});
thread.start();
}
/**
* 驗證token
*
* @param token
*/
@Override
public void activeUser(String token) throws ServiceException {
String userName = cache.getIfPresent(token);
logger.info("token: {}" + token);
if (token == null) {
throw new ServiceException("token無效或者過期");
} else {
User user = userMapper.findByUsername(userName);
if (user == null) {
throw new ServiceException("賬號不存在");
} else {
// 設(shè)置激活
user.setState(Statu.Active.getValue());
// 更新用戶
userMapper.update(user);
// 刪除緩存中的鍵對應(yīng)的值
cache.invalidate(token);
}
}
}
/**
* 用戶找回密碼
*
* @param sessionId 客戶端的sessionID,限制客戶端的操作頻率
* @param type 找回密碼方式 email | phone
* @param value 電子郵件地址 | 手機號碼
*/
@Override
public void funndpassword(String sessionId, String type, String value) {
if (activeCache.getIfPresent(sessionId) == null) {
if ("phone".equals(type)) {
// TODO 根據(jù)手機號找
}
if ("email".equals(type)) {
// 根據(jù)郵箱找
User user = userMapper.finByEmail(value);
if (user != null) {
// 開啟線程發(fā)郵件
getThread(value, user);
}
}
activeCache.put(sessionId, "xxxx");
} else {
throw new ServiceException("操作頻率過快吃挑,稍后再試");
}
}
/**
* 使用線程發(fā)送找回密碼
*
* @param value
* @param user
*/
private void getThread(String value, User user) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String uuid = UUID.randomUUID().toString().replace("-", "");
passwordCache.put(uuid, user.getUsername());
String url = "http://localhost/foundpassword/newpassword?token=" + uuid;
String html = user.getUsername() + "<<br>請點擊該<a href='" + url + "'>鏈接</a>進行找回密碼操作,鏈接在30分鐘內(nèi)有效";
Email email = getEmail(smpt, port, username, password, formmail);
logger.info("郵箱:{}" + email);
EmailUtil.sendHtmlEmail(email, value, "密碼找回郵件", html);
}
});
thread.start();
}