RDB演算法
⑴ 如何選擇資料庫
如何選擇資料庫
完整的存儲進去,完整的取出來,不需要額外的操作。
Nosql 比 RDB 有更強的擴展性,可以充分利用分布式系統來提升讀寫性能和可靠性。
這不是誰設計好壞的問題,而是跟他們要解決的問題有關:RDB 誕生於互聯網萌芽的時代,那時數據的准確、可靠是最重要的,而 NoSQL 誕生於互聯網快速發展普及的時代,大數據、分布式、擴展性成了資料庫的另一個重要特性。
總結一下:
RDB 首先得是准確、可靠,然後才向更高的「可拓展性」發展;
而 NoSQL 生而分布式,可拓展性強,然後才向更高的「准確性」發展。
NoSQL ,not only SQL,其實就是對那種打破了 RDB 嚴格事務和關系模型約束的那些資料庫的泛指,而隨著要解決的問題的不同,又誕生了各種各樣的 NoSQL。
首先是「列式資料庫」(Column-oriented DBMS),數據量上去了,我們想分析網站用戶的年齡分布,簡單說,就是你需要對同一個特徵進行大數據量的分析統計,於是把原來 RDB 的「按行存儲」的範式打破,變成了「按列存儲」,比如 HBase;
然後你發現有些數據變動不是很大,但是經常需要被查詢, 查詢時還要關聯很多張表,於是你把這些來自不同表的數據,揉成一個大對象,按 key-value 的格式存起來,比如 Redis;
再後來你需要對博客內容進行相關性搜索,傳統 RDB 不支持相關性搜索,最重要的,還是擴展性差,增加機器的帶來邊際效益有限,於是有了「全文搜索引擎」,比如 Elasticsearch;
除此之外,還有「文檔資料庫」、「圖形資料庫」……
沒有一種資料庫是銀彈。
總結
這篇文章的題目是「如何選擇資料庫」,這是困擾很多人的問題,那麼多資料庫,到底要選什麼好?
可是當你問出這樣一個問題時,其實你是在問一種「手段」。我現在要做這樣一個需求,用什麼資料庫可以幫我實現它?
但其實你需要的不只是一種「手段」,因為如果對方甩給你一個冷冰冰的名字,Mysql、Elasticsearch、MongoDB,你肯定會問,憑什麼?
你需要的,是一種「解決方案」。如果你需要數據十分嚴格准確,分毫不差,那我會推薦你採用「事務」和「關系模型」來處理數據;如果你需要數據能夠被大量讀取和寫入,那我會推薦你擴展性強的「分布式」;如果你的數據經常是整個讀取、整個更新的,那「關系模型」就沒有「文檔模型」適合你。
「事務」、「關系模型」、「分布式」、「文檔模型」等等,這些就是「解決方案」,知道用什麼「解決方案」,用哪個資料庫,自然水到渠成。
正如一位大牛說的:
用戶不會因為你用了 Mysql 或者 MongoDB 而使用你的軟體,畢竟絕大多數用戶都不知道 Mysql 和 MongoDB 是什麼玩意。
⑵ linux上怎麼配置redis的aof持久化
Redis 持久化和配置文件
Reids 持久化
Redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁碟等介質上。
AOF,則是換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重復執行一遍,就可以實現數據恢復了。
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先採用AOF方式來進行數據恢復,這是因為AOF方式的數據恢復完整度更高。
如果你沒有數據持久化的需求,也完全可以關閉RDB和AOF方式,這樣的話,redis將變成一個純內存資料庫,就像memcache一樣。
redis配置文件
daemonize no # 默認情況下,redis並不是以daemon形式來運行的。通過daemonize配置項可以控制redis的運行形式
pidfile /path/to/redis.pid #當以daemon形式運行時,redis會生成一個pid文件,默認會生成在/var/run/redis.pid
bind 192.168.1.2 10.8.4.2 # 指定綁定的ip,可以有多個
port 6379 #指定監聽埠
unixsocket /tmp/redis.sock #也可以監聽socket
unixsocketperm 755 #當監聽socket時可以指定許可權為755
timeout 0 #當一個redis-client一直沒有請求發向server端,那麼server端有權主動關閉這個連接,可以通過timeout來設置「空閑超時時限」,0表示永不關閉。
Redis通用配置
tcp-keepalive0 #TCP連接保活策略,可以通過tcp-keepalive配置項來進行設置,單位為秒,假如設置為60秒,則server端會每60秒向連接空閑的客戶端發起一次ACK請求,以檢查客戶端是否已經掛掉,對於無響應的客戶端則會關閉其連接。如果設置為0,則不會進行保活檢測。
loglevelnotice #日誌級別,有四種debug, verbose, notice, warning
logfile「」 #定義日誌路徑,
syslog-identredis #如果希望日誌列印到syslog中,通過syslog-enabled來控制。另外,syslog-ident還可以讓你指定syslog里的日誌標志。
syslog-facility local0 #指定syslog的設備,可以是USER或者local0-local7
databases 16 #設置資料庫的總數量
Redis快照配置(rdb持久化)
save 900 1 #表示每15分鍾且至少有1個key改變,就觸發一次持久化
save 300 10 #表示每5分鍾且至少有10個key改變,就觸發一次持久化
save 60 10000 #表示每60秒至少有10000個key改變,就觸發一次持久
save 「」 #這樣可以禁用rdb持久化
stop-writes-on-bgsave-error yes #rdb持久化寫入磁碟避免不了會出現失敗的情況,默認一旦出現失敗,redis會馬上停止寫操作。如果你覺得無所謂,那就可以使用該選項關閉這個功能。
rdbcompressionyes #是否要壓縮
rdbchecksumyes #是否進行數據校驗
dbfilenamemp.rdb #定義快照文件的名字
dir ./ #定義快照文件儲存路勁
Redis安全相關配置
requirepassaminglinux
#設置redis-server的密碼
rename-command CONFIG aminglinux.config
#將CONFIG命令更名為aminglinux.config,這樣可以避免誤操作,但如果使用了AOF持久化,建議不要啟用該功能
rename-command CONFIG 「」
#也可以後面定義為空,這樣就禁掉了該CONFIG命令
Redis限制相關配置
maxclients10000 #限制最大客戶端連接數
maxmemory<bytes> #設定最大內存使用數,單位是byte
maxmemory-policy volatile-lru#指定內存移除規則
maxmemory-samples 3 #LRU演算法和最小TTL演算法都並非是精確的演算法,而是估算值。所以你可以設置樣本的大小。假如redis默認會檢查三個key並選擇其中LRU的那個,那麼你可以改變這個key樣本的數量。
Redis AOF持久化相關配置
appendonlyno #如果是no,則開啟aof持久化
appendfilename「appendonly.aof」 #指定aof文件名字
appendfsynceverysec#指定fsync()調用模式,有三種no(不調用fsync),always(每次寫都會調用fsync),everysec(每秒鍾調用一次fsync)。第一種最快,第二種數據最安全,但性能會差一些,第三種為這種方案,默認為第三種。
no-appendfsync-on-rewrite no #使用no,可以避免當寫入量非常大時的磁碟io阻塞
auto-aof-rewrite-percentage 10 #規定什麼情況下會觸發aof重寫。該值為一個比例,10表示當aof文件增幅達到10%時則會觸發重寫機制。
auto-aof-rewrite-min-size 64mb #重寫會有一個條件,就是不能低於64Mb
Redis 慢日誌相關配置
針對慢日誌,你可以設置兩個參數,一個是執行時長,單位是微秒,另一個是慢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。