当前位置:   article > 正文

redis 五种基本数据类型的内部编码_redis不同数据类型的内部编码

redis不同数据类型的内部编码

目录

 

字符串类型的内部编码:

哈希类型的内部编码:

列表类型的内部编码:

集合类型的内部编码:

有序集合类型的内部编码:

数据初始化

测试结果:


字符串类型的内部编码:

  1. int 8个字节的长整型
  2. embstr: 小于等于39个字节的字符串
  3. raw: 大于39个字节的字符串

redis会根据当前值的类型长度去判断选用那种内部编码实现;

哈希类型的内部编码:

  1. ziplist(压缩列表): 当哈希元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64字节),redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀
  2. hashtable(哈希表): 当哈希类型无法满足ziplist的条件时, redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1);

列表类型的内部编码:

  1. ziplist(压缩列表): 当列表元素个数小于list-max-ziplist-entries配置(默认512个),同时所有值都小于list-max-ziplist-value配置(默认64字节),redis会使用ziplist作为列表的内部实现来减少内存的使用
  2. linkedlist(链表): 当列表类型无法满足ziplist的条件的时候.redis会采用linkedlist作为链表的内部实现;
  3. quicklist : 在redis3.2 版本后,一种新的数据结构,结合了ziplist和quicklist的优点,所以采用redis3.2以后版本的列表的内部编码都采用了quicklist;

集合类型的内部编码:

  1. intset(整数集合): 当集合元素个数小于set-max-ziplist-entries配置(默认512个),redis会使用intset作为集合的内部实现来减少内存的使用
  2. hashtable(哈希表): 当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现

有序集合类型的内部编码:

  1. ziplist(压缩列表): 当列表元素个数小于zset-max-ziplist-entries配置(默认128个),同时所有值都小于zset-max-ziplist-value配置(默认64字节),redis会使用ziplist作为列表的内部实现来减少内存的使用
  2. skiplist(跳跃表): 当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降

数据初始化

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class BaseSpringDateRedisTest {
  4. @Autowired
  5. protected RedisTemplate<String, Object> redisTemplate;
  6. public ValueOperations<String, Object> getForValue() {
  7. return redisTemplate.opsForValue();
  8. }
  9. public SetOperations<String, Object> getForSet() {
  10. return redisTemplate.opsForSet();
  11. }
  12. public ListOperations<String, Object> getForList() {
  13. return redisTemplate.opsForList();
  14. }
  15. public ZSetOperations<String, Object> getForZSet() {
  16. return redisTemplate.opsForZSet();
  17. }
  18. public HashOperations<String, Object, Object> getForHash() {
  19. return redisTemplate.opsForHash();
  20. }
  21. public HyperLogLogOperations<String, Object> getForHyperLogLog() {
  22. return redisTemplate.opsForHyperLogLog();
  23. }
  24. public GeoOperations<String, Object> getForGeo() {
  25. return redisTemplate.opsForGeo();
  26. }
  27. public ClusterOperations<String, Object> getForCluster() {
  28. return redisTemplate.opsForCluster();
  29. }
  30. }
  31. public class EncodingTest extends BaseSpringDateRedisTest {
  32. private static final String LIST_KEY = "list:key:one";
  33. private static final String KEY_TWO = "list:key:two";
  34. private static final String KEY_THREE = "list:key:three";
  35. static final String person = "hash:common:person";
  36. static final String tag = "hash:common:tag";
  37. @Test
  38. public void dataInit() {
  39. // String 内部编码 int embstr raw
  40. //8个字节 39个字节 大于39个字节
  41. getForValue().set( "string:key:one","9988" );
  42. getForValue().set( "string:key:two","北龙归心号苍穹,竞曰风云山河" );
  43. getForValue().set( "string:key:three","星耀自古晦明时,不持太阿误剑诗!十方萧索无涯·千古夕阳有主·诗仙纵横·刀剑茫茫去不还" );
  44. // hash 内部编码
  45. // ziplist 元素个数小于512, 每个元素值小于64字节
  46. // hashtable
  47. getForHash().put( tag,"name","苦海女神龙" );
  48. getForHash().put("hash:common:key","hashtable",
  49. "一腔热肠,两坛吊儿,三五知己,醉了十部幽曲。六弦古琴,七觑红尘,八九豪情,乱了四方风云,一排轻筏,两处闲情,三五鸿雁,别了十里清溪。六发绝招,七具尸体,八九回合,杀了四年仇人");
  50. // 链表--- 其实ziplist linkedlist 在3.2版本后就被quicklist 代替, quicklist 结合了前两者的优点
  51. //1. 元素个数小于 512个;
  52. //2. 元素值小于64字节
  53. getForList().rightPush( LIST_KEY, "998" );
  54. // 元素值大于64字节
  55. getForList().leftPush( KEY_TWO, "烟波 瀰漫掩樯橹 眨眼汹涌吞噬 没江底酆都\n" +
  56. "屠苏 落喉几朝暮 冬去春寒未了 伴冷夜暗雨\n" +
  57. "刀斧 剑芒遍五湖 遥祭散骸豪骨 焉回首眷顾" );
  58. // 元素个数超过512个
  59. for (int i = 0; i < 513; i++) {
  60. getForList().leftPush( KEY_THREE, i + "" );
  61. }
  62. //集合
  63. // intset 元素个数小于512
  64. // hashtable
  65. getForSet().add( "set:key:one","1","2" );
  66. for (int i = 0; i < 513; i++) {
  67. getForSet().add( "set:key:two",i+"" );
  68. }
  69. // 有序集合: ziplist
  70. //1. 元素个数小于 128个;
  71. //2. 每个元素值小于64字节
  72. getForZSet().add( "zset:key:one", "rabbit", 99.0 );
  73. // skipList
  74. // 元素个数超过128个
  75. for (int i = 0; i < 129; i++) {
  76. getForZSet().add( "zset:key:two", "noddles" + i, 88.88 );
  77. }
  78. }
  79. }

测试结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/596683
推荐阅读
相关标签
  

闽ICP备14008679号