关键词搜索

源码搜索 ×
×

漫话Redis源码之三

发布2021-11-21浏览517次

详情内容

看了一下宏的实现,这是zle结构的高效的原因之一:

  1. } zlentry;
  2. #define ZIPLIST_ENTRY_ZERO(zle) { \
  3. (zle)->prevrawlensize = (zle)->prevrawlen = 0; \
  4. (zle)->lensize = (zle)->len = (zle)->headersize = 0; \
  5. (zle)->encoding = 0; \
  6. (zle)->p = NULL; \
  7. }
  8. /* Extract the encoding from the byte pointed by 'ptr' and set it into
  9. * 'encoding' field of the zlentry structure. */
  10. #define ZIP_ENTRY_ENCODING(ptr, encoding) do { \
  11. (encoding) = ((ptr)[0]); \
  12. if ((encoding) < ZIP_STR_MASK) (encoding) &= ZIP_STR_MASK; \
  13. } while(0)
  14. #define ZIP_ENCODING_SIZE_INVALID 0xff
  15. /* Return the number of bytes required to encode the entry type + length.
  16. * On error, return ZIP_ENCODING_SIZE_INVALID */
  17. static inline unsigned int zipEncodingLenSize(unsigned char encoding) {
  18. if (encoding == ZIP_INT_16B || encoding == ZIP_INT_32B ||
  19. encoding == ZIP_INT_24B || encoding == ZIP_INT_64B ||
  20. encoding == ZIP_INT_8B)
  21. return 1;
  22. if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
  23. return 1;
  24. if (encoding == ZIP_STR_06B)
  25. return 1;
  26. if (encoding == ZIP_STR_14B)
  27. return 2;
  28. if (encoding == ZIP_STR_32B)
  29. return 5;
  30. return ZIP_ENCODING_SIZE_INVALID;
  31. }
  32. #define ZIP_ASSERT_ENCODING(encoding) do { \
  33. assert(zipEncodingLenSize(encoding) != ZIP_ENCODING_SIZE_INVALID); \
  34. } while (0)
  35. /* Return bytes needed to store integer encoded by 'encoding' */
  36. static inline unsigned int zipIntSize(unsigned char encoding) {
  37. switch(encoding) {
  38. case ZIP_INT_8B: return 1;
  39. case ZIP_INT_16B: return 2;
  40. case ZIP_INT_24B: return 3;
  41. case ZIP_INT_32B: return 4;
  42. case ZIP_INT_64B: return 8;
  43. }
  44. if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
  45. return 0; /* 4 bit immediate */
  46. /* bad encoding, covered by a previous call to ZIP_ASSERT_ENCODING */
  47. redis_unreachable();
  48. return 0;
  49. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载