Module: RedisClient::Cluster::KeySlotConverter

Defined in:
lib/redis_client/cluster/key_slot_converter.rb

Class Method Summary collapse

Class Method Details

.convert(key) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/redis_client/cluster/key_slot_converter.rb', line 50

def convert(key)
  return nil if key.nil?

  hash_tag = extract_hash_tag(key)
  key = hash_tag unless hash_tag.empty?

  crc = 0
  key.each_byte do |b|
    crc = ((crc << 8) & 0xffff) ^ XMODEM_CRC16_LOOKUP[((crc >> 8) ^ b) & 0xff]
  end

  crc % HASH_SLOTS
end

.extract_hash_tag(key) ⇒ Object

See Also:



65
66
67
68
69
70
71
72
73
74
# File 'lib/redis_client/cluster/key_slot_converter.rb', line 65

def extract_hash_tag(key)
  key = key.to_s
  s = key.index(LEFT_BRACKET)
  return EMPTY_STRING if s.nil?

  e = key.index(RIGHT_BRACKET, s + 1)
  return EMPTY_STRING if e.nil?

  key[s + 1..e - 1]
end

.hash_tag_included?(key) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
80
81
82
83
84
85
# File 'lib/redis_client/cluster/key_slot_converter.rb', line 76

def hash_tag_included?(key)
  key = key.to_s
  s = key.index(LEFT_BRACKET)
  return false if s.nil?

  e = key.index(RIGHT_BRACKET, s + 1)
  return false if e.nil?

  s + 1 < e
end