使用Java代码操作redis

mysql和redis

redis是非关系型数据库,操作redis数据内存可以像mysql一样建立连接,如下

mysql

  1. 导入pom依赖(mysql驱动包)
  2. 加载驱动Class.forName
  3. 建立连接(url,username,password)
  4. 获取预定义sql处理对象prepareStatement
  5. 执行prepareStatement
  6. 处理结果集
  7. 释放资源

redis

  1. 导入pom依赖(redis连接)
  2. 建立连接(jedis)
  3. 直接通过jedis实例去操作数据库

redis比mysql简洁很多,性能要比mysql要好(mysql存储在硬件,redis存储在内存)

Java访问redis

首先添加依赖

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

Java连接redis

      Jedis jedis = new Jedis(ip, port);
      jedis.auth("123456");//权限认证
      jedis.ping();
      jedis.select(0);//切换数据库

Java操作redis
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
zadd/zrevrange

Alt+Enter 抛异常
在这里插入图片描述
代码演示

package com.myy;

import redis.clients.jedis.Jedis;

/**
 * @author 熊贝贝
 * @site www.myy.com
 * @company
 * @create  2019-11-12 17:17
 */
public class Demo1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("49.235.95.238", 6379);
        jedis.auth("123456");

//        校验redis服务正常,然后通过jedis连接服务正常
//        System.out.println(jedis.ping()); //PONG

//        操作string
//        jedis.set("sname","yyqx");
//        System.out.println(jedis.get("sname"));

//        操作hash
         /* jedis.hset("user1","uname","熊贝贝");
        jedis.hset("user1","usex","女");
        jedis.hset("user1","age","17");*/
//        所有的值都在user类中
//        User user = new User("张三", "男", "湖南", "430523...");
     一切反射是从获取类对象开始
//        for (Field field : user.getClass().getDeclaredFields()) {
//            field.setAccessible(true); //打开访问权限
//            try {
//                System.out.println(field.getName() + ":" + field.get(user).toString());
//                jedis.hset("user1", field.getName(), field.get(user).toString());
//            } catch (IllegalAccessException e) {
//                e.printStackTrace();
//            }
//        }
//        System.out.println(jedis.hget("user1", "usex"));
//          Map<String,String> user1 = jedis.hgetAll("user1");
//        for (Map.Entry<String, String> entry : user1.entrySet()) {
//            System.out.println(entry.getKey() + ":" + entry.getValue());
//        }

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

其中演示hash用反射要用到的User类

package com.myy;

/**
 * @author 熊贝贝
 * @site www.myy.com
 * @company
 * @create  2019-11-13 10:47
 */
public class User {
    private String uname;
    private String usex;
    private String addr;
    private String code;

    public User() {
    }

    public User(String uname, String usex, String addr, String code) {
        this.uname = uname;
        this.usex = usex;
        this.addr = addr;
        this.code = code;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }


}

redis项目应用

在这里插入图片描述

1. 首页第一次是读取数据库,后面读取缓存(在没有增删改的情况)
模拟调用数据库
导入依赖

 <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
</dependency>

部署
在这里插入图片描述
代码:
BookListServlet

package com.myy;

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;

/**
 * @author 熊贝贝
 * @site www.myy.com
 * @company
 * @create  2019-11-13 12:01
 */
@WebServlet("/list")
public class BookListServlet 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 {
//        先从redis里面取书籍的前十条数据
        Jedis jedis = new Jedis("49.235.95.238", 6379);
        jedis.auth("123456");

//        字符串bookList存放的是,json数据字符串  List<Book>-->json
//        如果需要通过json数组串做jsp页面展示的话,需要将json数据字符串-->List<Book> jackSon
        String bookList = jedis.get("bookList");
        if(null == bookList || "".equals(bookList)){
//            此时意味着第一次查询,那么需要走数据库mysql
            System.out.println("先走数据库做书籍列表查询。。。");
            String list = "从mysql数据库中查询出十条数据,再转成json串。。";
            jedis.set("bookList",list);
            req.setAttribute("jspList","数据来源于mysql"+jedis.get("bookList"));

        }else{
//            意味着不是第一次查询,那么就可以数据返回了
            req.setAttribute("jspList","数据来源于redis:"+bookList);
        }
        req.getRequestDispatcher("bookList.jsp").forward(req,resp);

    }
}

bookList

<%--
  Created by IntelliJ IDEA.
  User: myy
  Date: 2019/11/13
  Time: 19:05
  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>
数据列表展示页数据:${jspList}
</body>
</html>

运行:
在这里插入图片描述
第一次当redis没有值的时候
在这里插入图片描述
非第一次
在这里插入图片描述

redis性能在不做分页的情况下(数据大概一万左右)比mysql比要好很多

2. 增删改的时候,要顺带更新缓存,下一次再次访问首页要保证redis中数据跟mysql数据是一致

现在数据基于1引发一个问题:当我第一次查询,查的是mysql,非第一次以后查的都是redis。当我做了增删改的时候,那么我始终查的都是redis,意味着增删改的内容不会从redis消失,redis与mysql的数据不同步。

解决方案,看图:
在这里插入图片描述
本次用的是mvc当时的项目代码基础上进行操作
mvc自定义框架(下)之增删改查
在这里插入图片描述
pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myy</groupId>
    <artifactId>redis01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>redis01 Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <servlet.version>4.0.1</servlet.version>
        <mysql.version>5.1.44</mysql.version>
        <jstl.version>1.2</jstl.version>
        <standard.version>1.1.2</standard.version>
        <tomcat-jsp.version>8.0.47</tomcat-jsp.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- 5.2、servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!--操作redis的驱动包-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!--后项目实战中加入-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>


        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>${standard.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jsp-api</artifactId>
            <version>${tomcat-jsp.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.0</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>redis01</finalName>
        <!--后加入项目实战resources-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

BookAction

package com.myy.web;

import com.myy.BookDao;
import com.myy.entity.Book;
import com.myy.framework.ActionSupport;
import com.myy.framework.ModelDriven;
import com.myy.util.PageBean;
import redis.clients.jedis.Jedis;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;
import java.util.List;

public class BookAction extends ActionSupport implements ModelDriven<Book>{
	private Book book = new Book();
	private BookDao bookDao = new BookDao();

	public Jedis redisList(){
		Jedis jedis = new Jedis("49.235.95.238",6379);
		jedis.auth("Myy724@2019");
		return jedis;
	}

	public String list(HttpServletRequest req,HttpServletResponse resp) {
		PageBean pageBean = new PageBean();
		pageBean.setRequest(req);
		try {
			List<Book> list = this.bookDao.list(book, pageBean);
			req.setAttribute("bookList", list);
			req.setAttribute("pageBean", pageBean);
		} catch (InstantiationException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		}

		return "list";

	}

	/**
	 * 跳转新增修改页面(新增修改页面是同一个)
	 * @param req
	 * @param resp
	 * @return
	 */
	public String preSave(HttpServletRequest req,HttpServletResponse resp) {
		//修改
//    	System.out.println(book.getBid());
//    	System.out.println(req.getParameter("bid"));
//    	book.setBid(Integer.valueOf(req.getParameter("bid")));
		if(book.getBid() != 0) {
			try {
				//数据回显的数据
				Book b = this.bookDao.list(book, null).get(0);
				req.setAttribute("book", b);
			} catch (InstantiationException | IllegalAccessException | SQLException e) {
				e.printStackTrace();
			}
		}

		return "edit";

	}

	/**
	 * 增加
	 * @param req
	 * @param resp
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 */
	public String add(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException {
		try {
			this.bookDao.add(book);
		} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		}
		return "toList";
	}

	/**
	 * 修改
	 * @param req
	 * @param resp
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 */
	public String edit(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException {
		try {
			this.bookDao.edit(book);
		} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		}
		return "toList";
	}

	/**
	 * 删除
	 * @param req
	 * @param resp
	 * @return
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 */
	public String del(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException {
		try {
			this.bookDao.del(book);
		} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		}
		return "toList";
	}

	public Book getModel() {
		return book;
	}
}

config.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://49.235.95.238/mybatis_ssm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
user=root
pwd=Myy724@2019

ConfigModelFactory
按照mvc的代码基础上是path,因为一直访问不到该mvc.xml所以就直接用定义死的来访问了。
在这里插入图片描述

第一次访问:
在这里插入图片描述
第二次访问:
在这里插入图片描述

速度要快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值