SlideShare a Scribd company logo
1 of 123
Download to read offline
Redis, another step on the road
2015-05-15
Ant
yftzeng@gmail.com
2015
2/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
2015
3/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
4/123
2015
Redis history
Redis 歷史
Redis 2.0
✔ Key-value store policy, key in memory, value in disk.
Redis 2.0
✔ Key-value 儲存策略, key 存記憶體, value 存硬碟。
5/123
2015
Redis history
Redis 歷史
Redis 2.4
✔ Key-value store policy, both key & vlaue are in memory.
✔ Add 2 background threads,
✔ fsync file descriptor.
✔ close file descriptor.
Redis 2.4
✔ Key-value 儲存策略, key 及 value 存記憶體。
✔ 除了 main thread 外,引入了 2 個 background threads,
✔ fsync file descriptor 。
✔ close file descriptor 。
6/123
2015
Redis history
Redis 歷史
Redis 2.6
✔ Server side Lua scripting.
✔ Virtual Memory removed.
✔ Milliseconds resolution expires.
✔ Removed hardcoded number of clients.
Redis 2.6
✔ 伺服器端支援 Lua 。
✔ 移除 Virtual Memory 。
✔ 「 Expires 」的毫秒精準度。
✔ 移除寫死的客戶端數量限制。
7/123
2015
Redis history
Redis 歷史
Redis 2.8
✔ Saving synchronization resource.
✔ Before 2.8, slave use SYNC with the master.
✔ After 2.8, slave use PSYNC with the master.
Redis 2.8
✔ 節省同步資源。
✔ 2.8 以前, slave 使用 SYNC 與 master 同步。
✔ 2.8 以後,改用 PSYNC ( 偏移量同步 ) 與 master 同步。
2015
8/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
9/123
2015
Redis 3.0
Redis 3.0
Release date: 1 Apr 2015.
✔ Redis Cluster.
✔ New "embedded string" object.
✔ Improved LRU approximation algorithm.
2015 年 4 月 1 日正式釋出。
✔ Redis Cluster 。
✔ “新的 embedded string” 。
✔ LRU 演算法的改進。
2015
10/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
11/123
2015
Redis features
Redis 特性
✔ RDBMS
✔ Oracle, DB2, PostgreSQL, MySQL, SQL Server, ...
✔ NoSQL
✔ Cassandra, HBase, Memcached, MongoDB, Redis, ...
✔ NewSQL
✔ Aerospike, FoundationDB, RethinkDB, ...
✔ RDBMS
✔ Oracle, DB2, PostgreSQL, MySQL, SQL Server, ...
✔ NoSQL
✔ Cassandra, HBase, Memcached, MongoDB, Redis, ...
✔ NewSQL
✔ Aerospike, FoundationDB, RethinkDB, ...
12/123
2015
Redis features
Redis 特性
✔ Key-value NoSQL
✔ Memcached, Redis, ...
✔ Column family NoSQL
✔ Cassandra, HBase, ...
✔ Documen NoSQL
✔ MongoDB, ...
✔ Graph NoSQL
✔ Neo4j, ...
✔ Key-value NoSQL
✔ Memcached, Redis, ...
✔ Column family NoSQL
✔ Cassandra, HBase, ...
✔ Documen NoSQL
✔ MongoDB, ...
✔ Graph NoSQL
✔ Neo4j, ...
13/123
2015
Redis features
Redis 特性
Pure
✔ ANSI C.
✔ Lesser 3rd
-party libraries.
✔ Memcached depends on libevent.
✔ Redis implement its own epoll event loop.
✔ KISS principle.
✔ Data structure do what it should do.
簡純
✔ ANSI C 撰寫。
✔ 幾乎不依賴第三方函式庫。
✔ memcached 使用 libevent ,程式碼龐大。
✔ Redis 參考 libevent 實現了自己的 epoll event loop 。
✔ KISS 原則。
✔ 每個數據結構只負責自己應當做的。
14/123
2015
Redis features
Redis 特性
Simple
✔ No map-reduce.
✔ No indexes.
✔ No vector clocks.
簡單
✔ No map-reduce.
✔ No indexes.
✔ No vector clocks.
15/123
2015
Redis features
Ref: http://oldblog.antirez.com/post/redis-manifesto.html
5 - We're against complexity. We believe designing
systems is a fight against complexity. We'll accept to
fight the complexity when it's worthwhile but we'll try
hard to recognize when a small feature is not worth
1000s of lines of code. Most of the time the best way
to fight complexity is by not creating it at all.
16/123
2015
Redis features
Redis 特性
Single thread
✔ No thread context switch.
✔ No thread race condition.
✔ No other complicated condition.
單執行緒
✔ No thread context switch.
✔ No thread race condition.
✔ No other complicated condition.
17/123
2015
Redis features
Redis 特性
In-memory but persistent on disk database
✔ Operation in memory.
✔ Persistent on disk.
記憶體資料庫,但可永久儲存於硬碟中
✔ 記憶體操作資料。
✔ 資料可永久儲存於硬碟。
18/123
2015
Redis features
Redis 特性
Remote dictionary server
✔ No only a cache server.
Remote dictionary server
✔ 不只是快取伺服器。
Ref: http://redis.io/topics/faq
2015
19/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
20/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Redis is single thread IO multiplexing model.
✔ Simple operations to archive high throughput.
✔ Complicated (heavy) operations may block others.
✔ One instance usually only use one CPU.
✔ Redis 是單執行緒 IO 多路複用模式。
✔ 簡單的操作可以達到高吞吐。
✔ 複雜的操作容易阻塞其它的操作。
✔ 一個 Redis 實例通常只會用到一顆 CPU 。
21/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Memcached is multi-threaded, non-blocking IO
✔ multiplexing network model.
✔ Multi-core architecture.
✔ But got cache coherency & lock issues.
✔ Memcached 是多執行緒非阻塞 IO 多路複用模式。
✔ 多執行緒可善用多顆 CPU 。
✔ 但會引入 cache coherency 及 lock 問題。
22/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Redis can use jemalloc or tcmalloc to reduce
✔ memory fragmentation.
✔ But it depends on the allocation patterns.
✔ Rarely use the Free-list and other ways to optimize
✔ memory allocation.
✔ Redis is simple / pure / efficiency design.
✔ Redis 使用 jemalloc 或 tcmalloc 降低記憶體碎片。
✔ 但記憶體碎片的情形仍依賴於分配模式。
✔ 幾乎不用 Free-list 及其它方法來最佳化記憶體分配。
✔ 符合 Redis 簡單 / 單純 / 效率的設計原則。
Ref: http://www.databaseskill.com/1256096/
Ref: http://stackoverflow.com/questions/18097670/why-the-memory-fragmentation-is-less-than-1-in-redis
23/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Memcached use pre-allocated / slot memory pool.
✔ slot and pool can reduce memory fragmentation.
✔ But bring some wasted space. (memory overhead)
✔ Memcached 使用預分配 slot 記憶體池。
✔ slot 及池能有效降低某種程度的記憶體碎片。
✔ 但會帶來一些空間浪費的問題。 (memory overhead)
24/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Garbage Collection behavior: approximate LRU.
✔ Redis 2.6
✔ Random pick 3 samples, removed the oldest one,
✔ repeatedly until memory used less than
✔ 'maxmemory' limit.
✔ 垃圾回收行為:近似 LRU 演算法。
✔ Redis 2.6
✔ 預設隨機取 3 個樣本,移除最舊的該筆,如此反覆,
✔ 直到記憶體用量小於 maxmemory 的設定。
Ref: https://github.com/antirez/redis/blob/2.6/src/redis.c#L2464
25/123
2015
Redis and Memcached
Ref: https://github.com/antirez/redis/blob/2.6/src/redis.c#L2464
26/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Garbage Collection behavior: approximate LRU.
✔ Redis 3.0
✔ Default random pick 5 samples, insert/sort into
✔ a pool, remove the best one, repeatedly until
✔ memory used less than 'maxmemory' limit.
✔ 5 (now) is more than 3 (before) samples ;
✔ The best one is more approximate global.
✔ 垃圾回收行為: approximate LRU 。
✔ Redis 3.0
✔ 預設隨機取 5 個樣本,插入並排序至一個 pool ,移除
✔ 最佳者,如此反覆,直到記憶體用量小於 maxmemory
✔ 的設定。
✔ 樣本 5 比先前的 3 多;
✔ 從局部最優趨向全局最優。
Ref: https://github.com/antirez/redis/blob/3.0/src/redis.c#L3251
27/123
2015
Redis and Memcached
Ref: https://github.com/antirez/redis/blob/3.0/src/redis.c#L3251
28/123
2015
Redis and Memcached
Ref: http://redis.io/images/redisdoc/lru_comparison.png
29/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Strong sides of Redis.
✔ Rich (data type) operations.
✔ Hashs, Lists, Sets, Sorted Sets, HyperLogLog etc.
✔ Bulit-in replication & cluster.
✔ in-place update operations.
✔ Support persistent on disk.
✔ Avoid thundering herd.
✔ Redis 的長處。
✔ 豐富的 ( 資料型態 ) 操作。
✔ Hashs, Lists, Sets, Sorted Sets, HyperLogLog 等。
✔ 內建 replication 及 cluster 。
✔ 就地更新 (in-place update) 操作。
✔ 支援持久化 ( 硬碟 ) 。
✔ 避免雪崩效應。
30/123
2015
Redis and Memcached
Redis 與 Memcached
✔ Strong sides of Memcached.
✔ Multi-threaded.
✔ Use almost all CPUs.
✔ Fewer blocking operations.
( And center locks don't scaled up to 5 threads )
✔ Lower memory overhead.
✔ Lower memory allocation pressure.
✔ Maybe less memory fragmentation.
✔ Memcached 的長處。
✔ 多執行緒。
✔ 善用多核 CPU 。 ( 而 center locks 不隨 CPU 擴展 )
✔ 更少的阻塞操作。
✔ 更少的記憶體開銷。
✔ 更少的記憶體分配壓力。
✔ 可能有更少的記憶體碎片。
Ref: https://github.com/memcached/memcached/blob/master/thread.c#L747
31/123
2015
Redis and Memcached
Ref: https://github.com/memcached/memcached/blob/master/thread.c#L747
32/123
2015
Redis and Memcached
Redis 與 Memcached
✔ My testbed (NO WARRANTY)
✔ Get: Memcached is usually faster than Redis.
✔ Set: Redis is usually faster than Memcached.
✔ Size from 0 ~ 100KB is better for Redis.
✔ Size from 100KB ~ 10MB is better for Memcached.
✔ Size from 10M ~ is better for Redis.
✔ 我的使用經驗 ( 免責聲明 )
✔ Get 時, Memcached 比 Redis 快。
✔ Set 時, Redis 比 Memcached 快。
✔ 數據 0~100KB 時,適合 Redis 。
✔ 數據 100KB~10MB 時,適合 Memcached 。
✔ 數據 10M 以上時,適合 Redis 。
33/123
2015
Redis and Memcached
2015
34/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
35/123
2015
Redis and Aerospike
Ref: http://www.aerospike.com/
✔ Speed
✔ Scalable
✔ Flash-optimized
✔ In-memory NoSQL
✔ ACID Compliant
36/123
2015
Redis and Aerospike
Redis 與 Aerospike
✔ Strong sides of Aerospike.
✔ Auto node discovery (cluster).
✔ ACID Compliant
✔ Flash-optimized (Memory & Disk persistence).
✔ Intelligent Client (Optimistic row locking etc.).
✔ Cross data center replication.
✔ Multi-core optimization.
✔ No hotspots.
✔ Aerospike 的長處。
✔ 自管理集群。
✔ ACID 兼容。
✔ 數據存儲最佳化 (Flash/SSD) 。
✔ 智能客戶端 (Optimistic row locking 等 ) 。
✔ 跨數據中心集群。
✔ 多核最佳化。
✔ 無熱點瓶頸。
37/123
2015
Redis and Aerospike
Ref: http://lynnlangit.com/2015/01/28/lessons-learned-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis/
38/123
2015
Redis and Aerospike
Ref: http://lynnlangit.com/2015/01/28/lessons-learned-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis/
39/123
2015
Redis and Aerospike
Redis 與 Aerospike
✔ Itamar Haber (Redis Labs, Chief Developers Advocate)
✔ Why didn't … use … pipelining and multi-key
✔ operations?
✔ Missing piece is a 20%-80% read/write test and a
✔ 100% write test.
✔ Totally unexplained by the fact that she used AOF.
✔ Comparisons are as hard to do right as they are
✔ easy to do wrong.
✔ Itamar Haber (Redis Labs 公司的首席開發者推廣師 )
✔ 為什麼不用 Redis 推薦做法,如使用 piplining 和多鍵操作。
✔ 沒有測試工作負載: 20%-80% 讀寫和 100% 寫的情境。
✔ 對於 AOF ,一般都是建議非主 Redis 實例執行。
✔ 最後,比較是一件很難做對卻很容易做錯的事。
Ref: https://redislabs.com/blog/the-lessons-missing-from-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis
40/123
2015
Redis and Aerospike
Redis 與 Aerospike
✔ Salvatore Sanfilippo (antirez, the author of Redis)
✔ GET/SET Benchmarks are not a great way to
✔ compare different database systems.
✔ A better performance comparison is by use case.
✔ Test with instance types most people are going to
✔ actually use, huge instance types can mask
✔ inefficiencies of certain database systems, and is
✔ anyway not what most people are going to use.
✔ Salvatore Sanfilippo (antirez, Redis 作者 )
✔ GET/SET 不能比較出資料庫間的效能差異。
✔ 效能是需要依據業務場景而定。
✔ 測試應當依據大多數用戶的實際案例,太多的案例會掩蓋
✔ 某些資料庫的低效率,而且這樣的案例也不是大多數用戶
✔ 會遇到的。
Ref: http://antirez.com/news/85
41/123
2015
Redis and Aerospike
Ref: https://aphyr.com/posts/324-call-me-maybe-aerospike
42/123
2015
Redis and Aerospike
Redis 與 Aerospike
✔ However, as the network shifts, … .By the time of the
✔ final read, about 10% of the increment operations
✔ have been lost.
✔ Just like the CaS register test, increment and read
✔ latencies will jump from ~1 millisecond to ~500
✔ milliseconds when a partition occurs.
✔ Aerospike can service every request successfully,
✔ peaking at ~2 seconds.
✔ 當 Network partition 發生時, Aerospike 會在某個很短的
✔ 時間內丟失操作。以每秒 500 次的 increment operations
✔ 測試,丟失約 10% 的寫入。
✔ 在 partition 完成後,會有幾秒很明顯的 latency 高峰出現。
✔ Aerospike 即使在已經執行已久的 partition 中,也會出現
✔ 服務中斷的情形,中斷甚至長達 2 秒。
Ref: http://antirez.com/news/85
43/123
2015
Redis and Aerospike
Redis 與 Aerospike
✔ In the summer of 2013 we faced exactly this problem:
✔ big-memory (192 GB RAM) server nodes were running
✔ out of memory and crashing again … We were being
✔ bitten by fragmentation.
✔ 2013 年夏天, Aerospike 突然有一台 192 GB RAM 的伺服器
✔ 因記憶體用盡而當機, ASMalloc 工具未查出 memory leak ,
✔ 所以看來是因為記憶體碎片造成的。
Ref: http://highscalability.com/blog/2015/3/17/in-memory-computing-at-aerospike-scale-when-to-choose-and-ho.html
2015
44/123
Agenda
✔ Redis history
✔ Redis 3.0
✔ Redis features
✔ Redis and Memcached
✔ Redis and Aerospike
✔ Insight on the pit
議程
✔ Redis 歷史
✔ Redis 3.0
✔ Redis 特性
✔ Redis 與 Memcached
✔ Redis 與 Aerospike
✔ 坑裡的洞見
45/123
2015
Insight on the pit
坑裡的洞見
Server-side sessions with Redis
使用 Redis 共享 Sessions
46/123
2015
小心
先驅變先烈
朕知道
了
47/123
2015
Insight on the pit 【 Server-side sessions with Redis 】
Ref: http://vc2tea.com/redis-session/
48/123
2015
Insight on the pit 【 Server-side sessions with Redis 】
坑裡的洞見【使用 Redis 共享 Sessions 】
✔ Redis has many eviction policies, but most of them
✔ are based on 'sampling'.
✔ This means eviction item is not global optimization,
✔ but local optimization.
✔ When reach 'maxmemory', it may evict items not
✔ old enough.
✔ Users get logged out early, and the worst is you
✔ won’t even notice it, until users start complaining.
✔ Redis 有很多種移除舊數據的策略,但大多基於「抽樣」。
✔ 這意謂移除舊數據不是全局最優而是局部最優。
✔ 當達到 'maxmemory' 上限時,可能造成移除的數據「不
✔ 夠舊」。
✔ 使得使用者提前被登出。最糟的是,你可能都不會知道,
✔ 直到使用者開始抱怨。
Ref: http://redis.io/topics/lru-cache
49/123
2015
Insight on the pit 【 Server-side sessions with Redis 】
坑裡的洞見【使用 Redis 共享 Sessions 】
✔ Alternative solutions.
✔ Use database as an another back-end.
✔ 1. When write session, set both in Redis and
✔ database.
✔ 2. When read session, Redis first, database
✔ second.
✔ Redis 3.0.
✔ More 'sampling'.
✔ 替代方案。
✔ 使用資料庫為另一儲存後台。
✔1. 寫入 Session 時,同時寫進 Redis 及資料庫。
✔2. 讀出 Session 時, Redis 優先,資料庫其次。
✔ 使用 Redis 3.0 。
✔ 選擇較大的 'sampling' ( 抽樣數 ) 。
50/123
2015
Insight on the pit 【 Server-side sessions with Redis 】
坑裡的洞見【使用 Redis 共享 Sessions 】
✔ A better way is … (thinking)
✔ 還有其它的解法 !!! ( 思考 )
51/123
2015
Insight on the pit
坑裡的洞見
Maximize CPUs usage
善用多核 CPU
52/123
2015
偶爾任性是可愛,
一天到晚任性是妖孽。
朕知道
了
53/123
2015
Insight on the pit 【 Maximize CPUs usage 】
坑裡的洞見【善用多核 CPU 】
✔ Redis is single thread.
✔ One instance usually only use one CPU.
✔ (background threads.)
✔ (background tasks, such as BGSAVE, AOF rewrite.)
✔ Redis 是單執行緒。
✔ 一個 Redis 實例通常只會用到一顆 CPU 。
✔ ( 背景執行緒 )
✔ ( 背景工作,例如 BGSAVE 及 AOF rewrite)
54/123
2015
Insight on the pit 【 Maximize CPUs usage 】
55/123
2015
Insight on the pit 【 Maximize CPUs usage 】
坑裡的洞見【善用多核 CPU 】
✔ Maximize CPUs usage.
✔ Redis instances is same as CPU cores.
✔ But,
✔ 1.Set 'maxmemory' for each instance carefully.
✔ 2.Instance should have different 'dbfilename'.
✔ 3.Instance should have different 'appendfilename'.
✔ 善用多核 CPU 。
✔ 啟動的 Redis 實例與 CPU 核心數一樣多。
✔ 但,
✔ 1. 每個實例的 'maxmemory' 需要小心配置。
✔ 2. 每個實例的 'dbfilename' 需要不一樣。
✔ 3. 每個實例的 'appendfilename' 需要不一樣。
56/123
2015
Insight on the pit
坑裡的洞見
Memory optimization
記憶體優化
57/123
2015
前程四緊:
 手頭緊、
 眉頭緊、
 衣服緊、
 時間緊。
朕知道
了
58/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Memory fragmentation.
✔ SET.
✔ rehash.
✔ When hash table needs to switch to a bigger
✔ or smaller table this happens incrementally.
✔ 記憶體碎片。
✔ SET 。
✔ rehash 。
✔ 當 dict 鍵值持續增加時,為保持良好的效能, dict
✔ 需要執行 rehash 。
59/123
2015
Insight on the pit 【 Memory optimization 】
Ref: http://redisbook.readthedocs.org/en/latest/internal-datastruct/dict.html
60/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Key name length.
✔ Shorter is better.
✔ But also meaningful ones.
✔ “product:user1:count” is better than “pu1c”.
✔ Key 命名長度。
✔ 長度愈短愈好。
✔ 但還是要有意義。
✔ “product:user1:count” ”優於 pu1c” 。
61/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Ziplist.
✔ The ziplist is a specially encoded dually linked
✔ list that is designed to be very memory efficient.
✔ Ziplist is space efficient.
✔ Ziplist 。
✔ 符合某種設定下,資料結構會以 Ziplist 方式儲存。
✔ 類似一維線性儲存,省去大量的指針開銷。
Ref: http://redis.io/topics/memory-optimization
62/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Ziplist.
✔ hash-max-ziplist-entries 64
✔ hash-max-ziplist-value 512
✔ list-max-ziplist-entries 512
✔ list-max-ziplist-value 64
✔ zset-max-ziplist-entries 128
✔ zset-max-ziplist-value 64
✔ set-max-intset-entries 512
✔ Ziplist 。
✔ hash-max-ziplist-entries 64
✔ hash-max-ziplist-value 512
✔ list-max-ziplist-entries 512
✔ list-max-ziplist-value 64
✔ zset-max-ziplist-entries 128
✔ zset-max-ziplist-value 64
✔ set-max-intset-entries 512
63/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Ziplist.
✔ hash-max-ziplist-entries 64
✔ hash-max-ziplist-value 512
✔ Use ziplist if entries count ≦ 64 or
✔ every entry size ≦ 512.
✔ Ziplist 。
✔ hash-max-ziplist-entries 64
✔ hash-max-ziplist-value 512
✔ 如果 Hash ≦的數量 64 ,或其中一個 Hash ≦的值
✔ 512 ,則使用 Ziplist 。
64/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Ziplist.
✔ Twitter use case.
✔ A Redis ziplist threshold is set to the max size
✔ of a Timeline. Never store a bigger Timeline
✔ than can be stored in a ziplist.
✔ Ziplist 。
✔ Twitter 的案例。
✔ Ziplist 的數量設定與 Timelines 的最大數量一致;
✔ Timeline 的儲存大小也不會超過 Ziplist 的上限。
Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
65/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ REDIS_SHARED_INTEGERS.
✔ Default is 10,000.
✔ Integers can be stored in a shared memory pool,
✔ and don't have any memory overheads.
✔ REDIS_SHARED_INTEGERS 。
✔ 預設是 10,000 。
✔ 整數 ( 包括 0) 可以預分配在共享池,避免重複分配而節省
✔ 記憶體。
66/123
2015
Insight on the pit 【 Memory optimization 】
Ref: http://redisbook.readthedocs.org/en/latest/datatype/object.html
Flyweight
src/redis.h
67/123
2015
Insight on the pit 【 Memory optimization 】
坑裡的洞見【記憶體優化】
✔ Bitmaps.
✔ HyperLogLogs.
✔ Bitmaps.
✔ HyperLogLogs.
68/123
2015
Insight on the pit
坑裡的洞見
Availability
可用性
69/123
2015
開發都想好自在,
客戶都要靠得住。
朕知道
了
70/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Twemproxy (Twitter)
✔ Codis ( 豌豆荚 )
✔ Redis Cluster (Official)
✔ Cerberus (HunanTV)
✔ Twemproxy (Twitter)
✔ Codis ( 豌豆荚 )
✔ Redis Cluster ( 官方 )
✔ Cerberus ( 芒果 TV)
71/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Twemproxy (Twitter)
✔ Twemproxy is proxy-based solution.
✔ Good parts
✔ Stable, enterprise ready.
✔ Twemproxy (Twitter)
✔ 代理分片機制。
✔ 優點
✔ 非常穩定,企業級方案。
72/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Twemproxy (Twitter)
✔ Bad parts
✔ SPOF (Single Point Of Failure)
✔ Keepalived etc.
✔ Smoothless on scale.
✔ No dashboard.
✔ Proxy-based, more route trip times, higher latency.
✔ Single-threaded proxy model.
✔ Twemproxy (Twitter)
✔ 缺點
✔ 單點故障。
✔ 需依賴第三方軟體,如 Keepalived 。
✔ 無法平滑地橫向擴展。
✔ 沒有後台介面。
✔ 代理分片機制引入更多的來回次數並提高延遲。
✔ 單核模式,無法充份利用多核,除非多實例。
73/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Twemproxy (Twitter)
✔ Bad parts
✔ Twemproxy is not used by Twitter internally.
✔ Twemproxy (Twitter)
✔ 缺點
✔ Twitter 官方內部不再繼續使用 Twemproxy 。
Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
74/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Codis ( 豌豆荚 )
✔ Codis is proxy-based solution.
✔ 豌豆莢 open source on Jan 2014.
✔ Written in Go and C.
✔ Codis ( 豌豆荚 )
✔ 代理分片機制。
✔ 豌豆莢於 2014 年 11 月開放源碼。
✔ 基於 Go 與 C 開發。
75/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Codis ( 豌豆荚 )
✔ Good parts
✔ Stable, enterprise ready.
✔ Auto Rebalance.
✔ High performance.
✔ Simple testbed is faster 100% than Twemproxy.
✔ Multi-threaded proxy model.
✔ Codis ( 豌豆荚 )
✔ 優點
✔ 非常穩定,企業級方案。
✔ 數據自動平衡。
✔ 高效能。
✔ 簡單的測試顯示較 Twemproxy 快一倍。
✔ 善用多核 CPU 。
76/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Codis ( 豌豆荚 )
✔ Good parts
✔ Simple
✔ No paxos-like coordinators,
✔ No master-slave replication.
✔ Dashboard.
✔ Codis ( 豌豆荚 )
✔ 優點
✔ 簡單。
✔ 沒有 Paxos 類的協調機制。
✔ 沒有主從複製。
✔ 有後台介面。
77/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Codis ( 豌豆荚 )
✔ Bad parts
✔ Proxy-based, more route trip times, higher latency.
✔ Need 3rd
-party coordinators
✔ Zookeeper or Etcd.
✔ No master-slave replication.
✔ Codis ( 豌豆荚 )
✔ 缺點
✔ 代理分片機制引入更多的來回次數並提高延遲。
✔ 需要第三方軟體支持協調機制。
✔ 目前支援 Zookeeper 及 Etcd 。
✔ 不支援主從複製,需要另外實作。
78/123
2015
Insight on the pit 【 Availability 】
Ref: http://0xffff.me/blog/2014/11/11/codis-de-she-ji-yu-shi-xian-part-3/
Codis 的设计与实现 Part 3
✔ Codis 采用了 Proxy 的方案,所以必然会带来单机性能
✔ 的损失。
✔ 经测试,在不开 pipeline 的情况下,大概会损失 40%
✔ 左右的性能,但是 Redis 本身是一个快得吓人的东西,
✔ 即使单机损失了 40% 仍然是一个很大的数字。
79/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Redis Cluster (Official)
✔ Official supports.
✔ Requires Redis 3.0 or higher.
✔ Redis Cluster ( 官方 )
✔ 官方支援。
✔ 需要 Redis 3.0 或更高版本。
80/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Redis Cluster (Official)
✔ Good parts
✔ Official supports.
✔ Pear-to-pear Gossip distributed model.
✔ Less route trip times, lower latency.
✔ Automatically sharded across multiple Redis nodes.
✔ Do not need 3rd
-party coordinators
✔ Redis Cluster ( 官方 )
✔ 優點
✔ 官方支援。
✔ 無中心的 P2P Gossip 分散式模式。
✔ 更少的來回次數並降低延遲。
✔ 自動於多個 Redis 節點進行分片。
✔ 不需要第三方軟體支持協調機制。
81/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Redis Cluster (Official)
✔ Bad parts
✔ Requires Redis 3.0 or higher.
✔ Need time to prove its stability.
✔ No dashboard.
✔ Need smart client.
✔ Redis client need to support for Redis Cluster.
✔ More maintenance cost than Codis.
✔ Redis Cluster ( 官方 )
✔ 缺點。
✔ 需要 Redis 3.0 或更高版本。
✔ 需要時間驗證其穩定性。
✔ 沒有後台介面。
✔ 需要智能客戶端。
✔ Redis 客戶端必須支援 Redis Cluster 設計。
✔ 較 Codis 有更多的維護升級成本。
82/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Cerberus (HunanTV)
✔ Good parts
✔ Auto Rebalance.
✔ Implement Redis's Smart Client.
✔ Read-write split.
✔ Cerberus ( 芒果 TV)
✔ 優點
✔ 數據自動平衡。
✔ 本身實現了 Redis 的 Smart Client 。
✔ 支援讀寫分離。
Ref: https://github.com/HunanTV/redis-cerberus
83/123
2015
Insight on the pit 【 Availability 】
坑裡的洞見【可用性】
✔ Cerberus (HunanTV)
✔ Bad parts
✔ Requires Redis 3.0 or higher.
✔ Proxy-based, more route trip times, higher latency.
✔ Need time to prove its stability.
✔ No dashboard.
✔ Cerberus ( 芒果 TV)
✔ 缺點
✔ 需要 Redis 3.0 或更高版本。
✔ 代理分片機制引入更多的來回次數並提高延遲。
✔ 需要時間驗證其穩定性。
✔ 沒有後台介面。
84/123
2015
Insight on the pit
坑裡的洞見
Stabilization
穩定性
85/123
2015
每一個穩定服務背後,
都有一個齷齪的實現。
朕知 道
了
86/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Performance fluctuation.
✔ Out of memory.
✔ Redis instances is same as CPU cores.
✔ Big Ziplist.
✔ Master-slave.
✔ 效能抖動。
✔ 記憶體不足。
✔ 啟動的 Redis 實例與 CPU 核心數一樣多。
✔ Big Ziplist 。
✔ 主從模式。
87/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Performance fluctuation.
✔ For production, stabilization is more important than
✔ average performance.
✔ Easy to estimated, reduce the chances of an
✔ important moment occurred at lower point.
✔ Redis is single thread.
✔ 效能抖動。
✔ 對於一個上線服務而言,穩定性遠大於平均效能。
✔ 效能防抖動,好預估,降低重要時刻發生在低點的機率。
✔ Redis 是單執行緒。
88/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Performance fluctuation.
✔ Tips: Split heavy commands.
✔ MGET
✔ redis> MGET 1 2 3 … 999
✔ ZRANGE
✔ redis> ZRANGE myset 0 -1
✔ SORT / LREM / SUNION / SDIFF / SINTER
✔ KEYS / SMEMBERS / HGETALL
✔ 效能抖動。
✔ 拆解「重」指令。
✔ MGET 。
✔ redis> MGET 1 2 3 … 999
✔ ZRANGE 。
✔ redis> ZRANGE myset 0 -1
✔ SORT / LREM / SUNION / SDIFF / SINTER 。
✔ KEYS / SMEMBERS / HGETALL 。
89/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Performance fluctuation.
✔ Tips: Rethink block commands.
✔ BLPOP
✔ BRPOPLPUSH
✔ BRPOP
✔ MULTI / EXEC
✔ 效能抖動。
✔ 「阻塞」指令。
✔ BLPOP 。
✔ BRPOPLPUSH 。
✔ BRPOP 。
✔ MULTI / EXEC 。
90/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ Be careful those commands will ask huge memory.
✔ Reduce the chances of Redis to be killed by OOM.
✔ SWAP, lose a little performance is better than crash.
✔ 記憶體不足 (Out of memory, OOM) 。
✔ 留意那些會大量耗用記憶體的指令。
✔ 降低 Redis 強制被 Out of memory 關閉的機率。
✔ 開啟 SWAP ,效能下降總比服務停用來得好。
91/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ maxmemory
✔ overcommit_memory
✔ SWAP
✔ zone_reclaim_mode
✔ oom_adj
✔ 記憶體不足 (Out of memory, OOM) 。
✔ maxmemory
✔ overcommit_memory
✔ SWAP
✔ zone_reclaim_mode
✔ oom_adj
92/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ maxmemory
✔ A rule of thumbs is 50% of total memory.
✔ BGSAVE.
✔ AOF rewrite.
✔ 記憶體不足 (Out of memory, OOM) 。
✔ maxmemory
✔ 經驗法則是設定為總記憶體的 50% 。
✔ BGSAVE 。
✔ AOF rewrite 。
Ref: http://redis.io/topics/admin
93/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ overcommit_memory
✔ overcommit_memory = 1
✔ Do overcommit.
✔ 記憶體不足 (Out of memory, OOM) 。
✔ maxmemory
✔overcommit_memory = 1
✔ 請求分配記憶體時,永遠假裝還有足夠的記憶體。
94/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ SWAP
✔ Use SWAP, and same size of memory.
✔ 記憶體不足 (Out of memory, OOM) 。
✔ SWAP
✔ 使用 SWAP ,並且與記憶體一樣大。
95/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ zone_reclaim_mode
✔ zone_reclaim_mode = 0 (default)
✔ 記憶體不足 (Out of memory, OOM) 。
✔ zone_reclaim_mode
✔ zone_reclaim_mode = 0 ( 預設 )
96/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ If RHEL/CentOS ≧ 6.4 or Kernel ≧ 3.5-rc1.
✔ (1) Prefer swap to OOM.
✔ vm.swappiness = 1
✔ (2) Prefer OOM to swap.
✔ vm.swappiness = 0
✔ Else
✔ vm.swappiness = 0
✔ 記憶體不足 (Out of memory, OOM) 。
✔ 如果 RHEL/CentOS ≧ 6.4 或 Kernel ≧ 3.5-rc1 。
✔ (1) 寧願 swap 也不要 OOM 。
✔ vm.swappiness = 1
✔ (2) 寧願 OOM 也不要 swap 。
✔ vm.swappiness = 0
✔ 否則
✔ vm.swappiness = 0
97/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Out of memory (OOM).
✔ If (1) then oom_adj.
✔ echo -15 > /proc/`pidof redis-server`/oom_adj
✔ Reduce the chances of redis to be killed.
✔ Tips
✔ for i in $(pidof redis-server); 
✔ do echo -15 | sudo tee /proc/$i/oom_adj ; done
✔ 記憶體不足 (Out of memory, OOM) 。
✔ 如果 (1) 則 oom_adj 。
✔ echo -15 > /proc/`pidof redis-server`/oom_adj
✔ 降低 Redis 強制被 Out of memory 關閉的機率。
✔ Tips
✔ for i in $(pidof redis-server); 
✔ do echo -15 | sudo tee /proc/$i/oom_adj ; done
98/123
2015
Insight on the pit 【 Stabilization 】
✔ 過去 vm.swappiness 設定為 0 可以降低 swap 的發生率,
✔ 但非完全禁止。所以預期會發生 swap 而不會 OOM 。
✔ 在 Linux Kernel 3.5-RC1 及 RHEL/CentOS Kernel
✔ 2.6.32-303 (CentOS 6.4) 之後的版本,已經改變此行為。
✔ 設定為 0 時完全不會有任何 swap ,但非預期的記憶體壓力
✔ 可能會造成 OOM 而關閉 Redis 。
99/123
2015
Insight on the pit 【 Stabilization 】
Linux Kernel 3.4 (mm/vmscan.c)
Ref: https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.xz
Ref: https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.1.tar.gz
Linux Kernel 3.5.1 (mm/vmscan.c)
100/123
2015
Insight on the pit 【 Stabilization 】
linux-2.6.32-504.12.2.el6 (CentOS 6.4, mm/vmscan.c)
Ref: http://rpm.pbone.net/index.php3/stat/3/srodzaj/2/search/kernel-2.6.32-504.12.2.el6.src.rpm
101/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Redis instances is same as CPU cores.
✔ Redis have some background tasks.
✔ fsync file descriptor.
✔ close file descriptor.
✔ BGSAVE.
✔ AOF rewrite.
✔ Preserved CPU to do those tasks.
✔ 啟動的 Redis 實例與 CPU 核心數一樣多。
✔ Redis 會執行一些 background tasks 。
✔ fsync file descriptor 。
✔ close file descriptor 。
✔ BGSAVE 。
✔ AOF rewrite 。
✔ 預留一些 CPU 執行這些 tasks 。
102/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Redis instances is same as CPU cores.
✔ Instance have its own synchronization.
✔ Disable automatic on BGSAVE / BGREWRITEAOF,
✔ and use manual control instead.
✔ Avoid execution at the same time.
✔ 啟動的 Redis 實例與 CPU 核心數一樣多。
✔ 每個實例都有自己的同步機制。
✔ 關閉自動 BGSAVE / BGREWRITEAOF ,改為手動。
✔ 避免各實例同時啟動,耗用大量資源。
103/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ Master-slave.
✔ Best practices.
✔ N Redis nodes.
✔ 1 master, 1 slave, N-2 slaves of slave.
✔ Never restart all or multiple slave instances.
✔ (Master) High CPU loading.
✔ (Master) May out of memory.
✔ 主從模式。
✔ 最佳實踐。
✔ N 台 Redis 。
✔ 1 台主服務, 1 台從服務, N-2 台從服務的從服務。
✔ 不要同時重啟所有或大量的 slave 實例。
✔ 造成主服務 CPU 負載過高。
✔ 造成主服務記憶體用量過高。
104/123
2015
Insight on the pit 【 Stabilization 】
坑裡的洞見【穩定性】
✔ String value.
✔ String value can be at max 512 MB in length.
✔ A rule of thumbs is no more than 5KB.
✔ 字串值。
✔ 字串值最大可以儲存 512MB 的長度。
✔ 經驗上最好不要大於 5KB 。
105/123
2015
Insight on the pit
坑裡的洞見
Low latency
低延遲
106/123
2015
很多事都介於
「不說憋屈」
和
「說了矯情」
之間
朕知 道
了
107/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Durability vs latency tradeoffs, from higher to lower
latency.
✔ AOF + fsync always.
✔ AOF + fsync every second.
✔ AOF + fsync every second +
✔ No-appendfsync-on-rewrite set to yes.
✔ AOF + fsync nerver.
✔ RDB.
✔ 數據持久性 vs 延遲性的權衡,延遲性從高至低排列。
✔ AOF + fsync always 。
✔ AOF + fsync every second 。
✔ AOF + fsync every second +
✔ No-appendfsync-on-rewrite set to yes 。
✔ AOF + fsync nerver 。
✔ RDB 。
Ref: http://redis.io/topics/latency
108/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Latency induced by network and communication.
✔ Reduce the numbers of commands.
✔ Pipelining.
✔ MSET / MGET.
✔ 網路造成的延遲性。
✔ 減少指令的使用次數。
✔ Pipelining 。
✔ MSET / MGET 。
Ref: http://redis.io/topics/latency
109/123
2015
Insight on the pit 【 Low latency 】
✔ Fork time in different systems.
✔ 不同系統間的 Fork 時間。
Ref: http://redis.io/topics/latency
Linux on physical machine (Xeon@2.27Ghz)Linux on physical machine (Xeon@2.27Ghz)
Linux VM on EC2 (Xen)Linux VM on EC2 (Xen)
Linux beefy VM on VMwareLinux beefy VM on VMware
Linux on physical machine (Unknown HW)Linux on physical machine (Unknown HW)
Linux VM on 6sync (KVM)Linux VM on 6sync (KVM)
Linux VM on Linode (Xen)Linux VM on Linode (Xen)
9 ms/GB9 ms/GB
10 ms/GB10 ms/GB
12.8 ms/GB12.8 ms/GB
13.1 ms/GB13.1 ms/GB
23.3 ms/GB23.3 ms/GB
424 ms/GB424 ms/GB
Linux on physical machine (Xeon@2.27Ghz)Linux on physical machine (Xeon@2.27Ghz)
Linux VM on EC2 (Xen)Linux VM on EC2 (Xen)
Linux beefy VM on VMwareLinux beefy VM on VMware
Linux on physical machine (Unknown HW)Linux on physical machine (Unknown HW)
Linux VM on 6sync (KVM)Linux VM on 6sync (KVM)
Linux VM on Linode (Xen)Linux VM on Linode (Xen)
9 ms/GB9 ms/GB
10 ms/GB10 ms/GB
12.8 ms/GB12.8 ms/GB
13.1 ms/GB13.1 ms/GB
23.3 ms/GB23.3 ms/GB
424 ms/GB424 ms/GB
坑裡的洞見【低延遲】
110/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Never use Huge page.
✔ echo never >
/sys/kernel/mm/transparent_hugepage/enabled
✔ 永不用 Huge page 。
✔ echo never >
/sys/kernel/mm/transparent_hugepage/enabled
111/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Do you really need Proxy-based solution (Codis) ?
✔ 真的需要代理分片機制 ( 如 Codis) 嗎?
112/123
2015
Insight on the pit 【 Low latency 】
简单的测试,单 redis+ 单 proxy ,默认参数
Ref: https://github.com/wandoulabs/codis/issues/63
~50%
~57%
~428%
~561%
~937%
~50%
113/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Codis.
✔ Disable pipeline.
✔ Less CPU cores.
✔ Codis 。
✔ 停用 pipeline 。
✔ 少核 CPU 。
114/123
2015
Insight on the pit 【 Low latency 】
Disable pipeline.
Ref: https://github.com/wandoulabs/codis/blob/master/doc/benchmark_zh.md
115/123
2015
Insight on the pit 【 Low latency 】
Less CPU cores.
Ref: https://github.com/wandoulabs/codis/blob/master/doc/benchmark_zh.md
4 cores
12 cores 16 cores
8 cores
116/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Big Ziplist.
✔ Adding to and deleting from a ziplist is inefficient,
✔ especially with a very large list.
✔ Deleting from a ziplist uses memmove to move
✔ data around, to make sure the list is still contiguous.
✔ Adding to a ziplist requires a memory realloc call to
✔ make enough space for the new entry.
✔ Big Ziplist 。
✔ 從 Ziplist 中新增或刪除都沒有效率,尤其是 Big Ziplist 。
✔ 從 Ziplist 刪除會利用 memmove 移動資料,以確保 list
✔ 還是連續的。
✔ 在 Ziplist 中新增需要 memory realloc 以產出足夠的空間
✔ 供新值儲存。
Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
117/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Big Ziplist.
✔ Potential high latency for write operations due to
✔ timeline size.
✔ Big Ziplist 。
✔ Ziplist 中的寫操作很可能會因 Big Ziplist 而帶來高延遲。
Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
118/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Redis client.
✔ Connection pool.
✔ Keep alive.
✔ Redis 客戶端。
✔ Connection pool 。
✔ Keep alive 。
119/123
2015
Insight on the pit 【 Low latency 】
坑裡的洞見【低延遲】
✔ Redis 3.0 embedded string.
✔ New "embedded string" object.
✔ Reduce memory operations.
✔ If string length ≦ 39 bytes.
✔ Redis 3.0 embedded string 。
✔ 新的 "embedded string" 物件。
✔ 減少記憶體操作次數。
✔ ≦如果字串長度 39 。
120/123
2015
Insight on the pit 【 Low latency 】
Redis 2.8.20
robj (16 bytes)
sdshdr (8 bytes)
string (N bytes)
ptr
121/123
2015
Insight on the pit 【 Low latency 】
Redis 3.0
robj (16 bytes)
sdshdr (8 bytes)
string (40 bytes)
ptr
In 64 bit system:
jemalloc arena may “64 byte-long”.
64 - 16 (robj) - 8 (sdshdr) = 40
40 - 1 (null term, 0) = 39
2015
122/123
Feedback 勘誤回報
yftzeng@gmail.com
2015
123/123
End 結語
Parvenu use Redis/Memcached (Much memory) ;
TRS use Aerospike (Memory / SSD mixed) ;
Mortals use SSDB (Disk only) 。
暴發戶用 Redis/Memcached ( 記憶體多 ) ;
高富帥用 Aerospike ( 記憶體與 SSD 混用 ) ;
平民級用 SSDB ( 記憶體缺 ) 。

More Related Content

What's hot

Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack CloudJourney to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack CloudPatrick McGarry
 
Caching solutions with Redis
Caching solutions   with RedisCaching solutions   with Redis
Caching solutions with RedisGeorge Platon
 
Ceph Day Bring Ceph To Enterprise
Ceph Day Bring Ceph To EnterpriseCeph Day Bring Ceph To Enterprise
Ceph Day Bring Ceph To EnterpriseAlex Lau
 
Performance comparison of Distributed File Systems on 1Gbit networks
Performance comparison of Distributed File Systems on 1Gbit networksPerformance comparison of Distributed File Systems on 1Gbit networks
Performance comparison of Distributed File Systems on 1Gbit networksMarian Marinov
 
Redis memcached pdf
Redis memcached pdfRedis memcached pdf
Redis memcached pdfErin O'Neill
 
CephFS in Jewel: Stable at Last
CephFS in Jewel: Stable at LastCephFS in Jewel: Stable at Last
CephFS in Jewel: Stable at LastCeph Community
 
Ceph Performance and Sizing Guide
Ceph Performance and Sizing GuideCeph Performance and Sizing Guide
Ceph Performance and Sizing GuideJose De La Rosa
 
Redis overview for Software Architecture Forum
Redis overview for Software Architecture ForumRedis overview for Software Architecture Forum
Redis overview for Software Architecture ForumChristopher Spring
 
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...Ontico
 
Software defined storage
Software defined storageSoftware defined storage
Software defined storageGluster.org
 
High Availability Storage (susecon2016)
High Availability Storage (susecon2016)High Availability Storage (susecon2016)
High Availability Storage (susecon2016)Roger Zhou 周志强
 
Trying and evaluating the new features of GlusterFS 3.5
Trying and evaluating the new features of GlusterFS 3.5Trying and evaluating the new features of GlusterFS 3.5
Trying and evaluating the new features of GlusterFS 3.5Keisuke Takahashi
 
Redis sentinelinternals deview
Redis sentinelinternals deviewRedis sentinelinternals deview
Redis sentinelinternals deviewDaeMyung Kang
 
Performance analysis with_ceph
Performance analysis with_cephPerformance analysis with_ceph
Performance analysis with_cephAlex Lau
 
Windows Server 2016 Webinar
Windows Server 2016 WebinarWindows Server 2016 Webinar
Windows Server 2016 WebinarMen and Mice
 
Comparison of foss distributed storage
Comparison of foss distributed storageComparison of foss distributed storage
Comparison of foss distributed storageMarian Marinov
 
Your 1st Ceph cluster
Your 1st Ceph clusterYour 1st Ceph cluster
Your 1st Ceph clusterMirantis
 
MySQL HA with PaceMaker
MySQL HA with  PaceMakerMySQL HA with  PaceMaker
MySQL HA with PaceMakerKris Buytaert
 

What's hot (20)

Redis acc 2015_eng
Redis acc 2015_engRedis acc 2015_eng
Redis acc 2015_eng
 
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack CloudJourney to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
 
Caching solutions with Redis
Caching solutions   with RedisCaching solutions   with Redis
Caching solutions with Redis
 
Ceph Day Bring Ceph To Enterprise
Ceph Day Bring Ceph To EnterpriseCeph Day Bring Ceph To Enterprise
Ceph Day Bring Ceph To Enterprise
 
Performance comparison of Distributed File Systems on 1Gbit networks
Performance comparison of Distributed File Systems on 1Gbit networksPerformance comparison of Distributed File Systems on 1Gbit networks
Performance comparison of Distributed File Systems on 1Gbit networks
 
Redis memcached pdf
Redis memcached pdfRedis memcached pdf
Redis memcached pdf
 
CephFS in Jewel: Stable at Last
CephFS in Jewel: Stable at LastCephFS in Jewel: Stable at Last
CephFS in Jewel: Stable at Last
 
Ceph Performance and Sizing Guide
Ceph Performance and Sizing GuideCeph Performance and Sizing Guide
Ceph Performance and Sizing Guide
 
Redis overview for Software Architecture Forum
Redis overview for Software Architecture ForumRedis overview for Software Architecture Forum
Redis overview for Software Architecture Forum
 
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...
Как Web-акселератор акселерирует ваш сайт / Александр Крижановский (Tempesta ...
 
Software defined storage
Software defined storageSoftware defined storage
Software defined storage
 
High Availability Storage (susecon2016)
High Availability Storage (susecon2016)High Availability Storage (susecon2016)
High Availability Storage (susecon2016)
 
Trying and evaluating the new features of GlusterFS 3.5
Trying and evaluating the new features of GlusterFS 3.5Trying and evaluating the new features of GlusterFS 3.5
Trying and evaluating the new features of GlusterFS 3.5
 
Redis sentinelinternals deview
Redis sentinelinternals deviewRedis sentinelinternals deview
Redis sentinelinternals deview
 
Performance analysis with_ceph
Performance analysis with_cephPerformance analysis with_ceph
Performance analysis with_ceph
 
Windows Server 2016 Webinar
Windows Server 2016 WebinarWindows Server 2016 Webinar
Windows Server 2016 Webinar
 
Comparison of foss distributed storage
Comparison of foss distributed storageComparison of foss distributed storage
Comparison of foss distributed storage
 
Your 1st Ceph cluster
Your 1st Ceph clusterYour 1st Ceph cluster
Your 1st Ceph cluster
 
Bluestore
BluestoreBluestore
Bluestore
 
MySQL HA with PaceMaker
MySQL HA with  PaceMakerMySQL HA with  PaceMaker
MySQL HA with PaceMaker
 

Viewers also liked

淺入淺出 MySQL & PostgreSQL
淺入淺出 MySQL & PostgreSQL淺入淺出 MySQL & PostgreSQL
淺入淺出 MySQL & PostgreSQLYi-Feng Tzeng
 
恰如其分的 MySQL 設計技巧 [Modern Web 2016]
恰如其分的 MySQL 設計技巧 [Modern Web 2016]恰如其分的 MySQL 設計技巧 [Modern Web 2016]
恰如其分的 MySQL 設計技巧 [Modern Web 2016]Yi-Feng Tzeng
 
軟體接案自由職業者 (Freelancer) 意想不到的風險
軟體接案自由職業者 (Freelancer) 意想不到的風險軟體接案自由職業者 (Freelancer) 意想不到的風險
軟體接案自由職業者 (Freelancer) 意想不到的風險Yi-Feng Tzeng
 
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議Yi-Feng Tzeng
 
資料庫索引數據結構及主鍵設計(b+tree)(part 1)
資料庫索引數據結構及主鍵設計(b+tree)(part 1)資料庫索引數據結構及主鍵設計(b+tree)(part 1)
資料庫索引數據結構及主鍵設計(b+tree)(part 1)Yi-Feng Tzeng
 
Enterprise Architecture Case in PHP (MUZIK Online)
Enterprise Architecture Case in PHP (MUZIK Online)Enterprise Architecture Case in PHP (MUZIK Online)
Enterprise Architecture Case in PHP (MUZIK Online)Yi-Feng Tzeng
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1Yi-Feng Tzeng
 
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)Yi-Feng Tzeng
 
The Future of Classical Music
The Future of Classical MusicThe Future of Classical Music
The Future of Classical MusicYi-Feng Tzeng
 
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊20130112 web conf-面向網站經營者及網站用戶的個資法衝擊
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊Yi-Feng Tzeng
 
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解Yi-Feng Tzeng
 
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)Yi-Feng Tzeng
 
PHPConf.TW 2012: A step to better PHP
PHPConf.TW 2012: A step to better PHPPHPConf.TW 2012: A step to better PHP
PHPConf.TW 2012: A step to better PHPYi-Feng Tzeng
 
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richardYi-Feng Tzeng
 
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillightYi-Feng Tzeng
 
2013-04-13_JSTW-security-for-frontend-engineer (前傳)
2013-04-13_JSTW-security-for-frontend-engineer (前傳)2013-04-13_JSTW-security-for-frontend-engineer (前傳)
2013-04-13_JSTW-security-for-frontend-engineer (前傳)Yi-Feng Tzeng
 
2014-04-24 社群經營的法律議題-ant
2014-04-24 社群經營的法律議題-ant2014-04-24 社群經營的法律議題-ant
2014-04-24 社群經營的法律議題-antYi-Feng Tzeng
 
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225Yi-Feng Tzeng
 
2014 03-14 PunApp-InstAll15-山寨的界限
2014 03-14 PunApp-InstAll15-山寨的界限2014 03-14 PunApp-InstAll15-山寨的界限
2014 03-14 PunApp-InstAll15-山寨的界限Yi-Feng Tzeng
 
Redis High availability and fault tolerance in a multitenant environment
Redis High availability and fault tolerance in a multitenant environmentRedis High availability and fault tolerance in a multitenant environment
Redis High availability and fault tolerance in a multitenant environmentIccha Sethi
 

Viewers also liked (20)

淺入淺出 MySQL & PostgreSQL
淺入淺出 MySQL & PostgreSQL淺入淺出 MySQL & PostgreSQL
淺入淺出 MySQL & PostgreSQL
 
恰如其分的 MySQL 設計技巧 [Modern Web 2016]
恰如其分的 MySQL 設計技巧 [Modern Web 2016]恰如其分的 MySQL 設計技巧 [Modern Web 2016]
恰如其分的 MySQL 設計技巧 [Modern Web 2016]
 
軟體接案自由職業者 (Freelancer) 意想不到的風險
軟體接案自由職業者 (Freelancer) 意想不到的風險軟體接案自由職業者 (Freelancer) 意想不到的風險
軟體接案自由職業者 (Freelancer) 意想不到的風險
 
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議
 
資料庫索引數據結構及主鍵設計(b+tree)(part 1)
資料庫索引數據結構及主鍵設計(b+tree)(part 1)資料庫索引數據結構及主鍵設計(b+tree)(part 1)
資料庫索引數據結構及主鍵設計(b+tree)(part 1)
 
Enterprise Architecture Case in PHP (MUZIK Online)
Enterprise Architecture Case in PHP (MUZIK Online)Enterprise Architecture Case in PHP (MUZIK Online)
Enterprise Architecture Case in PHP (MUZIK Online)
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
 
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)
2014-10-25 App 及 Maker 開發者防身術 (MOPCON 2014)
 
The Future of Classical Music
The Future of Classical MusicThe Future of Classical Music
The Future of Classical Music
 
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊20130112 web conf-面向網站經營者及網站用戶的個資法衝擊
20130112 web conf-面向網站經營者及網站用戶的個資法衝擊
 
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解
[BizLePro] 主題講座 #7:商業利用怎麼行? - 從開源授權十個常見 FAQ 來了解
 
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)
2013-05-18_JSDC.TW-security-for-frontend-engineer-final (後傳)
 
PHPConf.TW 2012: A step to better PHP
PHPConf.TW 2012: A step to better PHPPHPConf.TW 2012: A step to better PHP
PHPConf.TW 2012: A step to better PHP
 
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard
[BizLePro] 主題講座 #4:給資訊人的智財導論_20130429_richard
 
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight
[BizLePro] 主題講座 #5:台灣C2C第三方支付服務之發展_20130513_gillight
 
2013-04-13_JSTW-security-for-frontend-engineer (前傳)
2013-04-13_JSTW-security-for-frontend-engineer (前傳)2013-04-13_JSTW-security-for-frontend-engineer (前傳)
2013-04-13_JSTW-security-for-frontend-engineer (前傳)
 
2014-04-24 社群經營的法律議題-ant
2014-04-24 社群經營的法律議題-ant2014-04-24 社群經營的法律議題-ant
2014-04-24 社群經營的法律議題-ant
 
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225
[CBLP] 個資法雙連發-怪怪的個資法-ox-20130225
 
2014 03-14 PunApp-InstAll15-山寨的界限
2014 03-14 PunApp-InstAll15-山寨的界限2014 03-14 PunApp-InstAll15-山寨的界限
2014 03-14 PunApp-InstAll15-山寨的界限
 
Redis High availability and fault tolerance in a multitenant environment
Redis High availability and fault tolerance in a multitenant environmentRedis High availability and fault tolerance in a multitenant environment
Redis High availability and fault tolerance in a multitenant environment
 

Similar to Redis, another step on the road

Troubleshooting Redis- DaeMyung Kang, Kakao
Troubleshooting Redis- DaeMyung Kang, KakaoTroubleshooting Redis- DaeMyung Kang, Kakao
Troubleshooting Redis- DaeMyung Kang, KakaoRedis Labs
 
Troubleshooting redis
Troubleshooting redisTroubleshooting redis
Troubleshooting redisDaeMyung Kang
 
10 Ways to Scale with Redis - LA Redis Meetup 2019
10 Ways to Scale with Redis - LA Redis Meetup 201910 Ways to Scale with Redis - LA Redis Meetup 2019
10 Ways to Scale with Redis - LA Redis Meetup 2019Dave Nielsen
 
Quick-and-Easy Deployment of a Ceph Storage Cluster
Quick-and-Easy Deployment of a Ceph Storage ClusterQuick-and-Easy Deployment of a Ceph Storage Cluster
Quick-and-Easy Deployment of a Ceph Storage ClusterPatrick Quairoli
 
What's new with enterprise Redis - Leena Joshi, Redis Labs
What's new with enterprise Redis - Leena Joshi, Redis LabsWhat's new with enterprise Redis - Leena Joshi, Redis Labs
What's new with enterprise Redis - Leena Joshi, Redis LabsRedis Labs
 
Day 2 General Session Presentations RedisConf
Day 2 General Session Presentations RedisConfDay 2 General Session Presentations RedisConf
Day 2 General Session Presentations RedisConfRedis Labs
 
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory Engine
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory EngineRedis vs. MongoDB: Comparing In-Memory Databases with Percona Memory Engine
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory EngineScaleGrid.io
 
RedisConf18 - My Other Car is a Redis Cluster
RedisConf18 - My Other Car is a Redis ClusterRedisConf18 - My Other Car is a Redis Cluster
RedisConf18 - My Other Car is a Redis ClusterRedis Labs
 
Container Storage Best Practices in 2017
Container Storage Best Practices in 2017Container Storage Best Practices in 2017
Container Storage Best Practices in 2017Keith Resar
 
MagentoECG-UsingRedisasaCacheBackendinMagento
MagentoECG-UsingRedisasaCacheBackendinMagentoMagentoECG-UsingRedisasaCacheBackendinMagento
MagentoECG-UsingRedisasaCacheBackendinMagentoKirill Morozov
 
How you can benefit from using Redis - Ramirez
How you can benefit from using Redis - RamirezHow you can benefit from using Redis - Ramirez
How you can benefit from using Redis - RamirezCodemotion
 
HPTS 2011: The NoSQL Ecosystem
HPTS 2011: The NoSQL EcosystemHPTS 2011: The NoSQL Ecosystem
HPTS 2011: The NoSQL EcosystemAdam Marcus
 
The NoSQL Ecosystem
The NoSQL Ecosystem The NoSQL Ecosystem
The NoSQL Ecosystem yarapavan
 
10 Ways to Scale Your Website Silicon Valley Code Camp 2019
10 Ways to Scale Your Website Silicon Valley Code Camp 201910 Ways to Scale Your Website Silicon Valley Code Camp 2019
10 Ways to Scale Your Website Silicon Valley Code Camp 2019Dave Nielsen
 
Everything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askEverything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askCarlos Abalde
 
Developing polyglot persistence applications (SpringOne India 2012)
Developing polyglot persistence applications (SpringOne India 2012)Developing polyglot persistence applications (SpringOne India 2012)
Developing polyglot persistence applications (SpringOne India 2012)Chris Richardson
 
(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep Dive(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep DiveAmazon Web Services
 

Similar to Redis, another step on the road (20)

Redis 101
Redis 101Redis 101
Redis 101
 
Troubleshooting Redis- DaeMyung Kang, Kakao
Troubleshooting Redis- DaeMyung Kang, KakaoTroubleshooting Redis- DaeMyung Kang, Kakao
Troubleshooting Redis- DaeMyung Kang, Kakao
 
Troubleshooting redis
Troubleshooting redisTroubleshooting redis
Troubleshooting redis
 
10 Ways to Scale with Redis - LA Redis Meetup 2019
10 Ways to Scale with Redis - LA Redis Meetup 201910 Ways to Scale with Redis - LA Redis Meetup 2019
10 Ways to Scale with Redis - LA Redis Meetup 2019
 
Quick-and-Easy Deployment of a Ceph Storage Cluster
Quick-and-Easy Deployment of a Ceph Storage ClusterQuick-and-Easy Deployment of a Ceph Storage Cluster
Quick-and-Easy Deployment of a Ceph Storage Cluster
 
What's new with enterprise Redis - Leena Joshi, Redis Labs
What's new with enterprise Redis - Leena Joshi, Redis LabsWhat's new with enterprise Redis - Leena Joshi, Redis Labs
What's new with enterprise Redis - Leena Joshi, Redis Labs
 
Day 2 General Session Presentations RedisConf
Day 2 General Session Presentations RedisConfDay 2 General Session Presentations RedisConf
Day 2 General Session Presentations RedisConf
 
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory Engine
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory EngineRedis vs. MongoDB: Comparing In-Memory Databases with Percona Memory Engine
Redis vs. MongoDB: Comparing In-Memory Databases with Percona Memory Engine
 
RedisConf18 - My Other Car is a Redis Cluster
RedisConf18 - My Other Car is a Redis ClusterRedisConf18 - My Other Car is a Redis Cluster
RedisConf18 - My Other Car is a Redis Cluster
 
Container Storage Best Practices in 2017
Container Storage Best Practices in 2017Container Storage Best Practices in 2017
Container Storage Best Practices in 2017
 
MagentoECG-UsingRedisasaCacheBackendinMagento
MagentoECG-UsingRedisasaCacheBackendinMagentoMagentoECG-UsingRedisasaCacheBackendinMagento
MagentoECG-UsingRedisasaCacheBackendinMagento
 
Introduction to redis
Introduction to redisIntroduction to redis
Introduction to redis
 
How you can benefit from using Redis - Ramirez
How you can benefit from using Redis - RamirezHow you can benefit from using Redis - Ramirez
How you can benefit from using Redis - Ramirez
 
HPTS 2011: The NoSQL Ecosystem
HPTS 2011: The NoSQL EcosystemHPTS 2011: The NoSQL Ecosystem
HPTS 2011: The NoSQL Ecosystem
 
The NoSQL Ecosystem
The NoSQL Ecosystem The NoSQL Ecosystem
The NoSQL Ecosystem
 
Redis meetup
Redis meetupRedis meetup
Redis meetup
 
10 Ways to Scale Your Website Silicon Valley Code Camp 2019
10 Ways to Scale Your Website Silicon Valley Code Camp 201910 Ways to Scale Your Website Silicon Valley Code Camp 2019
10 Ways to Scale Your Website Silicon Valley Code Camp 2019
 
Everything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askEverything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to ask
 
Developing polyglot persistence applications (SpringOne India 2012)
Developing polyglot persistence applications (SpringOne India 2012)Developing polyglot persistence applications (SpringOne India 2012)
Developing polyglot persistence applications (SpringOne India 2012)
 
(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep Dive(DAT407) Amazon ElastiCache: Deep Dive
(DAT407) Amazon ElastiCache: Deep Dive
 

More from Yi-Feng Tzeng

重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical DecisionYi-Feng Tzeng
 
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版Yi-Feng Tzeng
 
Testing in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysTesting in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysYi-Feng Tzeng
 
COSCUP 2020 Day 2 - Opening Keynote
COSCUP 2020 Day 2 - Opening KeynoteCOSCUP 2020 Day 2 - Opening Keynote
COSCUP 2020 Day 2 - Opening KeynoteYi-Feng Tzeng
 
COSCUP 2020 Day 1 - Opening Keynote
COSCUP 2020 Day 1 - Opening KeynoteCOSCUP 2020 Day 1 - Opening Keynote
COSCUP 2020 Day 1 - Opening KeynoteYi-Feng Tzeng
 
Severless PHP Case : Agile Dashboard via GitLab Board API
Severless PHP Case : Agile Dashboard via GitLab Board APISeverless PHP Case : Agile Dashboard via GitLab Board API
Severless PHP Case : Agile Dashboard via GitLab Board APIYi-Feng Tzeng
 
給資安工程師開源授權觀念
給資安工程師開源授權觀念給資安工程師開源授權觀念
給資安工程師開源授權觀念Yi-Feng Tzeng
 
Progressive Deployment & NoDeploy
Progressive Deployment & NoDeployProgressive Deployment & NoDeploy
Progressive Deployment & NoDeployYi-Feng Tzeng
 
Dev(Sec)Ops - Architecture for Security and Compliance
Dev(Sec)Ops - Architecture for Security and ComplianceDev(Sec)Ops - Architecture for Security and Compliance
Dev(Sec)Ops - Architecture for Security and ComplianceYi-Feng Tzeng
 
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊擁抱開源:企業應如何善用開源技術,才能得其利而防其弊
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊Yi-Feng Tzeng
 
淺談量子機器學習 - 當機器學習遇見量子計算
淺談量子機器學習 - 當機器學習遇見量子計算淺談量子機器學習 - 當機器學習遇見量子計算
淺談量子機器學習 - 當機器學習遇見量子計算Yi-Feng Tzeng
 
A Modern Web Architecture for (GDPR) Compliance
A Modern Web Architecture for (GDPR) ComplianceA Modern Web Architecture for (GDPR) Compliance
A Modern Web Architecture for (GDPR) ComplianceYi-Feng Tzeng
 
量子技術 (2018 03-31)
量子技術 (2018 03-31)量子技術 (2018 03-31)
量子技術 (2018 03-31)Yi-Feng Tzeng
 
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)Yi-Feng Tzeng
 
Modern Web Architecture Design Journey
Modern Web Architecture Design JourneyModern Web Architecture Design Journey
Modern Web Architecture Design JourneyYi-Feng Tzeng
 

More from Yi-Feng Tzeng (16)

重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision
 
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊-加強版
 
Testing in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysTesting in Production, Deploy on Fridays
Testing in Production, Deploy on Fridays
 
COSCUP 2020 Day 2 - Opening Keynote
COSCUP 2020 Day 2 - Opening KeynoteCOSCUP 2020 Day 2 - Opening Keynote
COSCUP 2020 Day 2 - Opening Keynote
 
COSCUP 2020 Day 1 - Opening Keynote
COSCUP 2020 Day 1 - Opening KeynoteCOSCUP 2020 Day 1 - Opening Keynote
COSCUP 2020 Day 1 - Opening Keynote
 
Severless PHP Case : Agile Dashboard via GitLab Board API
Severless PHP Case : Agile Dashboard via GitLab Board APISeverless PHP Case : Agile Dashboard via GitLab Board API
Severless PHP Case : Agile Dashboard via GitLab Board API
 
給資安工程師開源授權觀念
給資安工程師開源授權觀念給資安工程師開源授權觀念
給資安工程師開源授權觀念
 
Progressive Deployment & NoDeploy
Progressive Deployment & NoDeployProgressive Deployment & NoDeploy
Progressive Deployment & NoDeploy
 
Dev(Sec)Ops - Architecture for Security and Compliance
Dev(Sec)Ops - Architecture for Security and ComplianceDev(Sec)Ops - Architecture for Security and Compliance
Dev(Sec)Ops - Architecture for Security and Compliance
 
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊擁抱開源:企業應如何善用開源技術,才能得其利而防其弊
擁抱開源:企業應如何善用開源技術,才能得其利而防其弊
 
淺談量子機器學習 - 當機器學習遇見量子計算
淺談量子機器學習 - 當機器學習遇見量子計算淺談量子機器學習 - 當機器學習遇見量子計算
淺談量子機器學習 - 當機器學習遇見量子計算
 
A Modern Web Architecture for (GDPR) Compliance
A Modern Web Architecture for (GDPR) ComplianceA Modern Web Architecture for (GDPR) Compliance
A Modern Web Architecture for (GDPR) Compliance
 
量子技術 (2018 03-31)
量子技術 (2018 03-31)量子技術 (2018 03-31)
量子技術 (2018 03-31)
 
Swoole Love PHP
Swoole Love PHPSwoole Love PHP
Swoole Love PHP
 
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)
邏輯優化的灰色面:針對網頁應用的時序攻擊 (2018臺灣資安大會: 軟體安全論壇)
 
Modern Web Architecture Design Journey
Modern Web Architecture Design JourneyModern Web Architecture Design Journey
Modern Web Architecture Design Journey
 

Recently uploaded

Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfDrew Moseley
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentationvaddepallysandeep122
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 

Recently uploaded (20)

Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdf
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentation
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 

Redis, another step on the road

  • 1. Redis, another step on the road 2015-05-15 Ant yftzeng@gmail.com
  • 2. 2015 2/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 3. 2015 3/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 4. 4/123 2015 Redis history Redis 歷史 Redis 2.0 ✔ Key-value store policy, key in memory, value in disk. Redis 2.0 ✔ Key-value 儲存策略, key 存記憶體, value 存硬碟。
  • 5. 5/123 2015 Redis history Redis 歷史 Redis 2.4 ✔ Key-value store policy, both key & vlaue are in memory. ✔ Add 2 background threads, ✔ fsync file descriptor. ✔ close file descriptor. Redis 2.4 ✔ Key-value 儲存策略, key 及 value 存記憶體。 ✔ 除了 main thread 外,引入了 2 個 background threads, ✔ fsync file descriptor 。 ✔ close file descriptor 。
  • 6. 6/123 2015 Redis history Redis 歷史 Redis 2.6 ✔ Server side Lua scripting. ✔ Virtual Memory removed. ✔ Milliseconds resolution expires. ✔ Removed hardcoded number of clients. Redis 2.6 ✔ 伺服器端支援 Lua 。 ✔ 移除 Virtual Memory 。 ✔ 「 Expires 」的毫秒精準度。 ✔ 移除寫死的客戶端數量限制。
  • 7. 7/123 2015 Redis history Redis 歷史 Redis 2.8 ✔ Saving synchronization resource. ✔ Before 2.8, slave use SYNC with the master. ✔ After 2.8, slave use PSYNC with the master. Redis 2.8 ✔ 節省同步資源。 ✔ 2.8 以前, slave 使用 SYNC 與 master 同步。 ✔ 2.8 以後,改用 PSYNC ( 偏移量同步 ) 與 master 同步。
  • 8. 2015 8/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 9. 9/123 2015 Redis 3.0 Redis 3.0 Release date: 1 Apr 2015. ✔ Redis Cluster. ✔ New "embedded string" object. ✔ Improved LRU approximation algorithm. 2015 年 4 月 1 日正式釋出。 ✔ Redis Cluster 。 ✔ “新的 embedded string” 。 ✔ LRU 演算法的改進。
  • 10. 2015 10/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 11. 11/123 2015 Redis features Redis 特性 ✔ RDBMS ✔ Oracle, DB2, PostgreSQL, MySQL, SQL Server, ... ✔ NoSQL ✔ Cassandra, HBase, Memcached, MongoDB, Redis, ... ✔ NewSQL ✔ Aerospike, FoundationDB, RethinkDB, ... ✔ RDBMS ✔ Oracle, DB2, PostgreSQL, MySQL, SQL Server, ... ✔ NoSQL ✔ Cassandra, HBase, Memcached, MongoDB, Redis, ... ✔ NewSQL ✔ Aerospike, FoundationDB, RethinkDB, ...
  • 12. 12/123 2015 Redis features Redis 特性 ✔ Key-value NoSQL ✔ Memcached, Redis, ... ✔ Column family NoSQL ✔ Cassandra, HBase, ... ✔ Documen NoSQL ✔ MongoDB, ... ✔ Graph NoSQL ✔ Neo4j, ... ✔ Key-value NoSQL ✔ Memcached, Redis, ... ✔ Column family NoSQL ✔ Cassandra, HBase, ... ✔ Documen NoSQL ✔ MongoDB, ... ✔ Graph NoSQL ✔ Neo4j, ...
  • 13. 13/123 2015 Redis features Redis 特性 Pure ✔ ANSI C. ✔ Lesser 3rd -party libraries. ✔ Memcached depends on libevent. ✔ Redis implement its own epoll event loop. ✔ KISS principle. ✔ Data structure do what it should do. 簡純 ✔ ANSI C 撰寫。 ✔ 幾乎不依賴第三方函式庫。 ✔ memcached 使用 libevent ,程式碼龐大。 ✔ Redis 參考 libevent 實現了自己的 epoll event loop 。 ✔ KISS 原則。 ✔ 每個數據結構只負責自己應當做的。
  • 14. 14/123 2015 Redis features Redis 特性 Simple ✔ No map-reduce. ✔ No indexes. ✔ No vector clocks. 簡單 ✔ No map-reduce. ✔ No indexes. ✔ No vector clocks.
  • 15. 15/123 2015 Redis features Ref: http://oldblog.antirez.com/post/redis-manifesto.html 5 - We're against complexity. We believe designing systems is a fight against complexity. We'll accept to fight the complexity when it's worthwhile but we'll try hard to recognize when a small feature is not worth 1000s of lines of code. Most of the time the best way to fight complexity is by not creating it at all.
  • 16. 16/123 2015 Redis features Redis 特性 Single thread ✔ No thread context switch. ✔ No thread race condition. ✔ No other complicated condition. 單執行緒 ✔ No thread context switch. ✔ No thread race condition. ✔ No other complicated condition.
  • 17. 17/123 2015 Redis features Redis 特性 In-memory but persistent on disk database ✔ Operation in memory. ✔ Persistent on disk. 記憶體資料庫,但可永久儲存於硬碟中 ✔ 記憶體操作資料。 ✔ 資料可永久儲存於硬碟。
  • 18. 18/123 2015 Redis features Redis 特性 Remote dictionary server ✔ No only a cache server. Remote dictionary server ✔ 不只是快取伺服器。 Ref: http://redis.io/topics/faq
  • 19. 2015 19/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 20. 20/123 2015 Redis and Memcached Redis 與 Memcached ✔ Redis is single thread IO multiplexing model. ✔ Simple operations to archive high throughput. ✔ Complicated (heavy) operations may block others. ✔ One instance usually only use one CPU. ✔ Redis 是單執行緒 IO 多路複用模式。 ✔ 簡單的操作可以達到高吞吐。 ✔ 複雜的操作容易阻塞其它的操作。 ✔ 一個 Redis 實例通常只會用到一顆 CPU 。
  • 21. 21/123 2015 Redis and Memcached Redis 與 Memcached ✔ Memcached is multi-threaded, non-blocking IO ✔ multiplexing network model. ✔ Multi-core architecture. ✔ But got cache coherency & lock issues. ✔ Memcached 是多執行緒非阻塞 IO 多路複用模式。 ✔ 多執行緒可善用多顆 CPU 。 ✔ 但會引入 cache coherency 及 lock 問題。
  • 22. 22/123 2015 Redis and Memcached Redis 與 Memcached ✔ Redis can use jemalloc or tcmalloc to reduce ✔ memory fragmentation. ✔ But it depends on the allocation patterns. ✔ Rarely use the Free-list and other ways to optimize ✔ memory allocation. ✔ Redis is simple / pure / efficiency design. ✔ Redis 使用 jemalloc 或 tcmalloc 降低記憶體碎片。 ✔ 但記憶體碎片的情形仍依賴於分配模式。 ✔ 幾乎不用 Free-list 及其它方法來最佳化記憶體分配。 ✔ 符合 Redis 簡單 / 單純 / 效率的設計原則。 Ref: http://www.databaseskill.com/1256096/ Ref: http://stackoverflow.com/questions/18097670/why-the-memory-fragmentation-is-less-than-1-in-redis
  • 23. 23/123 2015 Redis and Memcached Redis 與 Memcached ✔ Memcached use pre-allocated / slot memory pool. ✔ slot and pool can reduce memory fragmentation. ✔ But bring some wasted space. (memory overhead) ✔ Memcached 使用預分配 slot 記憶體池。 ✔ slot 及池能有效降低某種程度的記憶體碎片。 ✔ 但會帶來一些空間浪費的問題。 (memory overhead)
  • 24. 24/123 2015 Redis and Memcached Redis 與 Memcached ✔ Garbage Collection behavior: approximate LRU. ✔ Redis 2.6 ✔ Random pick 3 samples, removed the oldest one, ✔ repeatedly until memory used less than ✔ 'maxmemory' limit. ✔ 垃圾回收行為:近似 LRU 演算法。 ✔ Redis 2.6 ✔ 預設隨機取 3 個樣本,移除最舊的該筆,如此反覆, ✔ 直到記憶體用量小於 maxmemory 的設定。 Ref: https://github.com/antirez/redis/blob/2.6/src/redis.c#L2464
  • 25. 25/123 2015 Redis and Memcached Ref: https://github.com/antirez/redis/blob/2.6/src/redis.c#L2464
  • 26. 26/123 2015 Redis and Memcached Redis 與 Memcached ✔ Garbage Collection behavior: approximate LRU. ✔ Redis 3.0 ✔ Default random pick 5 samples, insert/sort into ✔ a pool, remove the best one, repeatedly until ✔ memory used less than 'maxmemory' limit. ✔ 5 (now) is more than 3 (before) samples ; ✔ The best one is more approximate global. ✔ 垃圾回收行為: approximate LRU 。 ✔ Redis 3.0 ✔ 預設隨機取 5 個樣本,插入並排序至一個 pool ,移除 ✔ 最佳者,如此反覆,直到記憶體用量小於 maxmemory ✔ 的設定。 ✔ 樣本 5 比先前的 3 多; ✔ 從局部最優趨向全局最優。 Ref: https://github.com/antirez/redis/blob/3.0/src/redis.c#L3251
  • 27. 27/123 2015 Redis and Memcached Ref: https://github.com/antirez/redis/blob/3.0/src/redis.c#L3251
  • 28. 28/123 2015 Redis and Memcached Ref: http://redis.io/images/redisdoc/lru_comparison.png
  • 29. 29/123 2015 Redis and Memcached Redis 與 Memcached ✔ Strong sides of Redis. ✔ Rich (data type) operations. ✔ Hashs, Lists, Sets, Sorted Sets, HyperLogLog etc. ✔ Bulit-in replication & cluster. ✔ in-place update operations. ✔ Support persistent on disk. ✔ Avoid thundering herd. ✔ Redis 的長處。 ✔ 豐富的 ( 資料型態 ) 操作。 ✔ Hashs, Lists, Sets, Sorted Sets, HyperLogLog 等。 ✔ 內建 replication 及 cluster 。 ✔ 就地更新 (in-place update) 操作。 ✔ 支援持久化 ( 硬碟 ) 。 ✔ 避免雪崩效應。
  • 30. 30/123 2015 Redis and Memcached Redis 與 Memcached ✔ Strong sides of Memcached. ✔ Multi-threaded. ✔ Use almost all CPUs. ✔ Fewer blocking operations. ( And center locks don't scaled up to 5 threads ) ✔ Lower memory overhead. ✔ Lower memory allocation pressure. ✔ Maybe less memory fragmentation. ✔ Memcached 的長處。 ✔ 多執行緒。 ✔ 善用多核 CPU 。 ( 而 center locks 不隨 CPU 擴展 ) ✔ 更少的阻塞操作。 ✔ 更少的記憶體開銷。 ✔ 更少的記憶體分配壓力。 ✔ 可能有更少的記憶體碎片。 Ref: https://github.com/memcached/memcached/blob/master/thread.c#L747
  • 31. 31/123 2015 Redis and Memcached Ref: https://github.com/memcached/memcached/blob/master/thread.c#L747
  • 32. 32/123 2015 Redis and Memcached Redis 與 Memcached ✔ My testbed (NO WARRANTY) ✔ Get: Memcached is usually faster than Redis. ✔ Set: Redis is usually faster than Memcached. ✔ Size from 0 ~ 100KB is better for Redis. ✔ Size from 100KB ~ 10MB is better for Memcached. ✔ Size from 10M ~ is better for Redis. ✔ 我的使用經驗 ( 免責聲明 ) ✔ Get 時, Memcached 比 Redis 快。 ✔ Set 時, Redis 比 Memcached 快。 ✔ 數據 0~100KB 時,適合 Redis 。 ✔ 數據 100KB~10MB 時,適合 Memcached 。 ✔ 數據 10M 以上時,適合 Redis 。
  • 34. 2015 34/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 35. 35/123 2015 Redis and Aerospike Ref: http://www.aerospike.com/ ✔ Speed ✔ Scalable ✔ Flash-optimized ✔ In-memory NoSQL ✔ ACID Compliant
  • 36. 36/123 2015 Redis and Aerospike Redis 與 Aerospike ✔ Strong sides of Aerospike. ✔ Auto node discovery (cluster). ✔ ACID Compliant ✔ Flash-optimized (Memory & Disk persistence). ✔ Intelligent Client (Optimistic row locking etc.). ✔ Cross data center replication. ✔ Multi-core optimization. ✔ No hotspots. ✔ Aerospike 的長處。 ✔ 自管理集群。 ✔ ACID 兼容。 ✔ 數據存儲最佳化 (Flash/SSD) 。 ✔ 智能客戶端 (Optimistic row locking 等 ) 。 ✔ 跨數據中心集群。 ✔ 多核最佳化。 ✔ 無熱點瓶頸。
  • 37. 37/123 2015 Redis and Aerospike Ref: http://lynnlangit.com/2015/01/28/lessons-learned-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis/
  • 38. 38/123 2015 Redis and Aerospike Ref: http://lynnlangit.com/2015/01/28/lessons-learned-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis/
  • 39. 39/123 2015 Redis and Aerospike Redis 與 Aerospike ✔ Itamar Haber (Redis Labs, Chief Developers Advocate) ✔ Why didn't … use … pipelining and multi-key ✔ operations? ✔ Missing piece is a 20%-80% read/write test and a ✔ 100% write test. ✔ Totally unexplained by the fact that she used AOF. ✔ Comparisons are as hard to do right as they are ✔ easy to do wrong. ✔ Itamar Haber (Redis Labs 公司的首席開發者推廣師 ) ✔ 為什麼不用 Redis 推薦做法,如使用 piplining 和多鍵操作。 ✔ 沒有測試工作負載: 20%-80% 讀寫和 100% 寫的情境。 ✔ 對於 AOF ,一般都是建議非主 Redis 實例執行。 ✔ 最後,比較是一件很難做對卻很容易做錯的事。 Ref: https://redislabs.com/blog/the-lessons-missing-from-benchmarking-nosql-on-the-aws-cloud-aerospikedb-and-redis
  • 40. 40/123 2015 Redis and Aerospike Redis 與 Aerospike ✔ Salvatore Sanfilippo (antirez, the author of Redis) ✔ GET/SET Benchmarks are not a great way to ✔ compare different database systems. ✔ A better performance comparison is by use case. ✔ Test with instance types most people are going to ✔ actually use, huge instance types can mask ✔ inefficiencies of certain database systems, and is ✔ anyway not what most people are going to use. ✔ Salvatore Sanfilippo (antirez, Redis 作者 ) ✔ GET/SET 不能比較出資料庫間的效能差異。 ✔ 效能是需要依據業務場景而定。 ✔ 測試應當依據大多數用戶的實際案例,太多的案例會掩蓋 ✔ 某些資料庫的低效率,而且這樣的案例也不是大多數用戶 ✔ 會遇到的。 Ref: http://antirez.com/news/85
  • 41. 41/123 2015 Redis and Aerospike Ref: https://aphyr.com/posts/324-call-me-maybe-aerospike
  • 42. 42/123 2015 Redis and Aerospike Redis 與 Aerospike ✔ However, as the network shifts, … .By the time of the ✔ final read, about 10% of the increment operations ✔ have been lost. ✔ Just like the CaS register test, increment and read ✔ latencies will jump from ~1 millisecond to ~500 ✔ milliseconds when a partition occurs. ✔ Aerospike can service every request successfully, ✔ peaking at ~2 seconds. ✔ 當 Network partition 發生時, Aerospike 會在某個很短的 ✔ 時間內丟失操作。以每秒 500 次的 increment operations ✔ 測試,丟失約 10% 的寫入。 ✔ 在 partition 完成後,會有幾秒很明顯的 latency 高峰出現。 ✔ Aerospike 即使在已經執行已久的 partition 中,也會出現 ✔ 服務中斷的情形,中斷甚至長達 2 秒。 Ref: http://antirez.com/news/85
  • 43. 43/123 2015 Redis and Aerospike Redis 與 Aerospike ✔ In the summer of 2013 we faced exactly this problem: ✔ big-memory (192 GB RAM) server nodes were running ✔ out of memory and crashing again … We were being ✔ bitten by fragmentation. ✔ 2013 年夏天, Aerospike 突然有一台 192 GB RAM 的伺服器 ✔ 因記憶體用盡而當機, ASMalloc 工具未查出 memory leak , ✔ 所以看來是因為記憶體碎片造成的。 Ref: http://highscalability.com/blog/2015/3/17/in-memory-computing-at-aerospike-scale-when-to-choose-and-ho.html
  • 44. 2015 44/123 Agenda ✔ Redis history ✔ Redis 3.0 ✔ Redis features ✔ Redis and Memcached ✔ Redis and Aerospike ✔ Insight on the pit 議程 ✔ Redis 歷史 ✔ Redis 3.0 ✔ Redis 特性 ✔ Redis 與 Memcached ✔ Redis 與 Aerospike ✔ 坑裡的洞見
  • 45. 45/123 2015 Insight on the pit 坑裡的洞見 Server-side sessions with Redis 使用 Redis 共享 Sessions
  • 47. 47/123 2015 Insight on the pit 【 Server-side sessions with Redis 】 Ref: http://vc2tea.com/redis-session/
  • 48. 48/123 2015 Insight on the pit 【 Server-side sessions with Redis 】 坑裡的洞見【使用 Redis 共享 Sessions 】 ✔ Redis has many eviction policies, but most of them ✔ are based on 'sampling'. ✔ This means eviction item is not global optimization, ✔ but local optimization. ✔ When reach 'maxmemory', it may evict items not ✔ old enough. ✔ Users get logged out early, and the worst is you ✔ won’t even notice it, until users start complaining. ✔ Redis 有很多種移除舊數據的策略,但大多基於「抽樣」。 ✔ 這意謂移除舊數據不是全局最優而是局部最優。 ✔ 當達到 'maxmemory' 上限時,可能造成移除的數據「不 ✔ 夠舊」。 ✔ 使得使用者提前被登出。最糟的是,你可能都不會知道, ✔ 直到使用者開始抱怨。 Ref: http://redis.io/topics/lru-cache
  • 49. 49/123 2015 Insight on the pit 【 Server-side sessions with Redis 】 坑裡的洞見【使用 Redis 共享 Sessions 】 ✔ Alternative solutions. ✔ Use database as an another back-end. ✔ 1. When write session, set both in Redis and ✔ database. ✔ 2. When read session, Redis first, database ✔ second. ✔ Redis 3.0. ✔ More 'sampling'. ✔ 替代方案。 ✔ 使用資料庫為另一儲存後台。 ✔1. 寫入 Session 時,同時寫進 Redis 及資料庫。 ✔2. 讀出 Session 時, Redis 優先,資料庫其次。 ✔ 使用 Redis 3.0 。 ✔ 選擇較大的 'sampling' ( 抽樣數 ) 。
  • 50. 50/123 2015 Insight on the pit 【 Server-side sessions with Redis 】 坑裡的洞見【使用 Redis 共享 Sessions 】 ✔ A better way is … (thinking) ✔ 還有其它的解法 !!! ( 思考 )
  • 51. 51/123 2015 Insight on the pit 坑裡的洞見 Maximize CPUs usage 善用多核 CPU
  • 53. 53/123 2015 Insight on the pit 【 Maximize CPUs usage 】 坑裡的洞見【善用多核 CPU 】 ✔ Redis is single thread. ✔ One instance usually only use one CPU. ✔ (background threads.) ✔ (background tasks, such as BGSAVE, AOF rewrite.) ✔ Redis 是單執行緒。 ✔ 一個 Redis 實例通常只會用到一顆 CPU 。 ✔ ( 背景執行緒 ) ✔ ( 背景工作,例如 BGSAVE 及 AOF rewrite)
  • 54. 54/123 2015 Insight on the pit 【 Maximize CPUs usage 】
  • 55. 55/123 2015 Insight on the pit 【 Maximize CPUs usage 】 坑裡的洞見【善用多核 CPU 】 ✔ Maximize CPUs usage. ✔ Redis instances is same as CPU cores. ✔ But, ✔ 1.Set 'maxmemory' for each instance carefully. ✔ 2.Instance should have different 'dbfilename'. ✔ 3.Instance should have different 'appendfilename'. ✔ 善用多核 CPU 。 ✔ 啟動的 Redis 實例與 CPU 核心數一樣多。 ✔ 但, ✔ 1. 每個實例的 'maxmemory' 需要小心配置。 ✔ 2. 每個實例的 'dbfilename' 需要不一樣。 ✔ 3. 每個實例的 'appendfilename' 需要不一樣。
  • 56. 56/123 2015 Insight on the pit 坑裡的洞見 Memory optimization 記憶體優化
  • 58. 58/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Memory fragmentation. ✔ SET. ✔ rehash. ✔ When hash table needs to switch to a bigger ✔ or smaller table this happens incrementally. ✔ 記憶體碎片。 ✔ SET 。 ✔ rehash 。 ✔ 當 dict 鍵值持續增加時,為保持良好的效能, dict ✔ 需要執行 rehash 。
  • 59. 59/123 2015 Insight on the pit 【 Memory optimization 】 Ref: http://redisbook.readthedocs.org/en/latest/internal-datastruct/dict.html
  • 60. 60/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Key name length. ✔ Shorter is better. ✔ But also meaningful ones. ✔ “product:user1:count” is better than “pu1c”. ✔ Key 命名長度。 ✔ 長度愈短愈好。 ✔ 但還是要有意義。 ✔ “product:user1:count” ”優於 pu1c” 。
  • 61. 61/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Ziplist. ✔ The ziplist is a specially encoded dually linked ✔ list that is designed to be very memory efficient. ✔ Ziplist is space efficient. ✔ Ziplist 。 ✔ 符合某種設定下,資料結構會以 Ziplist 方式儲存。 ✔ 類似一維線性儲存,省去大量的指針開銷。 Ref: http://redis.io/topics/memory-optimization
  • 62. 62/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Ziplist. ✔ hash-max-ziplist-entries 64 ✔ hash-max-ziplist-value 512 ✔ list-max-ziplist-entries 512 ✔ list-max-ziplist-value 64 ✔ zset-max-ziplist-entries 128 ✔ zset-max-ziplist-value 64 ✔ set-max-intset-entries 512 ✔ Ziplist 。 ✔ hash-max-ziplist-entries 64 ✔ hash-max-ziplist-value 512 ✔ list-max-ziplist-entries 512 ✔ list-max-ziplist-value 64 ✔ zset-max-ziplist-entries 128 ✔ zset-max-ziplist-value 64 ✔ set-max-intset-entries 512
  • 63. 63/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Ziplist. ✔ hash-max-ziplist-entries 64 ✔ hash-max-ziplist-value 512 ✔ Use ziplist if entries count ≦ 64 or ✔ every entry size ≦ 512. ✔ Ziplist 。 ✔ hash-max-ziplist-entries 64 ✔ hash-max-ziplist-value 512 ✔ 如果 Hash ≦的數量 64 ,或其中一個 Hash ≦的值 ✔ 512 ,則使用 Ziplist 。
  • 64. 64/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Ziplist. ✔ Twitter use case. ✔ A Redis ziplist threshold is set to the max size ✔ of a Timeline. Never store a bigger Timeline ✔ than can be stored in a ziplist. ✔ Ziplist 。 ✔ Twitter 的案例。 ✔ Ziplist 的數量設定與 Timelines 的最大數量一致; ✔ Timeline 的儲存大小也不會超過 Ziplist 的上限。 Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
  • 65. 65/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ REDIS_SHARED_INTEGERS. ✔ Default is 10,000. ✔ Integers can be stored in a shared memory pool, ✔ and don't have any memory overheads. ✔ REDIS_SHARED_INTEGERS 。 ✔ 預設是 10,000 。 ✔ 整數 ( 包括 0) 可以預分配在共享池,避免重複分配而節省 ✔ 記憶體。
  • 66. 66/123 2015 Insight on the pit 【 Memory optimization 】 Ref: http://redisbook.readthedocs.org/en/latest/datatype/object.html Flyweight src/redis.h
  • 67. 67/123 2015 Insight on the pit 【 Memory optimization 】 坑裡的洞見【記憶體優化】 ✔ Bitmaps. ✔ HyperLogLogs. ✔ Bitmaps. ✔ HyperLogLogs.
  • 68. 68/123 2015 Insight on the pit 坑裡的洞見 Availability 可用性
  • 70. 70/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Twemproxy (Twitter) ✔ Codis ( 豌豆荚 ) ✔ Redis Cluster (Official) ✔ Cerberus (HunanTV) ✔ Twemproxy (Twitter) ✔ Codis ( 豌豆荚 ) ✔ Redis Cluster ( 官方 ) ✔ Cerberus ( 芒果 TV)
  • 71. 71/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Twemproxy (Twitter) ✔ Twemproxy is proxy-based solution. ✔ Good parts ✔ Stable, enterprise ready. ✔ Twemproxy (Twitter) ✔ 代理分片機制。 ✔ 優點 ✔ 非常穩定,企業級方案。
  • 72. 72/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Twemproxy (Twitter) ✔ Bad parts ✔ SPOF (Single Point Of Failure) ✔ Keepalived etc. ✔ Smoothless on scale. ✔ No dashboard. ✔ Proxy-based, more route trip times, higher latency. ✔ Single-threaded proxy model. ✔ Twemproxy (Twitter) ✔ 缺點 ✔ 單點故障。 ✔ 需依賴第三方軟體,如 Keepalived 。 ✔ 無法平滑地橫向擴展。 ✔ 沒有後台介面。 ✔ 代理分片機制引入更多的來回次數並提高延遲。 ✔ 單核模式,無法充份利用多核,除非多實例。
  • 73. 73/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Twemproxy (Twitter) ✔ Bad parts ✔ Twemproxy is not used by Twitter internally. ✔ Twemproxy (Twitter) ✔ 缺點 ✔ Twitter 官方內部不再繼續使用 Twemproxy 。 Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
  • 74. 74/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Codis ( 豌豆荚 ) ✔ Codis is proxy-based solution. ✔ 豌豆莢 open source on Jan 2014. ✔ Written in Go and C. ✔ Codis ( 豌豆荚 ) ✔ 代理分片機制。 ✔ 豌豆莢於 2014 年 11 月開放源碼。 ✔ 基於 Go 與 C 開發。
  • 75. 75/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Codis ( 豌豆荚 ) ✔ Good parts ✔ Stable, enterprise ready. ✔ Auto Rebalance. ✔ High performance. ✔ Simple testbed is faster 100% than Twemproxy. ✔ Multi-threaded proxy model. ✔ Codis ( 豌豆荚 ) ✔ 優點 ✔ 非常穩定,企業級方案。 ✔ 數據自動平衡。 ✔ 高效能。 ✔ 簡單的測試顯示較 Twemproxy 快一倍。 ✔ 善用多核 CPU 。
  • 76. 76/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Codis ( 豌豆荚 ) ✔ Good parts ✔ Simple ✔ No paxos-like coordinators, ✔ No master-slave replication. ✔ Dashboard. ✔ Codis ( 豌豆荚 ) ✔ 優點 ✔ 簡單。 ✔ 沒有 Paxos 類的協調機制。 ✔ 沒有主從複製。 ✔ 有後台介面。
  • 77. 77/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Codis ( 豌豆荚 ) ✔ Bad parts ✔ Proxy-based, more route trip times, higher latency. ✔ Need 3rd -party coordinators ✔ Zookeeper or Etcd. ✔ No master-slave replication. ✔ Codis ( 豌豆荚 ) ✔ 缺點 ✔ 代理分片機制引入更多的來回次數並提高延遲。 ✔ 需要第三方軟體支持協調機制。 ✔ 目前支援 Zookeeper 及 Etcd 。 ✔ 不支援主從複製,需要另外實作。
  • 78. 78/123 2015 Insight on the pit 【 Availability 】 Ref: http://0xffff.me/blog/2014/11/11/codis-de-she-ji-yu-shi-xian-part-3/ Codis 的设计与实现 Part 3 ✔ Codis 采用了 Proxy 的方案,所以必然会带来单机性能 ✔ 的损失。 ✔ 经测试,在不开 pipeline 的情况下,大概会损失 40% ✔ 左右的性能,但是 Redis 本身是一个快得吓人的东西, ✔ 即使单机损失了 40% 仍然是一个很大的数字。
  • 79. 79/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Redis Cluster (Official) ✔ Official supports. ✔ Requires Redis 3.0 or higher. ✔ Redis Cluster ( 官方 ) ✔ 官方支援。 ✔ 需要 Redis 3.0 或更高版本。
  • 80. 80/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Redis Cluster (Official) ✔ Good parts ✔ Official supports. ✔ Pear-to-pear Gossip distributed model. ✔ Less route trip times, lower latency. ✔ Automatically sharded across multiple Redis nodes. ✔ Do not need 3rd -party coordinators ✔ Redis Cluster ( 官方 ) ✔ 優點 ✔ 官方支援。 ✔ 無中心的 P2P Gossip 分散式模式。 ✔ 更少的來回次數並降低延遲。 ✔ 自動於多個 Redis 節點進行分片。 ✔ 不需要第三方軟體支持協調機制。
  • 81. 81/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Redis Cluster (Official) ✔ Bad parts ✔ Requires Redis 3.0 or higher. ✔ Need time to prove its stability. ✔ No dashboard. ✔ Need smart client. ✔ Redis client need to support for Redis Cluster. ✔ More maintenance cost than Codis. ✔ Redis Cluster ( 官方 ) ✔ 缺點。 ✔ 需要 Redis 3.0 或更高版本。 ✔ 需要時間驗證其穩定性。 ✔ 沒有後台介面。 ✔ 需要智能客戶端。 ✔ Redis 客戶端必須支援 Redis Cluster 設計。 ✔ 較 Codis 有更多的維護升級成本。
  • 82. 82/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Cerberus (HunanTV) ✔ Good parts ✔ Auto Rebalance. ✔ Implement Redis's Smart Client. ✔ Read-write split. ✔ Cerberus ( 芒果 TV) ✔ 優點 ✔ 數據自動平衡。 ✔ 本身實現了 Redis 的 Smart Client 。 ✔ 支援讀寫分離。 Ref: https://github.com/HunanTV/redis-cerberus
  • 83. 83/123 2015 Insight on the pit 【 Availability 】 坑裡的洞見【可用性】 ✔ Cerberus (HunanTV) ✔ Bad parts ✔ Requires Redis 3.0 or higher. ✔ Proxy-based, more route trip times, higher latency. ✔ Need time to prove its stability. ✔ No dashboard. ✔ Cerberus ( 芒果 TV) ✔ 缺點 ✔ 需要 Redis 3.0 或更高版本。 ✔ 代理分片機制引入更多的來回次數並提高延遲。 ✔ 需要時間驗證其穩定性。 ✔ 沒有後台介面。
  • 84. 84/123 2015 Insight on the pit 坑裡的洞見 Stabilization 穩定性
  • 86. 86/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Performance fluctuation. ✔ Out of memory. ✔ Redis instances is same as CPU cores. ✔ Big Ziplist. ✔ Master-slave. ✔ 效能抖動。 ✔ 記憶體不足。 ✔ 啟動的 Redis 實例與 CPU 核心數一樣多。 ✔ Big Ziplist 。 ✔ 主從模式。
  • 87. 87/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Performance fluctuation. ✔ For production, stabilization is more important than ✔ average performance. ✔ Easy to estimated, reduce the chances of an ✔ important moment occurred at lower point. ✔ Redis is single thread. ✔ 效能抖動。 ✔ 對於一個上線服務而言,穩定性遠大於平均效能。 ✔ 效能防抖動,好預估,降低重要時刻發生在低點的機率。 ✔ Redis 是單執行緒。
  • 88. 88/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Performance fluctuation. ✔ Tips: Split heavy commands. ✔ MGET ✔ redis> MGET 1 2 3 … 999 ✔ ZRANGE ✔ redis> ZRANGE myset 0 -1 ✔ SORT / LREM / SUNION / SDIFF / SINTER ✔ KEYS / SMEMBERS / HGETALL ✔ 效能抖動。 ✔ 拆解「重」指令。 ✔ MGET 。 ✔ redis> MGET 1 2 3 … 999 ✔ ZRANGE 。 ✔ redis> ZRANGE myset 0 -1 ✔ SORT / LREM / SUNION / SDIFF / SINTER 。 ✔ KEYS / SMEMBERS / HGETALL 。
  • 89. 89/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Performance fluctuation. ✔ Tips: Rethink block commands. ✔ BLPOP ✔ BRPOPLPUSH ✔ BRPOP ✔ MULTI / EXEC ✔ 效能抖動。 ✔ 「阻塞」指令。 ✔ BLPOP 。 ✔ BRPOPLPUSH 。 ✔ BRPOP 。 ✔ MULTI / EXEC 。
  • 90. 90/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ Be careful those commands will ask huge memory. ✔ Reduce the chances of Redis to be killed by OOM. ✔ SWAP, lose a little performance is better than crash. ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ 留意那些會大量耗用記憶體的指令。 ✔ 降低 Redis 強制被 Out of memory 關閉的機率。 ✔ 開啟 SWAP ,效能下降總比服務停用來得好。
  • 91. 91/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ maxmemory ✔ overcommit_memory ✔ SWAP ✔ zone_reclaim_mode ✔ oom_adj ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ maxmemory ✔ overcommit_memory ✔ SWAP ✔ zone_reclaim_mode ✔ oom_adj
  • 92. 92/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ maxmemory ✔ A rule of thumbs is 50% of total memory. ✔ BGSAVE. ✔ AOF rewrite. ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ maxmemory ✔ 經驗法則是設定為總記憶體的 50% 。 ✔ BGSAVE 。 ✔ AOF rewrite 。 Ref: http://redis.io/topics/admin
  • 93. 93/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ overcommit_memory ✔ overcommit_memory = 1 ✔ Do overcommit. ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ maxmemory ✔overcommit_memory = 1 ✔ 請求分配記憶體時,永遠假裝還有足夠的記憶體。
  • 94. 94/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ SWAP ✔ Use SWAP, and same size of memory. ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ SWAP ✔ 使用 SWAP ,並且與記憶體一樣大。
  • 95. 95/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ zone_reclaim_mode ✔ zone_reclaim_mode = 0 (default) ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ zone_reclaim_mode ✔ zone_reclaim_mode = 0 ( 預設 )
  • 96. 96/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ If RHEL/CentOS ≧ 6.4 or Kernel ≧ 3.5-rc1. ✔ (1) Prefer swap to OOM. ✔ vm.swappiness = 1 ✔ (2) Prefer OOM to swap. ✔ vm.swappiness = 0 ✔ Else ✔ vm.swappiness = 0 ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ 如果 RHEL/CentOS ≧ 6.4 或 Kernel ≧ 3.5-rc1 。 ✔ (1) 寧願 swap 也不要 OOM 。 ✔ vm.swappiness = 1 ✔ (2) 寧願 OOM 也不要 swap 。 ✔ vm.swappiness = 0 ✔ 否則 ✔ vm.swappiness = 0
  • 97. 97/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Out of memory (OOM). ✔ If (1) then oom_adj. ✔ echo -15 > /proc/`pidof redis-server`/oom_adj ✔ Reduce the chances of redis to be killed. ✔ Tips ✔ for i in $(pidof redis-server); ✔ do echo -15 | sudo tee /proc/$i/oom_adj ; done ✔ 記憶體不足 (Out of memory, OOM) 。 ✔ 如果 (1) 則 oom_adj 。 ✔ echo -15 > /proc/`pidof redis-server`/oom_adj ✔ 降低 Redis 強制被 Out of memory 關閉的機率。 ✔ Tips ✔ for i in $(pidof redis-server); ✔ do echo -15 | sudo tee /proc/$i/oom_adj ; done
  • 98. 98/123 2015 Insight on the pit 【 Stabilization 】 ✔ 過去 vm.swappiness 設定為 0 可以降低 swap 的發生率, ✔ 但非完全禁止。所以預期會發生 swap 而不會 OOM 。 ✔ 在 Linux Kernel 3.5-RC1 及 RHEL/CentOS Kernel ✔ 2.6.32-303 (CentOS 6.4) 之後的版本,已經改變此行為。 ✔ 設定為 0 時完全不會有任何 swap ,但非預期的記憶體壓力 ✔ 可能會造成 OOM 而關閉 Redis 。
  • 99. 99/123 2015 Insight on the pit 【 Stabilization 】 Linux Kernel 3.4 (mm/vmscan.c) Ref: https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.xz Ref: https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.1.tar.gz Linux Kernel 3.5.1 (mm/vmscan.c)
  • 100. 100/123 2015 Insight on the pit 【 Stabilization 】 linux-2.6.32-504.12.2.el6 (CentOS 6.4, mm/vmscan.c) Ref: http://rpm.pbone.net/index.php3/stat/3/srodzaj/2/search/kernel-2.6.32-504.12.2.el6.src.rpm
  • 101. 101/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Redis instances is same as CPU cores. ✔ Redis have some background tasks. ✔ fsync file descriptor. ✔ close file descriptor. ✔ BGSAVE. ✔ AOF rewrite. ✔ Preserved CPU to do those tasks. ✔ 啟動的 Redis 實例與 CPU 核心數一樣多。 ✔ Redis 會執行一些 background tasks 。 ✔ fsync file descriptor 。 ✔ close file descriptor 。 ✔ BGSAVE 。 ✔ AOF rewrite 。 ✔ 預留一些 CPU 執行這些 tasks 。
  • 102. 102/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Redis instances is same as CPU cores. ✔ Instance have its own synchronization. ✔ Disable automatic on BGSAVE / BGREWRITEAOF, ✔ and use manual control instead. ✔ Avoid execution at the same time. ✔ 啟動的 Redis 實例與 CPU 核心數一樣多。 ✔ 每個實例都有自己的同步機制。 ✔ 關閉自動 BGSAVE / BGREWRITEAOF ,改為手動。 ✔ 避免各實例同時啟動,耗用大量資源。
  • 103. 103/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ Master-slave. ✔ Best practices. ✔ N Redis nodes. ✔ 1 master, 1 slave, N-2 slaves of slave. ✔ Never restart all or multiple slave instances. ✔ (Master) High CPU loading. ✔ (Master) May out of memory. ✔ 主從模式。 ✔ 最佳實踐。 ✔ N 台 Redis 。 ✔ 1 台主服務, 1 台從服務, N-2 台從服務的從服務。 ✔ 不要同時重啟所有或大量的 slave 實例。 ✔ 造成主服務 CPU 負載過高。 ✔ 造成主服務記憶體用量過高。
  • 104. 104/123 2015 Insight on the pit 【 Stabilization 】 坑裡的洞見【穩定性】 ✔ String value. ✔ String value can be at max 512 MB in length. ✔ A rule of thumbs is no more than 5KB. ✔ 字串值。 ✔ 字串值最大可以儲存 512MB 的長度。 ✔ 經驗上最好不要大於 5KB 。
  • 105. 105/123 2015 Insight on the pit 坑裡的洞見 Low latency 低延遲
  • 107. 107/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Durability vs latency tradeoffs, from higher to lower latency. ✔ AOF + fsync always. ✔ AOF + fsync every second. ✔ AOF + fsync every second + ✔ No-appendfsync-on-rewrite set to yes. ✔ AOF + fsync nerver. ✔ RDB. ✔ 數據持久性 vs 延遲性的權衡,延遲性從高至低排列。 ✔ AOF + fsync always 。 ✔ AOF + fsync every second 。 ✔ AOF + fsync every second + ✔ No-appendfsync-on-rewrite set to yes 。 ✔ AOF + fsync nerver 。 ✔ RDB 。 Ref: http://redis.io/topics/latency
  • 108. 108/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Latency induced by network and communication. ✔ Reduce the numbers of commands. ✔ Pipelining. ✔ MSET / MGET. ✔ 網路造成的延遲性。 ✔ 減少指令的使用次數。 ✔ Pipelining 。 ✔ MSET / MGET 。 Ref: http://redis.io/topics/latency
  • 109. 109/123 2015 Insight on the pit 【 Low latency 】 ✔ Fork time in different systems. ✔ 不同系統間的 Fork 時間。 Ref: http://redis.io/topics/latency Linux on physical machine (Xeon@2.27Ghz)Linux on physical machine (Xeon@2.27Ghz) Linux VM on EC2 (Xen)Linux VM on EC2 (Xen) Linux beefy VM on VMwareLinux beefy VM on VMware Linux on physical machine (Unknown HW)Linux on physical machine (Unknown HW) Linux VM on 6sync (KVM)Linux VM on 6sync (KVM) Linux VM on Linode (Xen)Linux VM on Linode (Xen) 9 ms/GB9 ms/GB 10 ms/GB10 ms/GB 12.8 ms/GB12.8 ms/GB 13.1 ms/GB13.1 ms/GB 23.3 ms/GB23.3 ms/GB 424 ms/GB424 ms/GB Linux on physical machine (Xeon@2.27Ghz)Linux on physical machine (Xeon@2.27Ghz) Linux VM on EC2 (Xen)Linux VM on EC2 (Xen) Linux beefy VM on VMwareLinux beefy VM on VMware Linux on physical machine (Unknown HW)Linux on physical machine (Unknown HW) Linux VM on 6sync (KVM)Linux VM on 6sync (KVM) Linux VM on Linode (Xen)Linux VM on Linode (Xen) 9 ms/GB9 ms/GB 10 ms/GB10 ms/GB 12.8 ms/GB12.8 ms/GB 13.1 ms/GB13.1 ms/GB 23.3 ms/GB23.3 ms/GB 424 ms/GB424 ms/GB 坑裡的洞見【低延遲】
  • 110. 110/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Never use Huge page. ✔ echo never > /sys/kernel/mm/transparent_hugepage/enabled ✔ 永不用 Huge page 。 ✔ echo never > /sys/kernel/mm/transparent_hugepage/enabled
  • 111. 111/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Do you really need Proxy-based solution (Codis) ? ✔ 真的需要代理分片機制 ( 如 Codis) 嗎?
  • 112. 112/123 2015 Insight on the pit 【 Low latency 】 简单的测试,单 redis+ 单 proxy ,默认参数 Ref: https://github.com/wandoulabs/codis/issues/63 ~50% ~57% ~428% ~561% ~937% ~50%
  • 113. 113/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Codis. ✔ Disable pipeline. ✔ Less CPU cores. ✔ Codis 。 ✔ 停用 pipeline 。 ✔ 少核 CPU 。
  • 114. 114/123 2015 Insight on the pit 【 Low latency 】 Disable pipeline. Ref: https://github.com/wandoulabs/codis/blob/master/doc/benchmark_zh.md
  • 115. 115/123 2015 Insight on the pit 【 Low latency 】 Less CPU cores. Ref: https://github.com/wandoulabs/codis/blob/master/doc/benchmark_zh.md 4 cores 12 cores 16 cores 8 cores
  • 116. 116/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Big Ziplist. ✔ Adding to and deleting from a ziplist is inefficient, ✔ especially with a very large list. ✔ Deleting from a ziplist uses memmove to move ✔ data around, to make sure the list is still contiguous. ✔ Adding to a ziplist requires a memory realloc call to ✔ make enough space for the new entry. ✔ Big Ziplist 。 ✔ 從 Ziplist 中新增或刪除都沒有效率,尤其是 Big Ziplist 。 ✔ 從 Ziplist 刪除會利用 memmove 移動資料,以確保 list ✔ 還是連續的。 ✔ 在 Ziplist 中新增需要 memory realloc 以產出足夠的空間 ✔ 供新值儲存。 Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
  • 117. 117/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Big Ziplist. ✔ Potential high latency for write operations due to ✔ timeline size. ✔ Big Ziplist 。 ✔ Ziplist 中的寫操作很可能會因 Big Ziplist 而帶來高延遲。 Ref: http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
  • 118. 118/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Redis client. ✔ Connection pool. ✔ Keep alive. ✔ Redis 客戶端。 ✔ Connection pool 。 ✔ Keep alive 。
  • 119. 119/123 2015 Insight on the pit 【 Low latency 】 坑裡的洞見【低延遲】 ✔ Redis 3.0 embedded string. ✔ New "embedded string" object. ✔ Reduce memory operations. ✔ If string length ≦ 39 bytes. ✔ Redis 3.0 embedded string 。 ✔ 新的 "embedded string" 物件。 ✔ 減少記憶體操作次數。 ✔ ≦如果字串長度 39 。
  • 120. 120/123 2015 Insight on the pit 【 Low latency 】 Redis 2.8.20 robj (16 bytes) sdshdr (8 bytes) string (N bytes) ptr
  • 121. 121/123 2015 Insight on the pit 【 Low latency 】 Redis 3.0 robj (16 bytes) sdshdr (8 bytes) string (40 bytes) ptr In 64 bit system: jemalloc arena may “64 byte-long”. 64 - 16 (robj) - 8 (sdshdr) = 40 40 - 1 (null term, 0) = 39
  • 123. 2015 123/123 End 結語 Parvenu use Redis/Memcached (Much memory) ; TRS use Aerospike (Memory / SSD mixed) ; Mortals use SSDB (Disk only) 。 暴發戶用 Redis/Memcached ( 記憶體多 ) ; 高富帥用 Aerospike ( 記憶體與 SSD 混用 ) ; 平民級用 SSDB ( 記憶體缺 ) 。