效果如下

注意:必须要开启redis服务器端

数据库

CREATE DATABASE heima; -- 创建数据库
USE heima; -- 使用数据库
CREATE TABLE province( -- 创建表
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL );
-- 插入数据
INSERT INTO province VALUES(NULL,'北京');
INSERT INTO province VALUES(NULL,'上海');
INSERT INTO province VALUES(NULL,'广州');
INSERT INTO province VALUES(NULL,'陕西');

jar包

jedis.properties

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

js包

加入redis缓存

目录结构

HTML网页

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>redis缓存+json</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function () {
//发送ajax请求,加载所有省份数据
$.get("provinceServlet",{},function (data) {
//json[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}] /*
1.获取select
2.遍历json数组
3.创建<option>
4.调用select的append追加option
*/
//1.获取select
var province=$("#province");
//2.遍历json数组
$(data).each(function () {
// 3.创建<option>
var option="<option id='"+this.id+"'>"+this.name+"</option>";
//4.调用select的append追加option
province.append(option);
});
});
});
</script>
</head>
<body>
<select id="province">
<option>---请选择省份---</option>
</select>
</body>
</html>

Servlet类

@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1.调用service查询
2.序列化(写)list为json
3.响应结果
*/
// //1.调用service查询
// ProvinceService service=new ProvinceServiceImpl();
// List<Province> list = service.findAll();
// //2.序列化(写)list为json
// ObjectMapper mapper=new ObjectMapper();
// String json = mapper.writeValueAsString(list);
//1.调用service查询
ProvinceService service=new ProvinceServiceImpl();
String json = service.findAllJson(); //System.out.println("json"+json);
//json[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}] //3.响应结果
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

Javabean

public class Province {
private int id;
private String name; public Province() {
} public Province(int id, String name) {
this.id = id;
this.name = name;
} @Override
public String toString() {
return "Province{" +
"id=" + id +
", name='" + name + '\'' +
'}';
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

dao

public interface ProvinceDao {
public List<Province> findAll();
}

dao Impl

public class ProvinceDaoImpl implements ProvinceDao {
private JdbcTemplate template=new JdbcTemplate(JDBCUtil.getDataSource());
@Override
public List<Province> findAll() {
String sql="select * from province";
List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
return list;
}
}

service

public interface ProvinceService {
public List<Province> findAll();
//redis缓存
public String findAllJson();
}

sevice Impl(核心)

public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao provinceDao=new ProvinceDaoImpl();
@Override
public List<Province> findAll() {
return provinceDao.findAll();
} /*
使用redis缓存
*/
@Override
public String findAllJson() {
//1.先从redis中查询数据
//1.1获取redis客户端连接
Jedis jedis = JedisUtil.getJedis();
String province_json = jedis.get("province");
//2判断province是否为空
if (province_json==null||province_json.length()==0){
System.out.println("redis没有数据 --- 查询数据库");
//2.1province为空,也就是redis没有数据 --- 查询数据库
List<Province> ps = provinceDao.findAll();
//2.2将ps 序列化为json,也就是写
ObjectMapper mapper=new ObjectMapper();
try {
province_json = mapper.writeValueAsString(ps);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//2.3 (不要忘记)将json数据存入到redis中
jedis.set("province",province_json);
//3.归还连接
jedis.close();
}else {
System.out.println("redis有数据 ---- 查询redis缓存");
//province不为空,也就是redis有数据 ---- 查询redis缓存
}
return province_json;
}
}

工具类

JDBCUtil
public class JDBCUtil {
private static DataSource ds;
static {
//读取配置文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
//创建Properties对象
Properties pro =new Properties();
try {
//获取关联
pro.load(is);
//2.初始化druid数据库连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
} }
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public void close(Connection conn, PreparedStatement ps){
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放资源
public void close(Connection conn, PreparedStatement ps, ResultSet rs){
close(conn,ps);
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JedisUtil
public class JedisUtil {
//工具类主要都是获取Jedis
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream is = JedisUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro=new Properties();
//关联文件
try {
pro.load(is);
} catch (Exception e) {
e.printStackTrace();
}
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
jedisPool=new JedisPool(pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}

druid.properties配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/heima?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password= # 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

jedis.properties配置文件

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

四、redis学习(案例)的更多相关文章

  1. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  2. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. redis学习教程四《管理、备份、客户端连接》

    redis学习教程四<管理.备份.客户端连接>  一:Redis服务器命令 Redis服务器命令 下表列出了与Redis服务器相关的一些基本命令. 序号 命令 说明 1 BGREWRITE ...

  4. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

  5. Spring Data Redis学习

    本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的,内容也比这里全.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 ...

  6. Redis学习十一:Redis的Java客户端Jedis

    一.安装JDK tar -zxvf jdk-7u67-linux-i586.tar.gz vi /etc/profile 重启一次Centos 编码验证 二.安装eclipse 三.Jedis所需要的 ...

  7. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  8. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  9. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

随机推荐

  1. PHP AJAX返回 "TEXT"

    例子:通过AJAX间接访问数据库,查出Nation表显示在页面上,并添加删除按钮 //首先在外层添加一个按钮,并造好表头 <div><input type="button& ...

  2. SSL及TLS

    SSL SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议. ...

  3. [eclipse]如何修改Eclipse编辑器的字体

    步骤如下, 菜单->"Window"->“Preference”->“General”->“Appearance”->“Colors & Fo ...

  4. flutter 切换tab后保留tab状态

    前言 最近在用flutter写一个小项目,在写主页面(底部导航栏+子页面)时遇到的一个问题:当点击底部item切换到另一页面, 再返回此页面时会重走它的initState方法(我们一般在initSta ...

  5. silverlight开发实例(Prism+MVVM+RIA)(二)--创建shell及用户登录

    在上篇基本说清了本项目的基本框架,下面开始说下项目的加载和shell.开始之前在建立EF时出现了一个问题,我在数据库中建立了视图,而在EF导入视图时出现因无法匹配主键导致无法导入视图的问题,检查发现是 ...

  6. 六十九:flask上下文之线程隔离的g对象的使用

    保存全局对象的g对象g对象是在整个flask应用运行期间都是可以使用的,并且也是和request一样,是线程隔离的,这个对象是专门用来存放开发者自己定义的一些数据,方便在整个flask程序中都可以使用 ...

  7. 基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction

    在Opencv中有个Viz模块,可以显示三维物体,还可以实现三维动画,本来是很好的东东,但是里面的函数.类的说明太过简单,始终不得要领.不过其中一个扩展功能非常好,就是你可以在vtk中设计自己的模型类 ...

  8. Vue实现点击时间获取时间段查询功能

    二话不说,先上图 实现如上代码: //获取本周第一天 showWeekFirstDay: function () { let Nowdate = new Date(); let WeekFirstDa ...

  9. Java组件介绍

    1.String string对象的不变性.被final关键字修饰. 使用charat方法替代startwith/endwith方法(提高性能) 使用buffer(方法同步,性能较差)和builder ...

  10. 【POJ - 3126】Prime Path(bfs)

    Prime Path 原文是English 这里直接上中文了 Descriptions: 给你两个四位的素数a,b.a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变.请你计算 ...