redis
redis特點:
- redis命令是nosql的,什麼是nosql:
不按照標準規定的sql語句來操作數據庫 - redis能把數據存在內存中(eg:將數據庫中的數據存在內存中,防止再次查詢數據時消耗大量的資源和時間)
數據庫中的信息
uid uname
1 呵呵
2 小黃
3 小明
《--------------------------------------------------------------------》
//1.從redis中查詢
//1.1獲取jedis客戶端
Jedis jedis = JedisUtil.getJedis();
//1.2可使用sortedset排序查詢
Set<String> categorys = jedis.zrange("category", 0, -1);
System.out.println(categorys);
//2.判斷查詢的集合是否爲空
List<Category> list = null;
if (categorys==null || categorys.size()==0){
//3.如果爲空,從數據庫查詢,再將數據庫存入redis
//3.1從數據庫查詢
list = categoryDao.findAll();
//3.2將集合數據存到redis中的 catefory的key
for (int i = 0; i < list.size(); i++) {
jedis.zadd("category",list.get(i).getCid(),list.get(i).getCname());
}
jedis
操作redis的一個jar包
下面的連接工具其實是爲了有更好的代碼體驗
其實可以只需要創建
public Jedis() {
}
public Jedis(String host) {
super(host);
}
public Jedis(String host, int port) {
super(host, port);
}
public Jedis(String host, int port, int timeout) {
super(host, port, timeout);
}
public Jedis(String host, int port, int connectionTimeout, int soTimeout) {
super(host, port, connectionTimeout, soTimeout);
}
package cn.itcast.travel.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* Jedis工具類
*/
public final class JedisUtil {
private static JedisPool jedisPool;
static {
//讀取配置文件
InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
//創建Properties對象
Properties pro = new Properties();
//關聯文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//獲取數據,設置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}
/**
* 獲取連接方法
*/
public static Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 關閉Jedis
*/
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
BaseServlet
由於Servlet寫多了之後會出現代碼冗餘等問題,所以就可以直接通過一個路徑名來調用方法,達到簡化代碼的效果
BaseServlet的實現其實是:反射
當CategoryServlet類 extends BaseServlet
輸入的方法名會加入在路徑後面,反射就可以獲取這個名字,通過這個名字來調用CategoryServlet類方法
其次反射中如果用暴力反射,就要加上
method.setAccessible(true);
什麼是暴力反射呢?
getDeclaredMethod
(String name,...obj.class(可以爲空)
):獲取該名類的所有方法
Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
package cn.itcast.travel.web.servlet;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.獲取請求路徑
String uri = req.getRequestURI();
// System.out.println("UserServlet路徑:"+uri);// /travel/user/add
//2.獲取方法名
String methodName = uri.substring(uri.lastIndexOf('/') + 1);//add
// System.out.println(methodName);
//3.獲取方法對象Method
//誰調用我,this就是誰
// System.out.println(this);
try {
//忽略權限修飾符,獲取方法對象
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//暴力反射
//4.執行方法
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
package cn.itcast.travel.web.servlet;
import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;
import cn.itcast.travel.service.impl.CategoryServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/category/*")
//繼承於BaseServlet
<------------------------------------------------------------------>
//當訪問這個路徑時候就會給與findAll方法名
<------------------------------------------------------------------>
//例如/category/findAll
public class CategoryServlet extends BaseServlet {
private CategoryService service = new CategoryServiceImpl();
/**
* 查詢所有
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.調用service查詢所有
List<Category> cs = service.findAll();
//2.序列化json返回
/* ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString("cs");*/
writerValue(cs,response);
}
}
req.getRequestURI與req.getContextType區別
//1.獲取請求的URI路徑
String uri = req.getRequestURI();
輸出:/travel/user/add
//2.獲取請求的虛擬路徑
String contentPath = req.getContextType();
輸出:/travel