redis的list取出数据方式速度测试

Posted libin6505

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis的list取出数据方式速度测试相关的知识,希望对你有一定的参考价值。

 

redis测试:

package business;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.JedisClientSingle;
import redis.clients.jedis.JedisPool;

/**
 * @Package redis
 * @ClassName BusinessTest.java
 * @author libin
 * @date 2019年4月12日 下午2:16:43
 * @version V1.0
 */
public class BusinessTest {

    public static void main(String[] args) throws Exception {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-jedis.xml");
        // JedisPool pool = (JedisPool)
        // applicationContext.getBean("redisClient");
        JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
        JedisClientSingle j = new JedisClientSingle(pool);

        // m1(j);
        m5(j,"l2");
//         m3(j,"l5");
//         m4(j,"l5");

    }
//    
//    redis中的list操作命令中删除指定key中的所有记录命令:
//
//    ltrim key 1 0

    //结论:这种取数据的方式还可以接受,不如直接取快lrange
    private static void m5(JedisClientSingle j,String name) throws Exception {
        long t1 = System.currentTimeMillis();
        int i = 0;
        while(true) {
            i++;
            String lpop = j.lpop(name);
            System.out.println(lpop);
            if (lpop==null) {
                System.out.println("取完了");
                break;
            }
        }
        
//        null
//        取完了
//        ------个数:+220001---耗时-------:75990
        System.out.println("------个数:+" + i + "---耗时-------:" + (System.currentTimeMillis() - t1));// 11000条5569
                                                                                                        // ~5550毫秒
    }

    private static void m4(JedisClientSingle j,String name) throws Exception {
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < 20; i++) {
            // 每次插入11000条
            m1(j,name);
        }
//        11000条5569
//        ------个数:+220000---耗时-------:77590
//        ------个数:+220000---耗时-------:78986
//        ------个数:+220000---耗时-------:76039
        System.out.println("------个数:+" + j.llen(name) + "---耗时-------:" + (System.currentTimeMillis() - t1));// 11000条5569
                                                                                                                // ~5550毫秒
    }

    private static void m3(JedisClientSingle j,String name) throws Exception {
        long t1 = System.currentTimeMillis();
        Long len = j.llen(name);
        for (int k = 0; k < len; k++) {
            // 根据角标取
            String s = j.lindex(name, k);
            System.out.println(s);
        }
        // ------个数:+11000---耗时-------:5550  如果20万用这种方式取,要10多个小时
        System.out.println("------个数:+" + len + "---耗时-------:" + (System.currentTimeMillis() - t1));// 11000条5569
                                                                                                        // ~5550毫秒
    }

    //经过测试得出结论:取出数据可以用lrange方法 20万数据都没问题
    private static void m2(JedisClientSingle j,String name) throws Exception {
        long t1 = System.currentTimeMillis();
        // 按照范围取
        List<String> lrange = j.lrange(name, 0, -1);
        for (String string : lrange) {
            System.out.println(string);
        }
        // ------个数:+11000---耗时-------:579
//        ------个数:+220000---耗时-------:25499
//        ------个数:+220000---耗时-------:9950
        System.out.println("------个数:+" + lrange.size() + "---耗时-------:" + (System.currentTimeMillis() - t1));// 11000条529
                                                                                                                // ~700毫秒
    }

    private static void m1(JedisClientSingle j,String name) throws Exception {
        // 处理文件
        long t1 = System.currentTimeMillis();

        // String localFilePath = localTempPath+"/"+fileName;
        String localFilePath = "D:\\a\\c\\haha.txt";

        // 开启固定线程池
        // ExecutorService exec = Executors.newFixedThreadPool(50);
        // 逐行读取本地文件
        List<String> dataList = new ArrayList<String>();

        // File f = new File("D:\\a\\b\\in.txt");
        File f = new File(localFilePath);
        InputStreamReader reader = new InputStreamReader(new FileInputStream(f), "GBK");
        BufferedReader br = new BufferedReader(reader);
        String str = null;
        // 定义计数器
        int i = 0;
        while ((str = br.readLine()) != null) {
            // i的值是从1开始
            i++;
            // 逐条右插入
            // Long len = j.rpush("l1", "l1-"+str);
            Long len = j.rpush(name, name+"-" + str);
            System.out.println(len);
        }
        reader.close();
        br.close();
    }

}

 

以上是关于redis的list取出数据方式速度测试的主要内容,如果未能解决你的问题,请参考以下文章

redis 如何存一个PHP数组 代码怎么写呢

Redis数据结构

redis 排序 及 取出Hset中的多个数据(sort get 命令实践)

redis学习-列表(list)常用命令

java代码中 单表查询出的list集合 怎么读写到redis中

redis