Redis管道获取数据

/**获取Jedis
     * @return
     */
    public Jedis getJedis(){
        Properties pros = getPprVue();
        String isopen = pros.getProperty("redis.isopen");//
        String host = pros.getProperty("redis.host");//地址
        String port = pros.getProperty("redis.port");//端口
        String pass = pros.getProperty("redis.pass");//密码
        if("yes".equals(isopen)){
            Jedis jedis = new Jedis(host,Integer.parseInt(port));
//          jedis.auth(pass);
            return jedis;
        }else{
            return null;
        }
    }

    /**读取redis.properties 配置文件
     * @return
     * @throws IOException
     */
    public Properties getPprVue(){
        InputStream inputStream = DbFH.class.getClassLoader().getResourceAsStream("redis.properties");
        Properties p = new Properties();
        try {
            p.load(inputStream);
            inputStream.close();
        } catch (IOException e) {
            //读取配置文件出错
            e.printStackTrace();
        }
        return p;
    }
redis.properties
# Redis 参数配置
redis.isopen:yes
redis.host:11.31.142.115
redis.port:6379
redis.pass:w


redis.maxIdle:300
redis.maxActive:600
redis.maxWait:1000
redis.testOnBorrow:true
  /**
     * 获取reids里所有的数据
     * @param prefix
     * @return
     */
    public Map<String,Object> getRedisData(String prefix)throws Exception{
//      prefix="WxCmd";
        Map<String,Object> map=new HashMap<String, Object>();
        Jedis redis=redisDaoImpl.getJedis();
        // 获取所有key
        String keyword="WxCmd:";
        if(null!=prefix && prefix!=""){
            keyword+="*"+prefix;
        }

        Set s = redis.keys(keyword+"*");
        Iterator it = s.iterator();

        while (it.hasNext()) {
            String key = (String) it.next();
            //获取redis存储的类型
            String type = redis.type(key);
            Object value=new Object();
            if(type.equals("hash")){
                value=redis.hvals(key);
            }else if(type.equals("string")){
                value=redis.get(key);
            }else{
        ...
            }
            map.put(key,value);
        }
        return map;
    }


    /**
     * 获取reids里所有的数据
     * @param prefix
     * @return
     */
    public Map<String,Map<String,String>>  getRedisDataByKey(String prefix)throws Exception{
        Map<String,Map<String,String>> result = new HashMap<String,Map<String,String>>();
        Jedis redis=redisDaoImpl.getJedis();

        Set<String> keys = redis.keys(prefix+"*");
        if(null!=keys && keys.size()>0){
            //获取管道
            Pipeline pipeline = redis.pipelined();
            Map<String,Response<Map<String,String>>> responses = new HashMap<String,Response<Map<String,String>>>(keys.size());
            Long start = System.currentTimeMillis();

            for(String key : keys) {
                responses.put(key, pipeline.hgetAll(key));
            }
            pipeline.sync();
            for(String k : responses.keySet()) {
                result.put(k, responses.get(k).get());
            }
            Long end = System.currentTimeMillis();
            System.err.println("result size:[" + result.size() + "] ..");
            System.err.println("hgetAll with pipeline used [" + (end - start) / 1000 + "] seconds ..");
        }
        return result;
    }

    /**
     * 根据key获取所有的数据
     * @param
     * @return
     */
    public Map<String,Map<String,String>> getRedisDataByListKey(List<String> keyList)throws Exception{
        Map<String,Map<String,String>> result = new HashMap<String,Map<String,String>>();
        List<String> keys=keyList;
        Jedis redis=redisDaoImpl.getJedis();
        if(null!=keys && keys.size()>0){
            //获取管道
            Pipeline pipeline = redis.pipelined();
            Map<String,Response<Map<String,String>>> responses = new HashMap<String,Response<Map<String,String>>>(keys.size());
            for(String key : keys) {
                responses.put(key, pipeline.hgetAll(key));
            }
            pipeline.sync();
            for(String k : responses.keySet()) {
                result.put(k, responses.get(k).get());
            }
        }
        return result;
    }
在使用 `redis` 模块进行分页获取数据时,通常会依赖 Redis 的数据结构和命令来实现高效的分页机制。Redis 提供了多种适合分页的数据结构,其中最常用的是 **有序集合(Sorted Set)** 和 **列表(List)**。 ### 使用有序集合(Sorted Set)进行分页 有序集合非常适合需要按分数排序并进行分页的场景。例如,分页获排行榜数据。 #### 示例代码: ```javascript const redis = require('redis'); const client = redis.createClient(); // 添加一些示例数据到有序集合中 client.zadd('leaderboard', 100, 'player1', 95, 'player2', 90, 'player3', 85, 'player4', 80, 'player5'); // 分页获取数据:每页2个玩家,获第一页(索引从0开始) client.zrange(['leaderboard', 0, 1], (err, reply) => { if (err) throw err; console.log('Page 1:', reply); }); // 获第二页 client.zrange(['leaderboard', 2, 3], (err, reply) => { if (err) throw err; console.log('Page 2:', reply); }); ``` 在这个例子中,`zrange` 命令用于根据排名范围获元素,适用于基于有序集合的分页[^1]。 --- ### 使用列表(List)进行分页 如果数据是简单的线性排列,可以使用列表结构。`lrange` 命令允许通过指定索引范围来获取数据。 #### 示例代码: ```javascript const redis = require('redis'); const client = redis.createClient(); // 向列表中添加数据 client.rpush('data_list', 'item1', 'item2', 'item3', 'item4', 'item5'); // 分页获取数据:每页2项,获第一页 client.lrange(['data_list', 0, 1], (err, reply) => { if (err) throw err; console.log('Page 1:', reply); }); // 获第二页 client.lrange(['data_list', 2, 3], (err, reply) => { if (err) throw err; console.log('Page 2:', reply); }); ``` 通过 `lrange` 可以轻松地实现基于列表的分页功能。 --- ### 使用哈希(Hash)结合其他结构进行复杂查询分页 当需要存储更复杂的对象时,可以将哈希与有序集合或列表结合使用。例如,使用有序集合存储主键和排序,再用哈希存储详细信息。 #### 示例代码: ```javascript const redis = require('redis'); const client = redis.createClient(); // 存储用户信息到哈希 client.hset('user:1', 'name', 'Alice', 'age', 30); client.hset('user:2', 'name', 'Bob', 'age', 25); client.hset('user:3', 'name', 'Charlie', 'age', 35); // 使用有序集合存储用户ID和评分 client.zadd('users_rank', 100, '1', 95, '2', 90, '3'); // 分页获用户ID client.zrange(['users_rank', 0, 1], (err, userIds) => { if (err) throw err; // 根据用户ID获详细信息 userIds.forEach(userId => { client.hgetall(`user:${userId}`, (err, userData) => { if (err) throw err; console.log(`User ${userId}:`, userData); }); }); }); ``` 这种模式适用于需要高效检索和展示复杂数据结构的场景。 --- ### 性能优化建议 - **使用管道(Pipelining)**:减少网络往返次数,提高性能。 - **批量操作**:尽可能使用 `mget`、`hmget` 等命令一次性获多个键。 - **合理选择数据结构**:根据业务需求选择合适的数据结构,避免不必要的内存消耗。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值