Consistent hashing distributes keys across multiple servers. But there are situations
like sorting or computing set intersections or operations like rpoplpush
in redis that require all keys to be collocated on the same server.
One of the techniques that redis encourages for such forced key locality is called
key tagging. See <http://code.google.com/p/redis/wiki/FAQ> for reference.
The trait KeyTag defines a method tag that takes a key and returns
the part of the key on which we hash to determine the server on which it will be located.
If it returns None then we hash on the whole key, otherwise we hash only on the
returned part.
redis-rb implements a regex based trick to achieve key-tagging. Here is the technique
explained in redis FAQ:
A key tag is a special pattern inside a key that, if preset, is the only part of the key
hashed in order to select the server for this key. For example in order to hash the key
"foo" I simply perform the CRC32 checksum of the whole string, but if this key has a
pattern in the form of the characters {...} I only hash this substring. So for example
for the key "foo{bared}" the key hashing code will simply perform the CRC32 of "bared".
This way using key tags you can ensure that related keys will be stored on the same Redis
instance just using the same key tag for all this keys. Redis-rb already implements key tags.
Consistent hashing distributes keys across multiple servers. But there are situations like sorting or computing set intersections or operations like rpoplpush in redis that require all keys to be collocated on the same server.
One of the techniques that redis encourages for such forced key locality is called key tagging. See <http://code.google.com/p/redis/wiki/FAQ> for reference.
The trait KeyTag defines a method tag that takes a key and returns the part of the key on which we hash to determine the server on which it will be located. If it returns None then we hash on the whole key, otherwise we hash only on the returned part.
redis-rb implements a regex based trick to achieve key-tagging. Here is the technique explained in redis FAQ: A key tag is a special pattern inside a key that, if preset, is the only part of the key hashed in order to select the server for this key. For example in order to hash the key "foo" I simply perform the CRC32 checksum of the whole string, but if this key has a pattern in the form of the characters {...} I only hash this substring. So for example for the key "foo{bared}" the key hashing code will simply perform the CRC32 of "bared". This way using key tags you can ensure that related keys will be stored on the same Redis instance just using the same key tag for all this keys. Redis-rb already implements key tags.