在现实生活中,当很多人去访问一个数据的时候,Mysql会很慢,甚至会挂掉,如果这里之间存在一个缓存的话,直接从内存中查询数据将会快很多。

这里就去模拟将redis看作是一个缓存,因为redis就是基于内存的数据库。

需要考虑的问题:

  1、客户端发起请求的时候,先去缓存中查询。

  2、如何设计redis中的Key-Value中的value的类型。

  3、怎么将将它看作缓存?设定过期时间,在缓存中查询到数据的情况下,将过期时间重置。

  4、如果在缓存中查询不到的情况下,去数据库中查询

  5、再将数据库查询到数据,添加到缓存中,并设定过期时间。

jedis.expire(key,60);   设置过期时间

package com.wyh.redis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis; import java.sql.*; /**
* 模拟redis是缓存
*
*
*/
public class RedisAsCache {
private Connection conn;
private Jedis jedis;
private weibo weibo; @Before
public void Cli(){ try {
//获取到数据库的连接信息
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
"root", "root"); //获取到redis的连接
jedis = new Jedis("master", 6379); System.out.println("成功连接到数据库。。"+conn);
System.out.println("成功连接到redis。。。"+jedis); } catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 读取数据
* 1、先去缓存(redis)中读取
* 2、若缓存中存在数据(redis),就直接返回数据,并更新过期时间
* 3、若缓存(redis)中没有,就去数据库(Mysql)中读取数据
* 4、若查询到数据,将结果缓存到redis中,并设置过期时间
* 5、返回结果
*/
@Test
public void readData(){
long start = System.currentTimeMillis(); int id = 2;
//先读取缓存 String tableName = "weibo:"; String key = tableName+id; String result = jedis.get(key); if(result!=null){
//更新过期时间
jedis.expire(key,60);
weibo = new weibo(id, result); System.out.println("缓存中查询到热门微博: "+weibo.getContext());
}else{ String sql = "select * from weibo where id=?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id); ResultSet resultSet = ps.executeQuery(); if(resultSet.next()){
int id1 = resultSet.getInt("id");
String context = resultSet.getString("context"); weibo = new weibo(id1,context);
System.out.println("数据库查询到热门微博: "+weibo.getContext());
} jedis.set(key,weibo.getContext());
jedis.expire(key,60); } catch (SQLException e) {
e.printStackTrace();
}
} long end = System.currentTimeMillis();
System.out.println(end-start); } @After
public void close(){
if(jedis!=null){
jedis.close();
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} } }
 

大数据之路Week10_day07 (JavaAPI 操作Redis 模拟将redis当作缓存,从Mysql数据库中查询数据)的更多相关文章

  1. MongoDB数据库中查询数据(下)

    MongoDB数据库中查询数据(下) 在find中,options参数值为一个对象,用来设置查询数据时使用的选项,下面我们来对该参数值对象中可以使用的属性进行介绍: 1. fields; 该属性值为一 ...

  2. 在MongoDB数据库中查询数据(上)

    在MongoDB数据库中查询数据(上) 在MongoDB数据库中,可以使用Collection对象的find方法从一个集合中查询多个数据文档,find方法使用方法如下所示: collection.fi ...

  3. flask再学习-思考之怎么从数据库中查询数据在页面展示!

    看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...

  4. 使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...

  5. mysql数据库中插入数据INSERT INTO SET的优势

    往mysql数据库中插入数据.以前常用 INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2); 如果在PHP程序中,就会写成如下示例(往商品库里增加商品) $sql = ...

  6. 使用sqoop将MySQL数据库中的数据导入Hbase

    使用sqoop将MySQL数据库中的数据导入Hbase 前提:安装好 sqoop.hbase. 下载jbdc驱动:mysql-connector-java-5.1.10.jar 将 mysql-con ...

  7. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

  8. JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...

  9. 使用grabit分析mysql数据库中的数据血缘关系

    使用grabit分析mysql数据库中的数据血缘关系 Grabit 是一个辅助工具,用于从数据库.GitHub 等修订系统.bitbucket 和文件系统等各种来源收集 SQL 脚本和存储过程,然后将 ...

  10. DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC SHRINKDATABASE收缩指定数据库中的数据文件和日志文件的大小

    收缩指定数据库中的数据文件和日志文件的大小.  Transact-SQL 语法约定 语法 DBCC SHRINKDATABASE ( database_name | database_id | 0 [ ...

随机推荐

  1. IOS打开对应后缀文件

    IOS打开对应后缀文件 通过ShareExtension打开 点击文件共享后出现的上方列表,如下图 在 info.plist 中添加 Document types <key>CFBundl ...

  2. .NET 8 中的 ASP.NET Core 指标与 Grafana 仪表板入门

    .NET 8 中的 ASP.NET Core 指标与 Grafana 仪表板入门 原文地址:https://devblogs.microsoft.com/dotnet/introducing-aspn ...

  3. Macos 安装md5sum、sha1sum、md5deep、sha1deep

    一.安装md5sum和sha1sum 方法一:brew 安装 # brew install md5sha1sum 方法二:编译安装 源码下载地址:http://www.microbrew.org/to ...

  4. Spring事务管理深度解析-从实践到原理

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种. 编程式事务 是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强,如下 ...

  5. mysql数据库 主从同步

    我们知道mysql数据库为了得到更高性能,一般会读写分离.主库用于写操作,比如用于执行的insert.update操作:从库用于读,也就是常见的select操作. 写数据都在主库(master)操作, ...

  6. Qt编写安防视频监控系统22-摄像机搜索

    一.前言 摄像机搜索模块是后面新增加的,这个模块很有必要,一开始做视频监控系统的时候,那时候还没有研究出来一套纯Qt底层通信的onvif类,也就前几个月搞出来了,支持搜索设备信息和云台控制,所以马上加 ...

  7. [转]OpenCV学习笔记(十五)——摄像机的标定和3D重建calib3D

    OpenCV学习笔记(十五)--摄像机的标定和3D重建calib3D OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标 翻译 搜索 复制

  8. 【记录】使用R2 CDN替换本地项目图片以加速图片加载

    将图片存储到 Cloudflare 的存储桶中,并通过其提供的公共 URL 来替换代码中的本地路径,可以减小项目中打包的图片文件体积 实现方法的详细步骤: 1. 上传图片到 Cloudflare 的存 ...

  9. vue基础2

    1.表单 表单里面有单选框,多选框,下拉框,文本域 vue单页应用 SPA:signal page application(单页应用) 多页面:1个url->1个html文件 多个url-> ...

  10. 记一次 contentInsetAdjustmentBehavior 引发的bug

    注:本文同步发布于微信公众号:stringwu的互联网杂谈记一次 contentInsetAdjustmentBehavior 引发的bug 1 背景 项目中使用到了UILable来展示相关的文本内容 ...