expire 美 /ɪk'spaɪɚ/ 到期php
range 美 /rendʒ/ 範圍java
idle美 /'aɪdl/ 閒置的node
mysql | redis | memcached | |
---|---|---|---|
類型 | 關係型 | 非關係型 | 非關係型 |
存儲位置 | 磁盤 | 磁盤和內存 | 內存 |
存儲過時 | 不支持 | 支持 | 支持 |
讀寫性能 | 低 | 很是高 | 很是高 |
存儲結構 | 表來存儲 | 支持list/set/string/zset/hash數據結構 | 普通鍵值對key-value |
redis和memcached的系統點和不一樣點? mysql
相同點:都是key-value Nosql,數據存儲在內存中,讀寫效率高,都支持存儲過時(存儲過時:一個數據存儲是爲他設置過時時間,時間一到數據就沒有. 道具,會員,優惠券,訂單,紅包等)git
不一樣點: 1) redis支持持久化 2) redis支持存儲類型更多github
1.作緩存(重點)web
2.統計數量(利用自增的特性),好比:微博評論轉發,註冊人數,瀏覽人數面試
3.實時攻防系統(利用自增的特性)redis
4.有效期應用(利用能夠設置過時時間),好比:紅包,優惠券,會員時間算法
5.自動去重(利用能夠用set數據結構去重)
6.實現隊列(quene FIFO) (利用redis支持list數據結構)
7.支持訂閱發佈
redis是非關係型數據庫,它的數據通常是存放在內存當中,若是設置了持久化,能夠存放在磁盤當中。
它的持久化方案有兩種,RDB,這個是默認的,它是週期性的去備份數據庫的數據,週期的時間的能夠去設置,在redis.windows.conf配置文件當中,去設置save 操做多少次 在多少時間內,只要達到這個標準,RDB持久化方案就會去備份數據,還有一種是AOF,它是須要手動開啓的,開啓是在一個redis.windows.conf文件裏面去設置一個appendonly,把false改爲true就能夠開啓AOF持久化方案,AOF持久化方案,保存的是操做數據的日誌。
redis支持多種數據結構,有String、list、set、zset、hash
redis支持不少應用場景,由於存儲在內存,訪問速度快,還能夠設置過時時間,能夠用來作緩存。由於它+1,-1操做方便,能夠用來統計數量,好比:記錄點贊數、排行統計、瀏覽量統計。由於它能夠設置過時時間,能夠把它用在和有效期相關的場景,好比:紅包、優惠券、秒殺。由於redis能夠用lpush、rpush,能夠用list數據結構來實現隊列。利用set數據結構能夠去重的特色,能夠用redis存放具備惟一性的數據,好比:存放某一博客的惟一ip地址信息。
redis內存達到極限的時候,會執行淘汰策略。redis的淘汰策略有:volatile-lru,在設置了過時時間的數據中,淘汰最近最少使用的數據。volatile-ttl,在設置了過時時間的數據中,淘汰最快過時的數據。volatile-radom,在設置了過時時間的數據中,隨機淘汰數據。allkeys-lru,在全部數據中,淘汰最近最少使用的數據。allkeys-radom,在全部數據中隨機淘汰。no-envication,這個是不淘汰的策略。
SQL:它是關係型數據庫的裏面標準的查詢語言
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,它泛指非關係型的數據庫,爲了解決關係型數據的一些不足,處理超大規模和高併發的數據
redis和memcached是key-value的Nosql,主要用來作緩存的
(1)Redis 是一個高性能的開源的、C語言寫的Nosql(非關係型數據庫),數據保存在內存或者磁盤中。
(2)Redis 是以key-value形式存儲,和傳統的關係型數據庫不同。不必定遵循傳統數據庫的一些基本要求,好比說,不遵循sql標準,事務,表結構等等,redis嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。--數組,list,set,map.....
1.Redis:開源,高性能NoSQL數據庫,數據能夠存儲在內存或者磁盤上
2.Redis主要key-value結構形式存儲,Redis底層支持各類類型的數據存儲結構,包括:list,set,map,string等
1.數據保存在內存,存取速度快,併發能力強
2.它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希類型)。
5.Redis支持集羣(主從同步)。數據能夠主服務器向任意數量從的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。
6.支持持久化,能夠將數據保存在硬盤的文件中
注:之後用Redis主要是用來作緩存
mysql | redis | memcached | |
---|---|---|---|
類型 | 關係型 | 非關係型 | 非關係型 |
存儲位置 | 磁盤 | 磁盤和內存 | 內存 |
存儲過時 | 不支持 | 支持 | 支持 |
讀寫性能 | 低 | 很是高 | 很是高 |
Redis比Memcached的支持的數據存儲類型更多
1.作緩存(重點)
2.計算器應用(利用自增的特性),好比:微博評論轉發,註冊人數,瀏覽人數
3.實時攻防系統(利用自增的特性)
4.有效期應用(利用能夠設置過時時間),好比:紅包,優惠券,會員時間
5.自動去重(利用能夠用set數據結構去重)
6.實現隊列(quene FIFO) (利用redis支持list數據結構)
7.支持訂閱發佈
下載Redis服務,Redis客戶端
https://github.com/microsoftarchive/redis/releases
set key value //將字符串值value關聯到key
get key //返回key關聯的字符串值
mset key1 value1 key2 value2 //同時設置一個或多個 key-value 對
mget key1 key2 //返回全部(一個或多個)給定 key 的值
incr key //將 key 中儲存的數字值增1(key不存在,則初始化爲0,再加1)
decr key //將 key 中儲存的數字值減1(key不存在,則初始化爲0,再減1)
incrBy key //自增多少
decrBy key //自減多少
keys * //獲取全部key列表
del key //刪除key
expire key xx //設置key的過時時間(xx秒後過時)
ttl key //查看key的過時時間
flushall //清空整個redis服務器數據,全部的數據庫所有清空
flushdb //清除當前庫,redis中默認有16個數據庫,名稱分別爲0,1,2,.....,15
select 庫名 //選擇數據庫,好比:select 1:選擇1數據庫,默認是0數據庫
list集合能夠當作是一個左右排列的隊列(列表)
lpush key value //將一個或多個值 value 插入到列表 key 的表頭(最左邊)
rpush key value //將一個或多個值 value 插入到列表 key 的表尾(最右邊)
lpop key //移除並返回列表 key 的頭(最左邊)元素。
rpop key //移除並返回列表 key 的尾(最右邊)元素。
lrange key start stop //返回列表 key 中指定區間內的元素,查詢全部的stop爲-1便可
lrem key count value //根據count值移除列表key中與參數 value 相等的元素count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。count = 0 : 移除表中全部與 value 相等的值。
lindex key index //返回列表 key 中,下標爲 index 的元素
ltrim key start stop //對一個列表進行修剪,如ltrim w 0 1,即:把w集合中的0和1索引保留下來,其餘刪掉
注:
存放都是字符串,由redis組織成各類數據結構
rdis怎麼實現棧(FILO)和隊列(FIFO)???
list控制同一邊進,同一邊出就是棧
list控制一邊進,另外一邊出就是隊列.
set集合是一個無序的不含重複值的隊列
sadd key member //將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略
srem key member //移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略
smembers key //返回集合 key 中的全部成員。
hash類型相似於php的數組
hset key name value //添加一個name=>value鍵值對到key這個hash類型,如:hset map age 18
hget key name //獲取hash類型的name鍵對應的值,如:hget map age
hmset key name1 key1 name2 key2 //批量添加name=>value鍵值對到key這個hash類型,如:hmset map age 28 sex man
hmget key name1 name2 //批量獲取hash類型的鍵對應的值,如:hmget map age sex
hkeys //返回哈希表 key 中的全部鍵
hvals //返回哈希表 key 中的全部值
hgetall key //返回哈希表 key 中,全部的鍵和值
咱們將user:1(name:zhangsan,age:18,sex:nv)的信息保存在hash表.
multi //標記一個事務塊的開始。
exec //執行全部事務塊內的命令。
discard //取消事務,放棄執行事務塊內的全部命令。
注:Redis的事務在執行exec指令時,才批量執行操做,沒有回滾操做
subscribe channel [channel ...] //訂閱給定的一個或多個頻道的信息。如:subscribe CCTV1
publish channel message //將信息 message 發佈到指定的頻道 channel 。如:publish CCTV1 「This is my」
config set 命令能夠動態地調整 Redis 服務器的配置而無須重啓,重啓後失效
config set requirepass 123456 //將密碼設置爲123456
config set requirepass "" //清除密碼
auth 123456 //輸入密碼進行認證
在配置文件redis.widows.conf中增長一行代碼
requirepass 123456
//字符串基本操做
使用鏈接池的好處:能夠設置最大鏈接數,不用頻繁的操做數據庫
使用鏈接池簡單訪問Redis的流程:
1.建立鏈接池配置對象
2.配置
忙時:最大鏈接數
閒時,最大鏈接數
最大等待時間
獲取鏈接時檢查配置
3.經過鏈接池配置對象,建立鏈接池
4.經過鏈接池後去鏈接
5.執行操做
6.關閉鏈接、摧毀鏈接池
//鏈接池操做
//弱類型事務 -- 瞭解
Redis能夠支持內存存儲或者磁盤存儲
若是要完成磁盤存儲,必須瞭解一些持久化機制
Redis 提供了兩種不一樣級別的持久化方式:RDB和AOF,能夠經過修改redis.windows.conf來進行配置.
RDB 持久化能夠在指定的時間間隔內生成數據集的時間點快照,默認開啓該模式.
默認開啓該配置:redis.windows.conf配置
save(sec) (key change) 在sec秒以後,若是發現有key改變次數達到配置,就會進行同步
缺點:數據它有丟失,它是有時間節點,在這個節點內忽然斷電,就不能同步到磁盤
AOF 持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集,默認關閉該模式。
默認沒有開啓配置,須要redis.windows.conf裏面進行配置
如何開啓aof模式:
appendonly yes //yes 開啓,no 關閉
若是有寫的命令操做,就會把數據同步到aof裏面,若是斷電以後,再次啓動,加載該文件,執行命令,在數據寫到庫裏面
redis是怎麼保存數據?
redis爲了考慮效率,保存數據在內容中.而且考慮數據安全性,還作數據持久化,若是知足保存策略,就會把內存的數據保存到數據rdb文件,還來不及保存那部分數據存放到aof更新日誌中。在加載時,把兩個數據作一個並集。
淘汰一些數據,達到redis數據都是有效的。選擇合適的淘汰策略進行淘汰。
volatile-lru(設置了過時時間中的數據,最近最少使用的被淘汰):從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl(設置了過時時間中的數據,過時時間最近的被淘汰):從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
volatile-random(設置了過時時間中的數據,隨機淘汰):從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru(所有數據中,最近最少使用被淘汰):從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random(所有數據中,隨機淘汰):從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(不淘汰):禁止驅逐數據(不淘汰:通常都是熱點數據,永不淘汰)
redis 肯定驅逐某個鍵值對後,會刪除這個數據,並將這個數據變動消息發佈到本地(AOF 持久化)和從機(主從鏈接)。
Sentinel 美 /'sɛntɪnl/ 哨兵
cluster美 /'klʌstɚ/ 集羣
相同點:均可以解決高併發,都須要多臺服務器
不一樣點:
集羣是指:多個服務器實現相同的業務功能。
分佈式是指:多個服務器去拆分同一個業務功能。
1.解決單點故障問題 2.處理高併發 3.處理大量數據(解決存儲問題)
1.方便維護 2.解決高併發,單點故障問題 3.便於擴容
主從複製(主備切換)是指:主服務器宕機了,從服務器頂上。
讀寫分離是指:主服務器專門用來寫操做,從服務器專門用來讀操做。
主從同步是指:主服務器把讀來的數據同步到從服務器。
主從複製的缺點:容錯困難,不支持自動恢復
哨兵模式是指:每一個哨兵進程去ping主服務器,若是在設置的時間內沒有響應,那麼就標記爲主觀下線,若是達到設定的個數的哨兵進程都標記了主服務器爲主觀下線,那麼就把主服務器標記爲客觀下線。
優缺點:解決了主從複製的容錯問題,也支持自動恢復功能。缺點:不方便擴容。
容錯機制:選舉過程是集羣中全部master參與,若是半數以上master節點與故障節點通訊超過(cluster-node-timeout),認爲該節點故障,自動觸發故障轉移操做. 故障節點對應的從節點自動升級爲主節點
優缺點:解決了哨兵模式的
1.準備6個redis服務器(79行改端口,707行改) 707 721 581 yes 715->更改號
集羣就是 不少服務器組成的一個網絡。指的是將多臺服務器集中在一塊兒,實現同一業務。
分佈式是指將不一樣的業務分佈在不一樣的地方. web應用和數據庫服務分開.
1)兩大關鍵特性
集羣提供瞭如下兩個關鍵特性:
一、可擴展性:(簡單來講就是隨時能夠增長新的服務器)
集羣的性能不限於單一的服務實體,新的服務實體能夠動態地加入到集羣,從而加強集羣的性能。動態添加服務器
二、高可用性:(簡單來講就是主服務器掛了,集羣要有能力找能夠正常使用額服務器繼續提供服務器)
集羣經過服務實體冗餘使客戶端免於輕易遇到out of service的警告。在集羣中,一樣的服務能夠由多個服務實體提供。若是一個服務實體失敗了,另外一個服務實體會接管失敗的服務實體。集羣提供的從一個出錯的服務實體恢復到另外一個服務實體的功能加強了應用的可用性
2)兩大能力
爲了具備可擴展性和高可用性特色,集羣的必須具有如下兩大能力:
一、負載均衡--負載均衡能把任務比較均衡地分佈到集羣環境下的計算和網絡資源。
二、錯誤恢復--因爲某種緣由,執行某個任務的資源出現故障,另外一服務實體中執行同一任務的資源接着完成任務。這種因爲一個實體中的資源不能工做,另外一個實體中的資源透明的繼續完成任務的過程叫錯誤恢復。
負載均衡和錯誤恢復都要求各服務實體中有執行同一任務的資源存在,並且對於同一任務的各個資源來講,執行任務所需的信息視圖(信息上下文)必須是同樣的
相同點:
都是能夠處理高併發,並且都須要多臺服務器協同.通常在一個系統中同時存在分佈式和集羣.
不一樣點:
分佈式:不一樣服務處理不一樣的業務,集羣:不一樣服務處理同一個業務
1) 防止單點故障
2) 處理高併發-太多請求一臺服務器搞不定
3) 處理大量數據-太多內存數據一臺服務器搞不定
主從複製的優缺點:
優勢:處理高併發,支持主從同步,主機會自動將數據同步到從機,能夠進行讀寫分離
缺點:主機或者從機宕機會有部分數據丟失
1.監控主服務器和從服務器是否正常運行。
2.主服務器出現故障時自動將從服務器轉換爲主服務器。
哨兵模式的優缺點:
優勢:
哨兵模式是基於主從模式的,全部主從的優勢,哨兵模式都具備。
主從能夠自動切換,系統更健壯,可用性更高。
缺點:
Redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜
Redis-Cluster採用無中心結構
特色:
1.全部的redis節點彼此互聯(PING-PONG機制)
2.節點的fail是經過集羣中超過半數的節點檢測失效時才生效。
3.客戶端與redis節點直連,不須要中間代理層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
4.在redis的每個節點上,都有兩個東西,一個是插槽(slot),它的的取值範圍是:0-16383。還有一個就是cluster,能夠理解爲是一個集羣管理的插件。
總結(簡單來講):
1.redis-cluster能夠理解爲哨兵模式的升級版本,經過槽的概念解決數據分佈式存儲
2.也有主從結構,解決一個槽掛了,從填充上去決絕單點故障
1 .準備6個redis服務器 (以分別命名爲 6379-6384例)(3主3從)
(2) 修改配置
port 6379
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
(3) 每一個redis服務 寫一個startup.bat啓動文件
如:6379的文件內容(6380的文件把6379改成6380)
title redis-6379
redis-server.exe redis.windows.conf
(4)安裝ruby環境
傻瓜式安裝:rubyinstaller-2.6.3-1-x64.exe
(5)安裝Redis的Ruby驅動
a)解壓 :rubygems-3.0.6
b)到Ruby文件目錄,cmd後, 而後命令行執行:ruby setup.rb
(6)經過驅動安裝的redis(須要聯網)
a)進入6379的目錄
b)cmd中,執行gem install redis命令
(7) 建立集羣
a)啓動 6379-6384服務
b)拷貝redis-trib.rb文件到6379的文件目錄
c)cmd下,執行命令:redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
d)執行命令後,詢問的時候,須要輸入:yes
Set<HostAndPort> nodes = new HashSet();
nodes.add(new HostAndPort("127.0.0.1", 6379));
nodes.add(new HostAndPort("127.0.0.1", 6380));
nodes.add(new HostAndPort("127.0.0.1", 6381));
nodes.add(new HostAndPort("127.0.0.1", 6382));
nodes.add(new HostAndPort("127.0.0.1", 6383));
nodes.add(new HostAndPort("127.0.0.1", 6384));
JedisCluster cluster = new JedisCluster(nodes);
1)簡單說一下你對分佈式理解?
分佈式是指將不一樣的業務分佈在不一樣的地方. web應用和數據庫服務分開
2)簡單說一下你對集羣理解?
集羣就是 不少服務器組成的一個網絡。指的是將多臺服務器集中在一塊兒,實現同一業務
3)說一下分佈式和集羣聯繫和區別
相同點:
都是處理高併發,並且都須要多臺服務器協同.通常在一個系統中同時存在分佈式和集羣.
不一樣點:
分佈式:不一樣服務處理不一樣的業務,集羣:不一樣服務處理同一個業務
4)redis集羣方式有哪些?
5)簡單說一下redis-cluster裏面槽?
槽是存放數據,存放是要經過key計算槽位,選擇對應的服務器來存儲,獲取也是一樣的算法.
默認16384個槽位要均勻分佈到主節點上面
爲了槽裏面數據安全要對主節點進行1-N從節點備份
6)簡單說一下redis-cluster裏面選舉投票機制
全部主節點都參與投票,默認半數以上掛點,啓動容錯機制,提高從節點爲主節點.
7)怎麼經過命令鏈接redis集羣 :redis-cli -c -h -p
8)怎麼經過jedis鏈接集羣