上次熟悉了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我也只是自己专研,我很希望有人能与我讨论,不好的地方也请各路大神帮忙指出,谢谢。