redis缓存实际应用
小编这里的Redis安装的话是直接安装在小编电脑上的虚拟机上的,所以需要ip进行连接。
接下来小编就直接开始操作了,Redis应用分一下几个步骤
1.创建maven项目,导入所需要的依赖,小编这里就直接展示Redis的依赖了
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.使用java连接到我们的Redis
Jedis jedis = new Jedis(ip, port);// ip 是要访问的主机ip ,port 是端口
jedis.auth("123");//密码
jedis.ping();//测试是否成功,返回pong ,则表示成功
jedis.select(0);//切换数据库
3.小编的jsp界面
<%--
Created by IntelliJ IDEA.
User: hu
Date: 2019/9/19
Time: 20:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>博客首页</title>
</head>
<body>
博客首页
拿取数据的方式:${msg}<br>
拿去到的数:${currentUser}
</body>
</html>
小编的后台
package com.hu;
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 hu
* @site
* @company
* @create 2019-09-1920:51
*/
@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.198.128",6379);//指定Redis服务Host和port
jedis.auth("123456");//连接密码
// 从缓存中获取当前登录的用户信息
Map<String,String> currentUser = jedis.hgetAll("currentUser");
if(currentUser !=null && currentUser.size()>0){
req.setAttribute("msg","从缓存中获取数据");
req.setAttribute("currentUser",currentUser);
}
else{
// 第一次登录,第一次访问首页数据
req.setAttribute("msg","从数据库中获取数据");
String name = "zhangsan";
String pass = "123456";
// 接下来把数据库中的对象存储到缓存中去
jedis.hset("currentUser","name","zhangsan");
jedis.hset("currentUser","pass","123456");
// 此时能获取到值原因是上面已经将数据存储到缓存中
currentUser = jedis.hgetAll("currentUser");
req.setAttribute("currentUser",currentUser);
}
req.getRequestDispatcher("home.jsp").forward(req,resp);
}
}
界面展示
注意Idea下JDK版本和Tomcat版本冲突:
报错信息
19-Sep-2019 20:17:06.984 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext
javax.management.RuntimeOperationsException: Exception invoking method manageApp
解决方案:
jdk:1.8
Tomcat:tomcat-9.0.14
将Tomacat版本退到:tomcat-8.0.23问题解决;
实例运用
将 lucene+freemarker 的那个工程首页改成读取 Redis 数据
-
1、首页第一次是读取数据库,后面读取缓存(在没有增删改的情况)
-
2、增删改的时候,要顺带更新缓存,下一次再次访问首页要保证redis中数据跟mysql数据是一致
代码体现:
首页,第一次,读取数据库,再次查看时,可直接读取缓存(在没有增删改的情况下)
//获取redis中的数据
String blogListJsonStr = jedis.get("blogList");
//如果redis中有值
if(blogListJsonStr != null && blogListJsonStr.length() > 0) {//redis有值时
// 使用redis
request.setAttribute("blogList", JSON.parse(blogListJsonStr));
}else {//第一次
//使用数据库
//从数据库中查询数据
List<Map<String, Object>> blogList = this.blogDao.freemarker_list(title, null);
//放进缓存
jedis.set("blogList", JSON.toJSONString(blogList));
//存作用域
request.setAttribute("blogList", blogList);
}
在增删改的时候,要更新缓存,下一次再次访问首页时必须保证redis中数据跟mysql数据保持一致
//增加
public String add() {
HttpServletRequest request = ServletActionContext.getRequest();
Map<String,String[]> parameterMap = request.getParameterMap();
try {
//清空缓存
jedis.del("blogList");
//加入数据库
this.blogDao.save(parameterMap);
} catch (Exception e) {
e.printStackTrace();
}
return "blogList";
}
//删除
public String del() {
try {
HttpServletRequest request = ServletActionContext.getRequest();
//清空缓存
jedis.del("blogList");
// 数据库中删除博客
this.blogDao.del(request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
return "blogList";
}
- redis持久化
1、redis的数据何时消失
2、何时redis与mysql数据会同步一次
redis默认采取的是rdb持久方式
rdb持久化策略:
比如说redis存储了1000个key,当其中100key对应的值在60s发生了改变,那么久将redis与
mysql的数据进行同步一次。同步的机制,在redis.confg中进行设置
aof持久化策略
redis每改变内存中一条数据,就会将内存与mysql数据同步一次,并且记录日志。安全性更高,
数据不易丢失
rdb与aof结合使用
- redis集群(单机多节点集群,多台Linux机器集群)
主从模式
redis集群最少要三台主机(多台机器集群)
通常公司会至少使用6台(主从模式)
在不使用集群时:是将所有静态数据放到一台Linux主机的内存中。
当数据量过大,一台机器的内存不足。那么会采用多台机器进行分散存储,将多台机器进行集群。