-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

深入理解Redis

( 簡體 字)
作者:汪佳南類別:1. -> 資料庫 -> Redis
譯者:
出版社:電子工業出版社深入理解Redis 3dWoo書號: 46632
詢問書籍請說出此書號!

有庫存
NT售價: 445

出版日:4/1/2017
頁數:320
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121312014
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

譯者序
對不少互聯網企業來說,使用LNMP 架構可以快速搭建起一套系統,產品可以迅速迭代并盡早投放市場。但隨著訪問量的上升,那些使用傳統關系型數據庫(例如MySQL)的網站開始顯現出性能方面的問題。此外,越來越挑剔的用戶也要求網站不能僅專注于功能特性,同時也要追求極致的產品體驗(即高性能和高可用)。
一方面,架構師會在數據庫層面做以下一系列優化。
1.配置主從
例如。為MySQL 服務器配置主從。一臺宕機,另一臺可以頂上繼續服務,以滿足高可用的要求。
2.讀寫分離
配置一主多從。因為一般系統80%的請求都是讀取操作,將這些操作分發到從服務器上可以有效地提升網站響應速度。
3.分庫分表
隨著數據量的增長,單庫單表已經難以滿足要求。一些諸如TDDL、Cobar、MyCAT等的MySQL 分布式數據庫中間件應運而生。
另一方面,架構師也會通過系統化的分析,以安插緩存層的方式緩解數據庫的壓力。對應用系統來說,緩存都應在設計之初就納入考慮的范疇,成為系統不可或缺的一部分。我曾供職的一家公司就采用Redis 作為緩存的實現方案。應用程序運行在兩個同等的Tomcat容器里。Tomcat 之前則配置了一臺Nginx 用于Load Balance。由于用戶Session 存儲在Redis中(通過Spring 和Shiro 的簡單配置即可實現),應用的無狀態性使得系統可以很方便地進行水平擴縮。另外,我們的業務要求用戶每次瀏覽某個項目頁面時進行訪問計數(counting)。
為了避免頻繁的數據庫讀寫,我們將每個項目的瀏覽量的計算和讀取交給了Redis。同時,為了避免意外導致的數據丟失,我們開啟了Redis 的持久化功能,并啟動定時任務,每隔一段時間就將項目瀏覽次數同步到數據庫中。
至于為何選擇Redis 而沒有選擇Memcached,當時考慮的主要原因是Redis 支持更為豐富的數據模型。像上述頁面訪問量計數的需求,可以直接通過Redis 的命令進行操作,而且利用Redis 的單線程模型,應用程序無須編寫同步代碼。當然,緩存只是Redis 的其中一個用途。一些典型的場景還包括排行榜、用戶訪問量統計、集合運算、消息隊列等。國內外的一些大型互聯網企業(例如京東、新浪、Pinterest 等)都對Redis 有不同程度的部署和應用。希望讀者能夠在本書中找到自己想要的答案。
每次翻譯都帶給我不同的體驗,并為我的工作和生活帶來改變。在此,我要感謝電子工業出版社的編輯張春雨和負責審校的同事,是你們的細心指導保證了本書的翻譯質量。
同時,感謝我的父母和我的太太,在你們的陪伴和支持下,我得以專心工作。
由于時間倉促,文中難免有所疏漏,望不吝斧正。
汪佳南
前言
本書旨在從兩方面為讀者構建Redis 的基礎知識。一方面,本書提供了Redis 及其技術背后的深層含義及理論;另一方面,拓展了Redis 日常實用技能。本書書名中的精通(Mastering)二字暗示了精通Redis 是一個持續的過程,而非最終目的地。激動人心的是Redis 持續開放地演進成為了時下強大的數據操作和存儲技術。
Redis 背后的設計哲學
在整個項目的生命周期中,Salvatore Sanfilippo 對Redis 的發展方向與功能發表了獨到的觀點和見解。在2015 年1 月的一篇有關Redis 對比其他數據庫的基準測試的博客中,
Sanfilippo 聲明“我不想說服開發者們采用Redis。我們只是盡力提供一款合適的產品。如果人們能夠使用這款產品完成工作,我們會感到非常開心。這就是我的營銷理念。”
Sanfilippo 和他的Redis 核心開發團隊遵循著成功的開源管理模型:“仁慈獨裁者”(BDL)
模型。該模型中只能有單獨一個人作為最終獨裁者,來裁決哪些能被提交到Redis 代碼庫中。BDL 模型的成功已經被諸如Linux 內核開發和Python 編程語言等項目證明過了。作為主要開發者和維護者的Sanfilippo 成功地將BDL 模型復制到了Redis 中。
如果獨裁者拋棄項目,或者更糟的是因病或者死亡而導致無法工作時,BDL 模型的失效將是災難性的。Redis 浮現出來的另一個重大問題是當潛在的貢獻者提交Pull Request 時,針對這些提交的行動會被延遲,或者更多時候是被忽略。說句公道話,那些必須經過檢查、測試并合并到主代碼庫上的變更的數量非常巨大,需要激情和專門的看門人。作為Linux內核項目的初創者及當前的BDL,Linus Torvalds 已經看到自己的角色發生了轉變,更多是在合并那些由其他開發者貢獻的代碼,同時相比親自編寫代碼,他做的更多的是為Linux提供愿景和領導力。Sanfilippo 在Redis 主要的電子郵件通信上的一篇主題帖中確認了該問題,他給出了以下兩大主要理由來繼續Redis 當前的BDL 模型:
? 項目開發與未來方向的一致性視角
? 對任何新的或者出現的更改采取問責制
在Sanfilippo 看來,Redis 作為鍵值數據存儲,其易于部署、內存占用少(就Redis 本身來說,而不是指它的數據集!)、安全可靠等特性一直是Redis 在開發者和組織中人氣持續上升的關鍵因素。他的觀點確實造成了緊張的關系,特別是當提出Redis 的新功能,例如使哈希中具體子值(sub-values)過期,或者為可選功能提供可加載模塊時,這些特性都被拒之門外。Sanfilippo 對于保持Redis 的小巧并專注于使其成為內存數據庫的渴望,推動發展,在2011 年的博客中,他用有關Redis 和Redis 開發過程的七條宣言闡明了他的觀點,簡述如下。
1.用于抽象數據類型的DSL。Redis 是一門領域特定語言(DSL),用于抽象數據結構的表達和使用。這些數據結構不僅包括了操作(Redis 命令),還包括了使用Redis 相關命令存儲和操作這些數據結構的內存效率和時間復雜度。
2.內存存儲是第一要務。通過將所有數據存儲在計算機內存中,跨系統的Redis 的性能更為一致,用于實現這些數據結構的眾多算法以更為可預測的方式運行,同時諸如有序集合這樣的更為復雜的數據類型在內存數據庫中更容易實現。
3.基礎數據結構對應基礎API。Redis 為基礎數據結構實現了一套基礎API。這套API由Redis 命令和對應的數據結構組成。它嘗試清晰地反映API 從計算機內存中讀取和寫入的數據結構。Redis 遵循這一設計理念,通過更簡單的數據結構操作來組合實現更為復雜的操作。
4.代碼如詩。這是所有七條宣言之中最難以滲透的。Sanfilippo 將他的審美偏好融入到代碼之中以契合Redis 這一長篇巨著。他認為Redis 的編碼風格和方法能夠幫助人們書寫一段敘述。因此,是否包含第三方代碼部分取決于它能否很好地契合Redis 的敘述和Redis的源代碼。
5.我們反對復雜。避免代碼復雜性。如果要在使用大量代碼來實現小型功能與舍棄該功能之間做出選擇的話,那么Redis 會選擇后者,以舍棄額外的復雜性和向代碼庫中添加復雜性所帶來的開銷。
6.兩層API。一套是API 的子集,以分布式的方式運行;另一套更大型、功能更為豐富,用來支持多鍵操作。這種分離設計支持像Redis 主從和Redis 集群操作模式這樣重要的功能。
7.我們以優化為樂。通常對于開發者和技術運營者來說,這是一種情感訴求,也是一段非常聰明的聲明。調優技術來解決疑難雜癥所帶來的刺激能夠激起快樂的感覺及對Redis未來無限可能的興奮。
本書涵蓋內容
閱讀本書時你會發現其貫穿著兩大主題,以平行的方式展示了流行時尚的運營和過程的開發/運營二元論,即眾所周知的DevOps。為了有助于讀者更有針對性地學習章節中包含的內容,每個章節的主題會被歸類為軟件開發或者系統運營。由于兩者之間的邊界越來越模糊,對每個趨勢中主題的深刻理解能夠增強你和你團隊的能力,以便快速高效地為項目開發和部署Redis 解決方案,或者將Redis 作為技術基礎設施需求的一部分。
第1 章介紹了由Redis 之父和主要維護者Salvatore Sanfilippo 所闡明的Redis 開發哲學。
第2 章通過詳細闡述和解釋Redis 數據結構和鍵管理為讀者構建起Redis 的基礎知識,其中包括了如何為應用程序構造既有意義又有表達力的鍵模式這一重要主題。
第3 章講解了Redis 提供的用來優化應用程序內存使用的各種選項,其中包括了Redis支持的基于最近較少使用(LRU)的各種緩存和Redis 中的鍵驅逐(evict)策略。
第4 章是有關應用程序編程的高級主題。本章從概述Redis 核心的C 語言實現開始,通過對精心挑選的C 代碼片段進行深入地講解來加深你對Redis 的理解。然后講到了如何使用三種不同的Redis 客戶端,并展示了分別使用Python、Node.js 和Haskell 的編程示例。第5 章是有關應用程序編程的高級主題。本章從概述Redis 服務器端Lua 腳本及如何在Redis 中更高效地使用Lua 開始講起。之后,拓展講解了一些流行的Redis 編程設計模式,列舉了幾個具體實例,描述了不同的個體和公司在運營操作中是如何使用這些模式的。本章最后從軟件開發者的角度描述了Redis 是如何應用于典型的DevOps 場景中。
第6 章探索了兩個最近添加到Redis 中的Redis 集群和Redis Sentinel。Redis Sentinel是一種特殊的高可用模式,用來監控主從服務器的健康狀況,并能夠在任意Redis 主從實例故障時進行切換。之前提到的Redis 集群現在可用于產品環境中了。對于那些太大而不能存入單臺機器的大型數據來說,Redis 集群能夠通過運行多個實例并將鍵進行分片的方式來完成存儲。雖然這些主題更關注運營方面,但是在采用Redis 的工程解決方案時至少應該知道Redis 群集的好處和局限性。
第7 章一開始就承認了一件事,那就是對絕大多數組織來說,它們的信息技術棧包含了不同類型的數據和處理解決方案的異構混合。Redis 是一種用來擴展其他NoSQL 數據存儲選項的理想方式。同時,在本章中,我們將看到Redis 是如何與MongoDB、ElasticSearch和Fedora Digital Repository 一起使用的。那些需要使用多種解決方案來開發并支持復雜業務需求的開發者和系統管理員會對本章的內容感興趣。
第8 章介紹了如何通過在Docker 容器和鏡像中使用Redis 的方式來簡化管理并提升基于Redis 的解決方案的安全性和可靠性。Docker 是一種開源容器技術,正快速地被許多企業采用。在那之后我們將研究在最為流行的計算云供應商上使用Redis 所面臨的具體挑戰,這些供應商包括最大、最為成熟的Amazon Web Services、Google 的Compute Engine 和Microsoft Azure,并特別提到了其他云服務供應商,例如Rackspace 和Digital Ocean。本章最后會研究專門用于Redis 的云服務。這些云服務專注于托管和管理Redis 實例。
第9 章一開始深入探索了Redis 的發布/訂閱命令。首先通過不同的示例展示了不同進程間、不同程序間、不同的Redis 客戶端、不同的操作系統,以及遠程計算機上的發布者和消費者是如何進行通信的。之后,將拓展Redis 的發布/訂閱模式,并簡要介紹將Redis用作企業計算生態中不同層之間的消息通信隊列。本章最后會通過使用Redis 和Celery 作為任務管理和支持發布/訂閱模式的消息通信隊列這一詳細示例總結提到的所有概念。
第10 章在前面章節的基礎上展示了Redis 作為實時數據聚合器是如何將組織中來自各種技術系統的不同數據流聚合起來的。之后,將研究Redis 安全模型和最新Redis 版本新加入的安全特性。還有一款基于Web 的運營儀表板將采用我們關于Redis 客戶端的知識,將輸入到Redis 中的數據進行可視化。接下來,將展示如何將機器學習算法(如樸素貝葉斯)應用到這些基于Redis 的信息流,以提供更為豐富的概況,并加深你對組織或者部門內發生的操作的理解。
在附錄的來源部分確認了章節中用到的摘錄來源,并提供了鏈接以便讀者進一步閱讀。
獲得精通Redis 開放式徽章
Mozilla 基金會是贊助Firefox 瀏覽器開發的開源組織,它啟動了一項名為開放式徽章(Open Badges)的項目,允許組織創建并向個人頒發便攜式和通用的徽章,以示其成就。在本書網站上,你可以通過一系列在線測試獲得精通Redis 開放式徽章,并有機會向你當前或者將來的雇主傳達你對Redis 日益增長的知識與技能。開放式徽章可以通過諸如Facebook、Twitter 或者LinkedIn 等流行的社交網站進行分享。
精通Redis 開放式徽章對于購買了本書的讀者來說是免費的。而對于那些沒有購買的讀者來說,仍然可以在本書網站上支付一些象征性的費用來獲得精通Redis 開放式徽章。
你有機會與其他徽章獲得者建立聯系,從他們的經驗中學習Redis,同時可以分享自己的故事和知識,因此能夠在閱讀完本書之后的很長一段時間里鼓勵你學習。我們希望本書能夠馬上幫助你理解Redis,你能夠通過獲得開放式徽章記錄這項專業成就。
目標讀者
如果你是一位Web 開發者,對MEAN 棧有基本的理解,有過JavaScript 應用程序的開發經驗,并且對NoSQL 數據庫也有基本的使用經驗,那么本書就是為你而寫的。
排版約定
你會發現本書采用了多種文本樣式來區分不同種類的信息。下面是這些樣式的一些示例和對應含義解釋。文本中的代碼、數據庫表名稱、文件夾名稱、文件名、文件擴展名、路徑名、虛擬URL、用戶輸入和Twitter handle 如下所示:“首先,在對鍵使用EXPIRE 命令設置超時時,只有當刪除或者替換該鍵時超時才會被清除。”
內容簡介:

本書以由淺入深、由原理到應用場景的方式介紹了Redis 這款NoSQL 數據庫產品。書中不僅細致地講解了Redis 中的數據結構及流行的使用模式,還針對Redis 鍵的設計和管理,以及內存管理提出了建設性的方案。同時,作者深入Redis 源碼,將其內部構造通過源代碼調試的方式進行呈現。本書適合有一定NoSQL 經驗的開發者或者架構師閱讀。讀者可以從書中找到許多應用場景和解決方案,例如Docker 部署、Redis 消息隊列、基于Redis 的ETL 應用和基于Redis 的機器學習等。

目錄:

1 為何選擇Redis? 1
合適之選? 2
嘗試使用Redis 4
流行的使用模式 9
Redis不合心意?馬上再試試! 11
總結 13
2 高級鍵管理與數據結構 14
Redis鍵 14
Redis鍵模式 15
鍵分隔符和命名約定 17
手動創建Redis模式 19
解構Redis對象映射器 22
鍵過期 27
鍵的注意事項 27
大O符號 28
為自定義代碼計算大O符號 30
回顧Redis數據結構的時間復雜度 32
字符串 32
哈希 33
列表 34
集合 35
有序集合 36
高級有序集合操作 39
位串和位操作 39
HyperLogLogs 41
總結 42
3 內存管理的建議與技巧 44
配置Redis 44
主從復制 45
32位Redis 45
INFO memory詳解 47
鍵過期 49
LRU鍵清除策略 54
創建內存高效的Redis數據結構 62
小巧的哈希、列表、集合和有序集合 62
把位、字節和Redis字符串用作隨機訪問數組 68
優化哈希,高效存儲 69
硬件和網絡延遲 72
操作系統建議 74
總結 75
4 Redis編程第一部分:Redis核心、客戶端和編程語言 76
Redis的內部結構 76
理解redis.h和redis.c 83
Redis序列化協議 93
Redis RDB格式 97
使用Redis和Python創建協程 99
使用Node.js和Redis實現Todo列表應用 103
復制與公共訪問 106
總結 106
5 Redis編程第二部分:Lua腳本、管理與DevOps 108
在Redis中使用Lua 108
使用Redis的KEYS和ARGV 117
Redis中的高級Lua腳本 121
MARC21數據提取 121
紙質文具在線商店 123
讓JSON-LD、Lua和Redis協同工作 126
Redis Lua調試器 130
Redis的編程與管理 133
主從復制 134
使用MULTI和EXEC實現事務 136
Redis在DevOps中扮演的角色 139
總結 140
6 可伸縮性:Redis集群和Sentinel 142
數據分區的方法 142
范圍分區 143
列表分區 145
哈希分區 148
復合分區 149
鍵哈希標簽 150
使用Twemproxy實現Redis集群 151
使用關聯數據片段服務器測試Twemproxy 152
Redis集群的背景 158
Redis集群概覽 159
使用Redis集群 160
Redis集群實時重新配置及重新分片 165
故障轉移 168
在Redis集群中替換或者升級節點 170
使用Redis Sentinel進行監控 171
為區域代碼列表分區配置Redis Sentinel 173
總結 176

7 Redis與互補的NoSQL技術 177
NoSQL技術的繁榮 177
Redis作為MongoDB的分析補充 181
Redis作為ElasticSearch的預處理組件 192
在BIBCAT中使用Redis和ElasticSearch 193
ElasticSearch、Logstash和Redis 198
Redis作為Fedora Commons的智能緩存補充 199
總結 205
8 Docker容器與云端部署 206
Linux容器 206
與Redis相關的Docker基礎 211
Docker鏡像中的層 219
Docker文件系統后端 220
Docker和Redis的問題 227
使用Docker Compose打包應用程序 227
Redis和AWS 232
專門的云托管選項 233
Redis Labs 234
DigitalOcean Redis 234
總結 235
9 任務管理與消息隊列 236
Redis的發布/訂閱模式概述 236
發布/訂閱RESP回復 237
SUBSCRIBE和UNSUBSCRIBE RESP數組 237
PSUBSCRIBE和UNSUBSCRIBE數組 239
使用redis-cli進行發布/訂閱 240
Redis發布訂閱實戰 242
第一個工作站采用Python進行發布訂閱 244
第二個工作站采用Node.js進行發布訂閱 246
第三個工作站使用Lua客戶端進行發布訂閱 248
Redis鍵空間通知 251
使用Redis和Celery進行任務管理 255
GIS和RestMQ 259
使用RestMQ進行任務管理 262
使用Redis技術進行消息通信 264
使用Disque進行消息通信 264
總結 266
10 信息流的測量與管理 267
基于Redis的ETL方案 267
將JSON轉換成RESP 273
管理Redis時的安全考慮 279
使用Redis Web儀表板進行運營監測 282
機器學習 283
樸素貝葉斯與工作分類 284
使用Redis實現線性規劃 294
總結 299
來源 300
序: