Redis 4.0の目玉機能解説

# redis 4.0 GA release
ついに昨日(2017/07/15)に、redis 4.0のstableがリリースされました。
今までのredisと何が変わったのか？というのを、軽くまとめたいと思います。
間違いなどありましたら、指摘いただけると幸いです。

#### 前回のqiita記事
[プロダクションで2年間RedisClusterを運用してみて](http://qiita.com/maruloop/items/18932dfc4be8778434d2)

# release notes
https://raw.githubusercontent.com/antirez/redis/4.0/00-RELEASENOTES

### 一部抜粋すると
>Note that 4.0 is probably one of the most extreme releases of Redis ever
made in terms of changes inside the internals: all the aggregated data types
no longer use Redis Objects structures but directly SDS objects, certain
deletion operations are now threaded, the replication engine was modified
in many ways. So please handle this release with care. A few patch-level 
releases will follow in the next weeks and months fixing the important issues
discovered by the users.

redis 4.0は、今までと比較しておそらく最も極端なバージョンアップのひとつです。
今後ユーザーによって発見された重大な問題は、数週間から数ヶ月でパッチリリースしていくので、慎重に利用してください。

とのことなので、まだしばらく様子見するなり、どうしても利用したい場合は自身で十分に検証した方が良いでしょう。

>MPORTANT: Redis Cluster users, please note that, as specified in the list
of incompatibilities, Redis 4.0 cluster bus protocol is not compatible with
Redis 3.2, so in order to upgrade, a mass reboot of the instances is needed
and rolling upgrades are not possible. This change was needed in order to
add compatibility for Containers/NAT, where the bus port at a fixed offset
was not an acceptable design, so we had to change many things, resulting
in the incompatible protocol.

また、Redis Clusterを3系と4系で混ぜて組むことは出来ないようで、一度完全にクラスターを停止してアップデートする必要があるようです。どうしようかな。

# 目玉機能
さて、4.0の目玉機能には以下のようなものがあるようです。ひとつずつ見ていきます。

- a modules system
- much better replication (PSYNC2)
- improvements to eviction policies
- threaded DEL/FLUSH
- mixed RDB+AOF format
- Raspberry Pi support as primary platform
- the new MEMORY command
- Redis Cluster support for Nat/Docker
- active memory defragmentation
- memory usage and performance improvements
- much faster Redis Cluster key creation

### a modules system
redisは既にハッシュ型やSET型やList型などの様々なデータ型があったり、
Lua Scriptを実行したりと、機能面でかなり充実していましたが、それがさらに充実します。

詳細はqiitaだと以下の記事にまとめられてますので、そちら参照いただければ。
http://qiita.com/saidie/items/06a14529006635a18b2f
http://qiita.com/saidie/items/251084941ffd73871a1a

### much better replication (PSYNC2)

今までのRedisにも部分同期(Partial-Sync)はあったのですが、色々と問題がありました。
具体的には、同一master以外から部分同期が出来ないというもので、redis clusterなどを組むと
master downからの新しいslaveが昇格する度に、Full-Syncが走るという男前仕様でした。
[もっと問題について詳細に知りたい場合はこちら](https://github.com/antirez/redis/issues/2694)

ざっくり試算すると、Redisに5GBのデータが乗っていた場合、NWが1Gbpsだと悲観的に40秒もかかりますね。
せっかくRedis Clusterを組んでいるのに、悲しいダウンタイムです。
これが改善されました。
[より詳細はantirezのgistに。](https://gist.github.com/antirez/ae068f95c0d084891305)

### improvements to eviction policies
Redisはメモリが溢れた時にどのように振る舞うか？というポリシーはすでにいくつかありますが、LFU(Least Frequently Used)が使えるようになりました。
今まではLRU(Least Recently Used)と呼ばれる最近使われたキーほど削除されにくい、というものでしたが、
LFUではキャッシュヒット率が高いキーほど削除されにくい、というものです。
キャッシュ用途でredisを利用している場合は、こちらの方が良いかもしれません。

[より詳細はantirez newsで](http://antirez.com/news/109)

### threaded DEL/FLUSH
今までは、例えば大きく育ってしまったSET型などのキーを削除すると、シングルスレッドで実行されるため、削除が完了するまですべての操作を受け付けませんでした。

これが4.0になると、DELコマンドをバックグラウンドで行う[UNLINKコマンド](https://redis.io/commands/unlink)が生まれ、キーの削除を非同期に行えるようになりました、
また、[FLUSHALL](https://redis.io/commands/flushall)や[FLUSHDB](https://redis.io/commands/flushdb)にもasyncオプションが増え、同様に非同期で削除出来るようになりました。

### mixed RDB+AOF format
今までのredisのファイルバックアップは2通りありました。

- 定期的にmemoryの完全dumpを取るRDB
- 追記型でredisに発行されたコマンドを保存するAOF

(MySQLでいうと、前者がmysqldumpで、後者がbinlogでしょうか)

ちなみに、ファイルサイズでいうと、以下のredisのメモリ使用量のとき

```shell-session
$ redis-cli info memory
# Memory
used_memory:717116400
used_memory_human:683.90M
```

このくらいファイルサイズが違います。

```shell-session
$ ls -lh
-rw-r--r-- 1 root root 668M  7月 15 10:53 2017 redis.aof
-rw-r--r-- 1 root root 288M  7月 15 10:52 2017 redis.rdb
```

ただ、rdbファイルは一気に288MBのDisk Writeが走るため、writeの負荷が高いです。
また定期バックアップなので、バックアップ後のデータはロストします。
aofは追記型のため、writeの負荷は低いのですが、read時の負荷が高いです。

軽く試算すると、Redis再起動にかかる時間は、
5GBのaofファイルをHDD(350 IOPS * IOブロックサイズ4KB=1.36MB/sec)で読み込もうとすると、3744秒。
つまり大体1時間かかりそうです。Redis再起動に。

これらを解消するために、いいとこ取りとしてRDB-AOFのmixが生まれたようです。
RDBファイルである時点まで復旧させ、そこから先をAOFで復旧させる感じ。
実際には検証してないので、検証された方がいましたら教えてください。

### Raspberry Pi support as primary platform
そのままです。省略

### the new MEMORY command
メモリー使用量のトラブルシューティングコマンドだそうです。
まだ公式サイトのコマンドリストに詳細なものは入っていないので、詳細はそれ待ちです。
単一キーによるメモリ使用量報告などが見られるらしい。

### Redis Cluster support for Nat/Docker
dockerでClusterを組むときに、多くの人がハマっていたであろう罠が解消されたようです。
詳細：[Redis cluster should support announce-ip & announce-port #2527](https://github.com/antirez/redis/issues/2527)

### active memory defragmentation
読んで字のごとく、アクティブ(オンライン)のメモリ最適化機能が入りました。
まだEXPERIMENTALな機能で、デフォルトは無効になっています。
注意事項やどういう時に有効にすべきか、などは以下に書いてあるので、
詳細は [4.0.0のredis.conf](https://github.com/antirez/redis/blob/4.0.0/redis.conf#L1232)をご確認ください。

### memory usage and performance improvements
なんかメモリの使い方やパフォーマンスが色々よくなっているらしい。

>Redis uses now less memory in order to store the same amount of data. The gain depends a lot on the kind of dataset stored.

としか書かれてなかった。

### much faster Redis Cluster key creation
何か早くなってるらしいけど、詳細がどこにあるかわからなかった。



以上、良きRedisライフを。