redis缓存实际应用

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主机的内存中。
当数据量过大,一台机器的内存不足。那么会采用多台机器进行分散存储,将多台机器进行集群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值