redis练习题

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();
    }

代码解释:

  1. 数据库连接部分

    • String URL: 定义了连接MySQL数据库的URL,包括数据库名称和连接参数。
    • String USERNAMEString PASSWORD: MySQL数据库的用户名和密码。
    • Class.forName("com.mysql.cj.jdbc.Driver"): 加载MySQL的JDBC驱动程序,确保能够与MySQL数据库建立连接。
    • Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD): 使用URL、用户名和密码建立数据库连接。
  2. 执行SQL查询

    • Statement st = conn.createStatement(): 创建一个Statement对象,用于执行SQL语句。
    • ResultSet rs = st.executeQuery(sql): 执行查询语句SELECT * FROM user,并将结果保存在ResultSet对象rs中。
  3. 处理查询结果并存入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和年龄,以便后续按年龄排序。
  4. 关闭资源

执行查询并记录查询时间

@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();
    }

代码解释:

  1. 初始化Jedis对象

    Jedis jedis=new Jedis("127.0.0.1",6379); 这行代码创建了一个Jedis对象,用于连接本地Redis服务器(IP地址为127.0.0.1,端口为6379)。
  2. 记录开始时间

    long start=System.currentTimeMillis(); 这行代码获取当前系统时间的毫秒数,用于计算代码执行时间。
  3. 获取所有匹配的键

    Set<String> keys=jedis.keys("student:*"); 这行代码使用Redis的keys命令,查找所有以student:开头的键,并将它们存储在一个集合(Set)中。
  4. 注释掉的循环部分

    // for (String key : keys) { // Map<String, String> student = jedis.hgetAll(key); // System.out.println("Key: " + key + ", Value: " + student); // } 这段代码被注释掉了,它原本是用来迭代处理每个匹配的键,并从Redis中获取哈希表(Hash)的所有字段及其值,并打印出来。
  5. 记录结束时间

    long finish=System.currentTimeMillis(); 这行代码再次获取当前系统时间的毫秒数,用于计算代码执行完成后的时间。
  6. 输出执行时间

    System.out.println("时间为:"+(finish-start)+"ms"); 这行代码计算并打印出代码执行的时间,以毫秒为单位。
  7. 关闭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();
    }

代码解释:

  1. 初始化Jedis对象

    Jedis jedis=new Jedis("127.0.0.1",6379); 这行代码创建了一个Jedis对象,用于连接本地Redis服务器(IP地址为127.0.0.1,端口为6379)。
  2. 获取已排序集合中的学生信息

    Set<Tuple> students = jedis.zrangeWithScores("studentsByAge", 0, -1); 
    

    这行代码使用Redis的ZRANGE命令,从已按年龄排序的有序集合studentsByAge中获取所有成员(学生)及其分数(年龄)。0-1表示获取范围内的所有成员。

  3. 遍历学生集合

    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>)中获取学生的姓名。
  4. 输出学生信息

    System.out.println("ID: " + id + ", Name: " + name + ", Age: " + (int)age); 这行代码打印每个学生的ID、姓名和年龄(将年龄转换为整数)。
  5. 关闭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();
    }

 

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值