1.新建一张user表,在表内插入10000条数据。
2.①通过jdbc查询这10000条数据,记录查询时间。
②通过redis查询这10000条数据,记录查询时间。
3.①再次查询这一万条数据,要求根据年龄进行排序,mysql和redis各实现一次。
4.上面排序后的前5人可进行抽奖,每人有一次抽奖机会,抽奖奖品随意设计,抽奖方式通过redis实现。(此篇文章仅展示redis部分代码及部分代码解释)
通过redis查询这10000条数据,记录查询时间。
@Test
public void Demo2() throws Exception {
String URL="jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
String USERNAME="root";
String PASSWORD="123456";
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement st = conn.createStatement();
String sql="SELECT * FROM user";
ResultSet rs = st.executeQuery(sql);
Jedis jedis=new Jedis("127.0.0.1",6379);
while (rs.next()) {
String userId =String.valueOf(rs.getInt("id"));
String userName =rs.getString("name");
int userAge =rs.getInt("age");
//jedis.zadd("students_sorted_set", Double.parseDouble(String.valueOf(userAge)), userId + ":" + userName);
//System.out.println(userId + ", " + userName + ", " + userAge);
jedis.hset("student:" + userId, "name", userName);
jedis.hset("student:" + userId, "age", String.valueOf(userAge));
// 使用有序集合存储学生ID和年龄,以便进行排序
jedis.zadd("studentsByAge", userAge, userId);
}
rs.close();
conn.close();
jedis.close();
}
代码解释:
-
数据库连接部分:
String URL
: 定义了连接MySQL数据库的URL,包括数据库名称和连接参数。String USERNAME
和String PASSWORD
: MySQL数据库的用户名和密码。Class.forName("com.mysql.cj.jdbc.Driver")
: 加载MySQL的JDBC驱动程序,确保能够与MySQL数据库建立连接。Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD)
: 使用URL、用户名和密码建立数据库连接。
-
执行SQL查询:
Statement st = conn.createStatement()
: 创建一个Statement对象,用于执行SQL语句。ResultSet rs = st.executeQuery(sql)
: 执行查询语句SELECT * FROM user
,并将结果保存在ResultSet对象rs
中。
-
处理查询结果并存入Redis:
Jedis jedis = new Jedis("127.0.0.1", 6379)
: 连接到本地Redis服务器。while (rs.next()) { ... }
: 遍历ResultSet对象,逐行获取每个用户的ID、姓名和年龄。jedis.hset("student:" + userId, "name", userName)
: 使用Redis的哈希数据结构,存储每个学生的姓名。jedis.hset("student:" + userId, "age", String.valueOf(userAge))
: 存储每个学生的年龄。jedis.zadd("studentsByAge", userAge, userId)
: 使用有序集合,存储学生ID和年龄,以便后续按年龄排序。
-
关闭资源
执行查询并记录查询时间
@Test
public void Demo4(){
Jedis jedis=new Jedis("127.0.0.1",6379);
long start=System.currentTimeMillis();
Set<String> keys=jedis.keys("student:*");
// for (String key : keys) {
// Map<String, String> student = jedis.hgetAll(key);
// System.out.println("Key: " + key + ", Value: " + student);
// }
//Set<Tuple> members=jedis.zrangeWithScores("students_sorted_set",0,-1);
long finish=System.currentTimeMillis();
System.out.println("时间为:"+(finish-start)+"ms");
jedis.close();
}
代码解释:
-
初始化Jedis对象:
Jedis jedis=new Jedis("127.0.0.1",6379);
这行代码创建了一个Jedis对象,用于连接本地Redis服务器(IP地址为127.0.0.1,端口为6379)。 -
记录开始时间:
long start=System.currentTimeMillis();
这行代码获取当前系统时间的毫秒数,用于计算代码执行时间。 -
获取所有匹配的键:
Set<String> keys=jedis.keys("student:*");
这行代码使用Redis的keys命令,查找所有以student:开头的键,并将它们存储在一个集合(Set)中。 -
注释掉的循环部分:
// for (String key : keys) { // Map<String, String> student = jedis.hgetAll(key); // System.out.println("Key: " + key + ", Value: " + student); // }
这段代码被注释掉了,它原本是用来迭代处理每个匹配的键,并从Redis中获取哈希表(Hash)的所有字段及其值,并打印出来。 -
记录结束时间:
long finish=System.currentTimeMillis();
这行代码再次获取当前系统时间的毫秒数,用于计算代码执行完成后的时间。 -
输出执行时间:
System.out.println("时间为:"+(finish-start)+"ms");
这行代码计算并打印出代码执行的时间,以毫秒为单位。 -
关闭Jedis连接:
jedis.close();
最后,这行代码关闭了与Redis的连接,释放资源。
再次查询这一万条数据,要求根据年龄进行排序,mysql和redis各实现一次。
@Test
public void Demo6(){
Jedis jedis=new Jedis("127.0.0.1",6379);
Set<Tuple> students = jedis.zrangeWithScores("studentsByAge", 0, -1);
for (Tuple student : students) {
String id = student.getElement();
double age = student.getScore();
String name = jedis.hget("student:" + id, "name");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + (int)age);
}
jedis.close();
}
代码解释:
-
初始化Jedis对象:
Jedis jedis=new Jedis("127.0.0.1",6379);
这行代码创建了一个Jedis对象,用于连接本地Redis服务器(IP地址为127.0.0.1,端口为6379)。 -
获取已排序集合中的学生信息:
Set<Tuple> students = jedis.zrangeWithScores("studentsByAge", 0, -1);
这行代码使用Redis的
ZRANGE
命令,从已按年龄排序的有序集合studentsByAge
中获取所有成员(学生)及其分数(年龄)。0
和-1
表示获取范围内的所有成员。 -
遍历学生集合:
for (Tuple student : students) { String id = student.getElement(); double age = student.getScore(); String name = jedis.hget("student:" + id, "name"); System.out.println("ID: " + id + ", Name: " + name + ", Age: " + (int)age); }
在这个循环中,对每个学生(Tuple对象)进行处理:student.getElement()
获取学生的ID。student.getScore()
获取学生的年龄(作为double类型)。- 使用
jedis.hget("student:" + id, "name")
从Redis中的哈希表(Key为student:<id>
)中获取学生的姓名。
-
输出学生信息:
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + (int)age);
这行代码打印每个学生的ID、姓名和年龄(将年龄转换为整数)。 -
关闭Jedis连接:
jedis.close();
最后,这行代码关闭了与Redis的连接,释放资源。
上面排序后的前5人可进行抽奖,每人有一次抽奖机会,抽奖奖品随意设计,抽奖方式通过redis实现。
@Test
public void Demo7(){
Jedis jedis=new Jedis("127.0.0.1",6379);
String[] gifts={"手机","电脑","平板","手表","键盘"};
for (String gift : gifts) {
jedis.sadd("gifts",gift);
}
Set<Tuple> Students = jedis.zrangeWithScores("studentsByAge", 0, 4);
for (Tuple student : Students) {
String id = student.getElement();
//double age = student.getScore();
String name = jedis.hget("student:" + id, "name");
String gift = jedis.srandmember("gifts");
System.out.println(name + "获得的奖品是:" +gift );
}
jedis.close();
}