Redis学习日志【三、jedis+struts2】

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

发布了24 篇原创文章 · 获赞 3 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章