上次熟悉了jedis的使用,接下來慢慢的將struts2,spring框架加上去,更加熟練使用。這次我們寫一個簡單的用redis實現的點贊功能。用redis實現點贊並非只是因爲點贊好做。而是點贊這種操作簡單,但是高併發嚴重的操作,如果是關係型數據庫。很容易導致數據庫奔潰,而這正好突出了nosql的優勢,由於是在緩存中操作,能高速且安全的操作。
首先,將redis持久化。具體方法請看redis學習日誌【二、redis+jedis】
一、struts2的環境搭建
想必大家對struts2的環境搭建十分熟悉,再次我便不贅述了。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.action.extension" value="action,do,,"/>
<package name="default" namespace="/" extends="json-default">
<action name="attentionAction_*" class="com.yc.web.actions.AttentionAction" method="{1}">
<result name="success" type="json">
<param name="root">
jsonModel
</param>
</result>
</action>
</package>
</struts>
界面js(我使用的是ajax局部刷新方案)
<script type="text/javascript">
$(function(){ //界面加載完成後查詢redis中贊和踩的數據,修改界面上的
$.ajax({
type:"POST",
url:"attentionAction_findInfo",
dataType:'JSON',
success: function(data){
if(data.code==1){
$("#numcai").html(data.obj.cai);
$("#numzan").html(data.obj.zan);
}else{
alert(data);
}
}
});
});
function doAny(doWhat){ //贊或踩,具體執行的方法根據傳入的對象的id確定
var method=$(doWhat).attr("id");
alert(method);
$.ajax({
type:"POST",
url:"attentionAction_"+method,
dataType:'JSON',
success: function(data){
if(data.code==1){
alert(data.obj);
$("#numcai").html(data.obj);
}else if(data.code==0){
alert(data.obj);
$("#numzan").html(data.obj);
}else{
alert(data);
}
}
});
}
</script>
html(這裏因爲是ajax方案,所以不使用submit而是button且方法名不能叫submit()被坑得都醉了T.T)
<body>
<form id="myform" name="myform" method="post">
<input type="button" id="zan" name="zan" onclick="doAny(this)" value="贊"/><a id="numzan">0</a>人贊
<input type="button" id="cai" name="cai" onclick="doAny(this)" value="踩"/><a id="numcai">0</a>人踩
</form>
</body>
AttentionAction.java
package com.yc.web.actions;
import java.util.HashMap;
import java.util.Map;
import com.yc.bean.JsonModel;
import com.yc.biz.AttentionBiz;
import com.yc.biz.impl.AttentionBizImpl;
public class AttentionAction {
private JsonModel jsonModel;
private AttentionBiz attentionBiz;
//點贊
public String zan(){
attentionBiz=new AttentionBizImpl();
int zannum=attentionBiz.zan();
jsonModel=new JsonModel();
jsonModel.setCode(0);
jsonModel.setObj(zannum);
return "success";
}
//踩
public String cai(){
attentionBiz=new AttentionBizImpl();
int cainum=attentionBiz.cai();
jsonModel=new JsonModel();
jsonModel.setCode(1);
jsonModel.setObj(cainum);
return "success";
}
//查詢贊和踩的信息
public String findInfo(){
Map<String,Integer> map=new HashMap<String,Integer>();
attentionBiz=new AttentionBizImpl();
map=attentionBiz.findInfo();
jsonModel=new JsonModel();
jsonModel.setCode(1);
jsonModel.setObj(map);
return "success";
}
public JsonModel getJsonModel() {
return jsonModel;
}
public void setJsonModel(JsonModel jsonModel) {
this.jsonModel = jsonModel;
}
}
AttentionDaoImpl
public class AttentionDaoImpl implements AttentionDao {
private static final String ZAN="zan";
private static final String CAI="cai";
private RedisUtil redisUtil=new RedisUtil();
@Override
public int zan() {
Jedis jedis=redisUtil.getJedis(); //getJedis可以去到一個已持久化的jedis
int numzan=0;
if(jedis.get(ZAN)==null){ //
jedis.set(ZAN, "1"); //如果redis中沒有zan的數據,創建(容錯)
}else{
jedis.incr(ZAN); //incr()方法會自增該數據的value
}
numzan=Integer.parseInt(jedis.get(ZAN)); //get方法得到的是String型,需類型轉換。
return numzan;
}
@Override
public int cai() {
Jedis jedis=redisUtil.getJedis(); //getJedis可以去到一個已持久化的jedis
int numzan=0;
if(jedis.get(CAI)==null){
jedis.set(CAI, "1");
}else{
jedis.incr(CAI);
}
numzan=Integer.parseInt(jedis.get(CAI));
return numzan;
}
@Override
public Map<String, Integer> findInfo() {
Jedis jedis=redisUtil.getJedis(); //getJedis可以去到一個已持久化的jedis
Map<String, Integer> map=new HashMap<String,Integer>();
map.put(ZAN,Integer.parseInt(jedis.get(ZAN)));
map.put(CAI,Integer.parseInt(jedis.get(CAI)));
return map;
}
}
如此簡單地struts+jedis的一個小案例就完成了。由這個項目也能看出來jedis真的十分方便。如果是關係型數據庫,還得連接數據庫,寫sql語句,還得等他跑。我測試過redis點贊與關係型數據庫點讚的操作速度對比,快得還是蠻明顯的。
學習redis我也只是自己專研,我很希望有人能與我討論,不好的地方也請各路大神幫忙指出,謝謝。