《Redis应用实例》Java实现(12):数据库迭代器

redis的迭代器让用户可以分批获取数据库中的数据,而不是一次性获取整个数据库的全部数据,在数据量巨大的时候不会造成服务器阻‍塞。


package com.foxbill.redisinaction;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.ScanParams;
import redis.clients.jedis.resps.ScanResult;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Description 数据库迭代器
 */
public class Chapter12 {
    static public void start(Jedis jedis) {
        prepareTestData(jedis);
        scan(jedis);
        hashScan(jedis);
        cleanTestData(jedis);
    }

    /**
     * 准备测试数据
     */
    private static void prepareTestData(Jedis jedis) {
        cleanTestData(jedis);
        // 添加测试数据
        for(int i=1;i<=10;i++) {
            String key = "chapter12:user:"+i;
            jedis.set(key, "user1"+i);
            //
            key = "chapter12:hash:"+i;
            for (int j=1;j<=5;j++) {
                jedis.hset(key, "field"+j, "value"+j);
            }
        }
    }

    private static void cleanTestData(Jedis jedis){
        // 清除可能存在的测试键,确保测试结果准确
        for(int i=1;i<=10;i++) {
            String key = "chapter12:user:"+i;
            jedis.del(key);
            key = "chapter12:hash:"+i;
            jedis.del(key);
        }
    }

    //scan迭代
    private static void scan(Jedis jedis) {
        // 创建ScanParams对象,设置匹配模式,匹配以"chapter12:user:"开头的键,每次迭代返回约6个键,注意:这是一个提示值,不是精确值
        ScanParams scanParams = new ScanParams().count(6).match("chapter12:user:*");
        Set<String> matchedKeys = new HashSet<>();
        String cursor = "0";
        int iterationCount = 0;
        do {
            // 执行带模式的SCAN命令
            ScanResult<String> scanResult = jedis.scan(cursor, scanParams);

            List<String> keys = scanResult.getResult();
            matchedKeys.addAll(keys);

            cursor = scanResult.getCursor();
            iterationCount++;

            String result = String.join(", ", keys);
            System.out.println("- 匹配模式'chapter12:user:*',第" + iterationCount + "次迭代,获取到" + keys.size() + "个键:"+ result);
        } while (!cursor.equals("0"));

    }

    //hash数据迭代
    private static void hashScan(Jedis jedis) {
        System.out.println("\n【HSCAN操作 - 迭代哈希字段】");
        String hashKey = "chapter12:hash:1";
        Set<String> allFields = new HashSet<>();
        String cursor = "0";
        int iterationCount = 0;
        do {
            // 执行HSCAN命令,迭代哈希字段
            ScanResult<Map.Entry<String, String>> scanResult = jedis.hscan(hashKey, cursor);
            // 获取本次扫描的字段-值对
            List<Map.Entry<String, String>> fields = scanResult.getResult();
            for (Map.Entry<String, String> field : fields) {
                allFields.add(field.getKey());
                System.out.println("  字段: " + field.getKey() + ", 值: " + field.getValue());
            }
            cursor = scanResult.getCursor();
            iterationCount++;
        } while (!cursor.equals("0"));
        System.out.println("- HSCAN完成,共找到" + allFields.size() + "个字段");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值