Redis的Hash结构大数据量拆分成多个小的hash工具类
- 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
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
方案:
拆分为小的hash,将 id / 100 作为key, 将id % 100 作为field,这样每100个元素为一个Hash
拆分后,占用内存大小:
拆分工具类:
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(); } } }