网站建设百度不通过,wordpress当前位置,o2o新零售系统,网页设计图片怎么占满相应位置Redis数据库测试实验 实验要求 1.新建一张user表#xff0c;在表内插入10000条数据。 2.①通过jdbc查询这10000条数据#xff0c;记录查询时间。 ②通过redis查询这10000条数据#xff0c;记录查询时间。 3.①再次查询这一万条数据#xff0c;要求根据年龄进行排序#…Redis数据库测试实验 实验要求 1.新建一张user表在表内插入10000条数据。 2.①通过jdbc查询这10000条数据记录查询时间。 ②通过redis查询这10000条数据记录查询时间。 3.①再次查询这一万条数据要求根据年龄进行排序mysql和redis各实现一次。 4.上面排序后的前5人可进行抽奖每人有一次抽奖机会抽奖奖品随意设计抽奖方式通过redis实现。 1.基本准备
先下载好jar包 在根目录下新建lib文件夹并将两个jar包移动到lib文件夹中
在IDEA中右键点击lib选择“添加为库” 两个jar包显示可展开即为成功。 2.mysql建立用户表user
CREATE TABLE user (id int primary key AUTO_INCREMENT,name varchar(10) COMMENT 姓名,age int COMMENT 年龄
) ; 3.为mysql和redis添加数据
1获取数据库连接并为mysql添加数据 //获取数据库连接public Connection getConnection() {System.out.println(获取数据库连接);String url jdbc:mysql://localhost:3306/homework;String username root;String password 123456;Connection conn null;try {conn DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return conn;} //mysql添加数据public void addMysql() {System.out.println(mysql添加数据);Connection conn null;PreparedStatement ps null;conn getConnection();try {Random random new Random();for (int i 0; i 10000; i) {String name Name i;int age random.nextInt(100) 1;ps conn.prepareStatement(INSERT INTO user (name,age) VALUES (?,?));ps.setString(1, name);ps.setInt(2, age);ps.executeUpdate();}} catch (SQLException e) {e.printStackTrace();} finally {try {ps.close();conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
2将Mysql数据转储到redis中 // 将Mysql数据库数据转储到Redispublic void addRedis() {System.out.println(redis添加数据);Connection conn null;PreparedStatement ps null;ResultSet rs null;conn getConnection();try {ps conn.prepareStatement(select * from user);rs ps.executeQuery();Jedis jedis new Jedis(localhost, 6379);while (rs.next()) {String id String.valueOf(rs.getInt(id));String name rs.getString(name);int age rs.getInt(age);// 使用有序集合存储学生ID和年龄以便进行排序jedis.zadd(UserByAge, age, id);// 存储学生数据jedis.hset(user: id, name, name);jedis.hset(user: id, age, String.valueOf(age));}jedis.close();} catch (SQLException e) {e.printStackTrace();} finally {try {rs.close();ps.close();conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}} 4.实现mysql和redis查询并比较查询时间
1mysql查询 //mysql查询public void queryDataWithJDBC() {Connection conn null;PreparedStatement ps null;ResultSet rs null;conn getConnection();try {ps conn.prepareStatement(select * from user);rs ps.executeQuery();while (rs.next()) {
// System.out.println(ID: rs.getInt(id) , Name: rs.getString(name) , Age: rs.getInt(age));}} catch (SQLException e) {e.printStackTrace();} finally {try {rs.close();ps.close();conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
2redis查询 //redis查询public void queryDataWithRedis() {Jedis jedis new Jedis(localhost, 6379);SetString keys jedis.keys(user:*);for (String key : keys) {MapString, String user jedis.hgetAll(key);
// System.out.println(Key: key , Value: user);}jedis.close();}
3记录并比较查询时间
// 比较查询时间public void compareTime() {// 通过jdbc查询这10000条数据记录查询时间long start System.currentTimeMillis();queryDataWithJDBC();long end System.currentTimeMillis();System.out.println(JDBC查询时间: (end - start) ms);// 通过redis查询这10000条数据记录查询时间start System.currentTimeMillis();queryDataWithRedis();end System.currentTimeMillis();System.out.println(Redis查询时间: (end - start) ms);}
5.根据年龄进行排序
1mysql排序 //mysql实现排序public void queryAndSortDataWithJDBC() {Connection conn null;PreparedStatement ps null;ResultSet rs null;conn getConnection();try {ps conn.prepareStatement(SELECT * FROM user ORDER BY age);rs ps.executeQuery();System.out.println(mysql实现排序);while (rs.next()) {System.out.println(ID: rs.getInt(id) , Name: rs.getString(name) , Age: rs.getInt(age));}} catch (SQLException e) {e.printStackTrace();} finally {try {rs.close();ps.close();conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}}
2redis排序 //redis实现排序public void queryAndSortDataWithRedis() {Jedis jedis new Jedis(localhost, 6379);ListTuple users jedis.zrangeWithScores(UserByAge, 0, -1);System.out.println(redis实现排序);for (Tuple user : users) {String id user.getElement();double age user.getScore();String name jedis.hget(user: id, name);System.out.println(ID: id , Name: name , Age: (int) age);}jedis.close();}
6.抽奖功能 //抽奖public void lottery() {Jedis jedis new Jedis(localhost, 6379);// 添加奖品String[] prizes {锅, 碗, 瓢, 盆, 金元宝};for (String prize : prizes) {jedis.sadd(prizes, prize);}// 年龄最小的前5人System.out.println(年龄最小的前5人);ListTuple youngestUsers jedis.zrangeWithScores(UserByAge, 0, 4);for (Tuple user : youngestUsers) {String id user.getElement();double age user.getScore();String name jedis.hget(user: id, name);String prize jedis.srandmember(prizes);System.out.println(恭喜 name 获得了抽奖机会奖品是 prize);}jedis.close();}
7.主函数 public static void main(String[] args) throws SQLException {JedisHomework jedisHomework new JedisHomework();jedisHomework.addMysql();jedisHomework.addRedis();jedisHomework.compareTime();jedisHomework.queryAndSortDataWithJDBC();jedisHomework.queryAndSortDataWithRedis();jedisHomework.lottery();} Redis中的缓存穿透、雪崩、击穿的原因以及解决方案 1.缓存击穿
1产生原因 在高并发访问下某个热点key在缓存中过期后大量并发请求同时查询数据库导致数据库压力激增的现象。
2解决方案
合理的过期时间将热点数据设置为永远不过期
使用互斥锁基于redis or zookeeper实现互斥锁等待第一个请求构建完缓存之后再释放锁进而其他请求才能通过该key访问数据。 2.缓存雪崩
1产生原因 由于缓存服务器在同一时间大面积失效或宕机导致大量请求直接打到数据库瞬间引发数据库压力激增甚至导致数据库崩溃。
2解决方案
事前redis 高可用主从哨兵redus cluster避免全盘崩溃
事中本地缓存 hystrix 限流降级避免 MySQL被打死。同时设置合理的过期时间。
事后redis持久化一旦重启自动从磁盘上加载数据快速回复缓存数据。 3.缓存穿透
1产生原因 查询一个一定不存在的数据由于缓存是不命中时需要从数据库查询查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到数据库去查询进而给数据库带来压力。 缓存穿透很有可能是黑客攻击所为黑客通过发送大量的高并发的无法响应的请求给服务器由于请求的资源根本就不存在DB数据库就很容易被打垮了。
2解决方案
缓存空对象对查询结果为空的情况也将其缓存起来并设置合理的过期时间。
参数校验在接收到请求之前进行参数校验判断请求参数是否合法。
布隆过滤器判断请求的参数是否存在于缓存或数据库中。 4.三者的异同
相同点大量的请求在redis上得不到响应那么就会导致这些请求会直接去访问DB导致DB的压力瞬间变大而卡死或者宕机。
不同点缓存击穿是某个热点过期后导致大量请求访问DB 缓存雪崩是多个key过期后导致大量请求访问DB 缓存穿透是不存在的key收到大量请求每次请求都要到DB查询。