java操作Redis

首先,使用 redis ,要在 pom.xml 里添加依赖包:

<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

Demo1

Java 操作 redis,

string(字符串)
hash(哈希)
list(列表)

package com.liuwenwu;

import redis.clients.jedis.Jedis;

/

  • @author LWW
  • @site www.lww.com
  • @company
  • @create 2019-09-18 10:55
  • java 代码操作 Redis
  • 连接 Redis
  • 操作字符串
  • 操作哈希
  • 操作列表 list
    */
    public class Demo1 {
    public static void main(String[] args) {
    Jedis jedis
    = new Jedis("192.168.241.132",6379);
    jedis.auth(
    "123456");
    System.
    out.println(jedis.ping());

// 操作字符串
jedis.set("aaa","张三");
System.
out.println(jedis.get("aaa"));

// 操作哈希
jedis.hset("user1","uname","李四");
jedis.hset(
"user1","sex","");
System.
out.println(jedis.hgetAll("user1"));
System.
out.println(jedis.hget("user1", "uname"));

// 操作列表 list
jedis.lpush("hobby","a","b","c","d","e","f");
System.
out.println(jedis.lpop("hobby"));
System.
out.println(jedis.lpop("hobby"));
System.
out.println(jedis.rpop("hobby"));

}

}

模拟将数据对象存入 Redis 缓存

DemoServlet

package com.liuwenwu;

import redis.clients.jedis.Jedis;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

/

  • @author LWW

  • @site www.lww.com

  • @company

  • @create 2019-09-18 11:15
    */
    @WebServlet(
    "/getData")
    public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 首页第一次是读取数据库,后面读取缓存(在没有增删改的情况)
    Jedis jedis = new Jedis("192.168.241.132",6379);
    jedis.auth(
    "123456");
    // 从缓存中获取当前登录的用户信息
    Map<String,String> currentUser=jedis.hgetAll("currentUser");
    if (currentUser !=null && currentUser.size()>0){
    req.setAttribute(
    "msg","从缓存中获取数据");
    req.setAttribute(
    "currentUser",currentUser);

     }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
    

// 第一次访问首页数据
req.setAttribute("msg","从数据库中获取数据");
String uname
= "张三";
String upwd
= "123456";
// 接下来把数据库中的对应对象存储到缓存中
jedis.hset("currentUser","uname",uname);
jedis.hset(
"currentUser","upwd",upwd);
// 此时能获取到值得原因是上面已经将数据存储到缓存中
currentUser=jedis.hgetAll("currentUser");
req.setAttribute(
"currentUser",currentUser);

    }
    req.getRequestDispatcher(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/home.jsp</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).forward(req,resp);
}

}

项目实战

将数据库中的数据存入 Redis 缓存,查询从 Redis 中获取数据,提高性能

package com.liuwenwu.blog.web;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.Parameter.Request;

import com.alibaba.fastjson.JSON;
import com.liuwenwu.blog.dao.BlogDao;
import com.liuwenwu.blog.util.JsonUtils;
import com.liuwenwu.blog.util.LuceneUtil;
import com.liuwenwu.blog.util.PropertiesUtil;
import com.liuwenwu.blog.util.StringUtils;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import redis.clients.jedis.Jedis;

/

  • 专门将网页静态化的类,这里不涉及到 lucene
  • @author Administrator

*/
public class FreemarkerBlogAction {
private String title;
private String bid;
private BlogDao blogDao = new BlogDao();

</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Jedis jedis;


</span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> {
    jedis </span>=<span style="color: rgba(0, 0, 255, 1)">new</span> Jedis(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.241.132</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 128, 1)">6379</span><span style="color: rgba(0, 0, 0, 1)">);
    jedis.auth(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    jedis.</span><span style="color: rgba(0, 0, 255, 1)">select</span>(<span style="color: rgba(128, 0, 128, 1)">0</span>);  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">选择要操作的数据库</span>

}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getTitle() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> title;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setTitle(String title) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.title =<span style="color: rgba(0, 0, 0, 1)"> title;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getBid() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> bid;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setBid(String bid) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.bid =<span style="color: rgba(0, 0, 0, 1)"> bid;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String list() {
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        HttpServletRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> ServletActionContext.getRequest();
        </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (StringUtils.isBlank(title)) {

// 从 Redis 中获取数据
String bolgListALL =jedis.get("blogList");
if(bolgListALL != null && bolgListALL.length()>0) {
System.
out.println("使用 redis 缓存查询");
request.setAttribute(
"blogList", JSON.parse(bolgListALL));
}
else {
// 从数据库中查询数据
List<Map<String, Object>> blogList = this.blogDao.freemarker_list(title, null);
// 放入缓存
jedis.set("blogList", JSON.toJSONString(blogList));
//传到 jsp 页面
request.setAttribute("blogList", blogList);
System.
out.println("从数据中拿数据");
}
}
else {
SmartChineseAnalyzer analyzer
= new SmartChineseAnalyzer();
IndexReader indexReader
= DirectoryReader
.open(FSDirectory.open(Paths.
get(PropertiesUtil.getValue("indexPath"))));
IndexSearcher searcher
= new IndexSearcher(indexReader);
// 拿一句话到索引目中的索引文件中的词库进行关键词碰撞
Query query = new QueryParser("title", analyzer).parse(title);
TopDocs topDocs
= searcher.search(query, 100);
// 将碰撞出来的关键词给点亮
QueryScorer queryScorer = new QueryScorer(query);
// 以什么形式点亮关键词
Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'><b>", "</span></b>");
Highlighter highlighter
= new Highlighter(formatter, queryScorer);
List
<Map<String, Object>> blogList = new ArrayList<>();
Map
<String, Object> map = null;
ScoreDoc[] scoreDocs
= topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
map
= new HashMap<>();
Document doc
= searcher.doc(scoreDoc.doc);
map.put(
"bid", doc.get("bid"));
map.put(
"summary", doc.get("summary"));
String titleHighlighter
= doc.get("title");
if (StringUtils.isNotBlank(titleHighlighter)) {
titleHighlighter
= highlighter.getBestFragment(analyzer, "title", titleHighlighter);
}
map.put(
"title", titleHighlighter);
blogList.add(map);
}
indexReader.close();
request.setAttribute(
"blogList", blogList);
}
}
catch (Exception e) {
e.printStackTrace();
}
return "blogList";
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 这是刷新全局索引调用的方法
 * 
 * @return
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String refreshIndex() {
    IndexWriterConfig conf </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> IndexWriterConfig(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SmartChineseAnalyzer());
    Directory d;
    IndexWriter indexWriter </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 先将索引库中的索引文件清空</span>
        delTempChild(<span style="color: rgba(0, 0, 255, 1)">new</span> File(PropertiesUtil.getValue(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">indexPath</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)));
        
        d </span>= FSDirectory.open(Paths.<span style="color: rgba(0, 0, 255, 1)">get</span>(PropertiesUtil.getValue(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">indexPath</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)));
        indexWriter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> IndexWriter(d, conf);
        List</span>&lt;Map&lt;String, Object&gt;&gt; list = blogDao.freemarker_list(<span style="color: rgba(0, 0, 255, 1)">null</span>, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> map : list) {
            Document doc </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Document();
            doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, String.valueOf(map.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)), Field.Store.YES));
            doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span>, String.valueOf(map.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)), Field.Store.YES));
            doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (String) map.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
            doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (String) map.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
            indexWriter.addDocument(doc);
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
        e.printStackTrace();
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (InstantiationException e) {
        e.printStackTrace();
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IllegalAccessException e) {
        e.printStackTrace();
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
        e.printStackTrace();
    } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (indexWriter != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                indexWriter.close();
            }
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated catch block</span>

e.printStackTrace();
}
}
return "blogList";
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> delTempChild(File file) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (file.isDirectory()) {
        String[] children </span>= file.list();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取文件夹下所有子文件夹
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 递归删除目录中的子目录下</span>
        <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; children.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
            delTempChild(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> File(file, children[i]));
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 目录空了,进行删除</span>

file.delete();
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 修改前期
 * 
 * @return
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String perEidt() {
    HttpServletRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> ServletActionContext.getRequest();
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Map</span>&lt;String, Object&gt; map = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.blogDao.getBlogById(bid);
        request.setAttribute(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">map</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, map);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span> (InstantiationException | IllegalAccessException |<span style="color: rgba(0, 0, 0, 1)"> SQLException e) {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated catch block</span>

e.printStackTrace();
}
return "blogEdit";
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 添加博客
 * 
 * @return
 * @throws SQLException
 * @throws IllegalAccessException
 * @throws IllegalArgumentException
 * @throws SecurityException
 * @throws NoSuchFieldException
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String add() {
    HttpServletRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> ServletActionContext.getRequest();
    Map parameterMap </span>=<span style="color: rgba(0, 0, 0, 1)"> request.getParameterMap();
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将博客添加到数据库中 </span>
        <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.blogDao.add(parameterMap);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除Redis缓存</span>
        jedis.del(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">blogList</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取当前博客的id</span>
        <span style="color: rgba(0, 0, 255, 1)">int</span> maxId = (<span style="color: rgba(0, 0, 255, 1)">int</span>) <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.blogDao.maxId();
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加到lucene 索引库中</span>
        addIndex(maxId + <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, parameterMap);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将这篇博客进行网页静态化</span>
        addStaticPage(maxId + <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, parameterMap);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO: handle exception</span>

e.printStackTrace();
}
return "blogList";
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 这是删除博客的方法
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String del() {
    HttpServletRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> ServletActionContext.getRequest();
    Map parameterMap </span>=<span style="color: rgba(0, 0, 0, 1)"> request.getParameterMap();
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库中删除博客</span>
        <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.blogDao.del(request.getParameterMap());
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除Redis缓存</span>
        jedis.del(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">blogList</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除lucene中对应的文档</span>
        IndexWriter indexWriter =<span style="color: rgba(0, 0, 0, 1)"> getIndexWriter();
        indexWriter.deleteDocuments(</span><span style="color: rgba(0, 0, 255, 1)">new</span> Term(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, bid));
        indexWriter.forceMergeDeletes(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 强制删除</span>

indexWriter.commit();
indexWriter.close();
// 删除页面
new File("F:\java2\javaxl_lunece_freemarker\src\main\webapp\freemarker" + bid
+ ".html").delete();
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return "blogList";
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 这是修改的方法
 * 
 * @return
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String edit() {
    HttpServletRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> ServletActionContext.getRequest();
    Map parameterMap </span>=<span style="color: rgba(0, 0, 0, 1)"> request.getParameterMap();
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改数据库中的值</span>
        <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.blogDao.edit(request.getParameterMap());
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除Redis缓存</span>
        jedis.del(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">blogList</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改lucene中的文档值</span>
        IndexWriter writer =<span style="color: rgba(0, 0, 0, 1)"> getIndexWriter();
        Document doc </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Document();
        doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
        doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
        doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
        doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
        writer.updateDocument(</span><span style="color: rgba(0, 0, 255, 1)">new</span> Term(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)), doc);
        writer.close();
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改静态页(相同id会之间覆盖)</span>
        addStaticPage(JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), parameterMap);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO: handle exception</span>

e.printStackTrace();
}
return "blogList";
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 获取写入对象
 * 
 * @return
 * @throws IOException
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> IndexWriter getIndexWriter() throws IOException {
    IndexWriterConfig conf </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> IndexWriterConfig(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SmartChineseAnalyzer());
    Directory d </span>= FSDirectory.open(Paths.<span style="color: rgba(0, 0, 255, 1)">get</span>(PropertiesUtil.getValue(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">indexPath</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)));
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> IndexWriter(d, conf);
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 添加索引文件
 * 
 * @param id
 * @param parameterMap
 * @throws IOException
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> addIndex(String id, Map parameterMap) throws IOException {
    IndexWriter indexWriter </span>=<span style="color: rgba(0, 0, 0, 1)"> getIndexWriter();
    Document doc </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Document();
    doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, id, Field.Store.YES));
    doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> StringField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, id, Field.Store.YES));
    doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
    doc.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> TextField(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span>, JsonUtils.getParamVal(parameterMap, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">summary</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">), Field.Store.YES));
    indexWriter.addDocument(doc);
    indexWriter.close();
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
 * 这是添加静态页
 * 
 * @throws IOException
 * @throws TemplateException
 </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> addStaticPage(String id, Map parameterMap) throws IOException, TemplateException {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.创建配置类</span>
    Configuration configuration = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Configuration(Configuration.getVersion());
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.设置模板所在的目录</span>

configuration.setDirectoryForTemplateLoading(
new File("F:\java2\javaxl_lunece_freemarker\src\main\webapp\freemarker"));
// 3. 设置字符集
configuration.setDefaultEncoding("utf-8");
// 4. 加载模板 (这是在 刚刚设置好的 目录下面去找)
Template template = configuration.getTemplate("blogDetail.ftl");
Map map
= new HashMap<>();
Map
<String, Object> blog = new HashMap<>();
blog.put(
"bid", id);
blog.put(
"title", JsonUtils.getParamVal(parameterMap, "title"));
blog.put(
"releaseDate", new Date());
blog.put(
"btid", JsonUtils.getParamVal(parameterMap, "btid"));
blog.put(
"clickHit", JsonUtils.getParamVal(parameterMap, "clickHit"));
blog.put(
"content", JsonUtils.getParamVal(parameterMap, "content"));
map.put(
"blog", blog);
// // 6. 创建 Writer 对象
Writer out = new FileWriter(
new File("F:\java2\javaxl_lunece_freemarker\src\main\webapp\freemarker" +blog.get("bid")
+ ".html"));
// 7. 输出
template.process(map, out);
// 8. 关闭 Writer 对象
out.close();
}
}

测试效果:

从数据库获取数据需要的时间

从 Redis 中获取数据需要的时间