Redis
messaging

Redis5.0 の新機能と新データ型のStreamsの概要

Redis5.0のGAリリースが間近に迫っていますので、Redis5の新機能について簡単にまとめたいと思います。

主な追加/変更

リリースノートより抜粋。

1. The new Stream data type. https://redis.io/topics/streams-intro
2. New Redis modules APIs: Timers and Cluster API.
3. RDB now store LFU and LRU information.
4. The cluster manager was ported from Ruby (redis-trib.rb) to C code
   inside redis-cli. Check `redis-cli --cluster help` for more info.
5. New sorted set commands: ZPOPMIN/MAX and blocking variants.
6. Active defragmentation version 2.
7. Improvemenets in HyperLogLog implementations.
8. Better memory reporting capabilities.
9. Many commands with sub-commands now have an HELP subcommand.
10. Better performances when clients connect and disconnect often.
11. Many bug fixes and other random improvements.
12. Jemalloc was upgraded to version 5.1

コマンドに影響する変更

Streamデータ型の追加

ログ(時系列データ)を扱うことができるデータ型で、メッセージキューのように使うこともできます。
メッセージキューとして使う場合の、リストやPub/Subとの違いを別途説明します。

Sorted Set型へのZPOPMIN/MAXの追加

Sorted Setをスコア順に並べた時の、先頭と末尾からデータをポップ(取得して削除)できます。
ブロッキング版のBZPOPMIN/MAXも追加されているので、キューのような使い方も可能になります。

サブコマンドを持つコマンドへのHELPサブコマンドの追加

これはタイトルのままですが、HELPサブコマンドでヘルプテキストが見れるようになっています。
OBJECT HELP など。

その他の変更

あとはほとんどCPU/メモリ効率に関する改善ですね。

Redis modules APIへのCluster、Timers APIの追加というのがありますが、Redis作者のAntierzさんのツイートによると、こちらのClusterというのはいわゆるRedis Clusterとは関係なく、Redisを使って分散処理を実現するための仕組みのようです。いずれのAPIも、同作者がRedisの技術を使って開発している分散メッセージキューシステムのDisqueのために追加したようです。

https://twitter.com/antirez/status/1001480576803704835

Stream

これはログ(時系列データ)を扱うためのデータ型です。基本的に追記のみ可能なデータ型で、各データはタイムスタンプとハッシュのような連想配列データのペアになります。
StreamはPub/SubやListのBRPOPなどのようにリアルタイムに読み取りでき、Consumer Groupsという機能を使うことで、特定のグループ内で一度しかデータを読まないようにするといったことが可能になります。Consumer Groupsにおいては、データに処理済みをマークすることができ、メッセージキューとしての利用も意識した作りになっています。

ListをBRPOPなどでキューとして使う場合との違い

  • 読み出してもデータが消えることはない
  • 複数のインスタンスから同じ内容を読み出すことができる

Pub/Subとの違い

  • データ追加時に読み取り元が待機している必要がない
  • 読み取り元が複数いる場合に、一つの読み取り元だけに読み取りをさせることができる(Consumer Groups機能)

メッセージキューとして使われることをより意識した実装

Consumer Groups機能ではグループ内の1つのConsumer(読み取り元)にだけデータを読み取らせることができます。また、読み取ったデータが滞留中データとして保持されます。XACKというコマンドで処理済みにすることで、滞留中データから削除されます。
これらの仕組みによって、ListやPub/Subと比べてメッセージキューとしてより安全に便利に使えるようになります。

参考