Redis的Hash结构大数据量拆分成多个小的hash工具类

  • 作者: 凯哥Java(公众号:凯哥Java)
  • Redis
  • 时间:2023-01-05 21:33
  • 3616人已阅读
简介 假如有hash类型的key,其中有100万对field和value,field是自增id,这个key存在什么问题?如何优化?拆分前占用内存大小:方案:拆分为小的hash,将id/100作为key,将id%100作为field,这样每100个元素为一个Hash拆分后,占用内存大小:拆分工具类:import com.heima.jedis.util.JedisConnectionFactor

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

假如有hash类型的key,其中有100万对field和value,field是自增id,这个key存在什么问题?如何优化?

拆分前占用内存大小:

1b5ffc6625ecbc49d2ef737f0ab0de30.png

方案:

拆分为小的hash,将 id / 100 作为key, 将id % 100 作为field,这样每100个元素为一个Hash

5616071bf500bb4ed9c470cc273514a9.png

拆分后,占用内存大小:

9d1d148b3813744143260d5afab8cc97.png

拆分工具类:

import com.heima.jedis.util.JedisConnectionFactory;
        import org.junit.jupiter.api.AfterEach;
        import org.junit.jupiter.api.BeforeEach;
        import org.junit.jupiter.api.Test;
        import redis.clients.jedis.Jedis;
        import redis.clients.jedis.Pipeline;
        import redis.clients.jedis.ScanResult;

        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;

public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp() {
        // 1.建立连接
         jedis = new Jedis("192.168.150.101", 6379);       
        // 2.设置密码
        jedis.auth("123321");
        // 3.选择库
        jedis.select(0);
    }

    @Test
    void testSetBigKey() {
        Map<String, String> map = new HashMap<>();
        for (int i = 1; i <= 650; i++) {
            map.put("hello_" + i, "world!");
        }
        jedis.hmset("m2", map);
    }

    @Test
    void testBigHash() {
        Map<String, String> map = new HashMap<>();
        for (int i = 1; i <= 100000; i++) {
            map.put("key_" + i, "value_" + i);
        }
        jedis.hmset("test:big:hash", map);
    }

    @Test
    void testBigString() {
        for (int i = 1; i <= 100000; i++) {
            jedis.set("test:str:key_" + i, "value_" + i);
        }
    }

    @Test
    void testSmallHash() {
        int hashSize = 100;
        Map<String, String> map = new HashMap<>(hashSize);
        for (int i = 1; i <= 100000; i++) {
            int k = (i - 1) / hashSize;
            int v = i % hashSize;
            map.put("key_" + v, "value_" + v);
            if (v == 0) {
                jedis.hmset("test:small:hash_" + k, map);
            }
        }
    }

    @AfterEach
    void tearDown() {
        if (jedis != null) {
            jedis.close();
        }
    }
}



TopTop