天天看點

redis的一些簡介

Redis是Remote Dictionary

Server的縮寫,他本質上一個Key/Value資料庫,與Memcached類似的NoSQL型資料庫。

1.       redis的資料類型:

string:最大上限是1G

lists(清單)

sets(集合)

sort sets(有序集合)

hash(哈希表)

2.       特性

?  持久化

?  主從同步

?  高性能

?  多種API接口

3.       适用場合

?  取最新的N個資料  list集合

?  排行榜應用       zsort

?  需要精準設定過期時間的應用 安裝時間設定zsort

?  計數器的應用    

?  擷取某段時間所有資料的排重值   set

?  實時系統,反垃圾系統   

?  Pub/sub建構實時消息系統

?  建構隊列系統     list ,sorted set

?  緩存

4.       Key相關的操作指令

Exists key 檢查指定的key值是否存在,傳回1表示存在,傳回0表示不存在

Del key1 key2…..删除給定的key,傳回删除key的數目,0表示給定的key都不存在

Type key 傳回給定key值得類型,傳回none表示不存在,string,list,。。。

Keys pattern 傳回比對指定模式的所有key

Rename(renamenx) oldkey newkey 重命名一個Key

Expire key seconds 為key指定過期的時間

Ttl key 傳回設定過期時間key的剩餘過期秒數

Select db-index 通過索引選擇資料庫,預設連接配接的資料庫是0,預設資料庫數是16個,

Move key db_index 将key從目前資料庫移動到指定的資料庫

5.       String類型資料操作指令(hash操作和string操作類似)

Set key value 設定key對應string類型的值,傳回1表示成功,0失敗。

Setnx key value 如果key不存在,設定key對應string類型的值,如果key已經存在,傳回0

Get key 擷取key對應的string值,如果key不存在傳回nil

Getset key value 先擷取key的值,再設定key 的值,如果key不存在傳回nil

Mget key1 key2 ….keyN 一次擷取多個key的值,如果對應不存在,則對應傳回nil

Mset key1 key2…..keyN 一次設定多個key值

Msetnx key1 key2….keyN 一次設定多個key值,但是不會覆寫已經存在的key

Incr key 對key的值做++操作,并傳回新的值。注意incr一個不是int的value會傳回錯誤,incr一個不存在的key,則設定key 的值1

Incrby key integer 對key值加上指定的值

Decrby key integer 對key 值減去指定值

6.       List類型是一個雙向連結清單,主要功能是push,pop,獲得一個範圍的所有值

Lpush key string 在key對應的list的頭部添加字元串元素

Rpush key string 在key對應的尾部添加字元串元素

Llen key 傳回key對應list的長度

Lrang key start end 傳回指定區間内的元素,下标從0開始

Ltrim key start end 截取list指定區間的元素

Lset key index value 設定list中指定下标的元素值

Lrem key count value 從list的頭部或者尾部删除一定數量比對value的元素

Lpop  key 從list的頭部删除并傳回删除的元素

Rpop key從list的尾部删除并傳回删除的元素

Blpop

7.       Set類型是無序集合,是通過hash

table 實作的

Sadd key number 添加一個string元素到key對應set集合中

Srem key number 從key對應的set中移除指定的元素

Spop key 删除并傳回key對應set中的随機的一個元素

Srandmember key 随機選擇一個元素,但不删除元素

Smove srckey dstkey member 從srckey對應set中移除member并添加到dstkey對應的set中。

Scard key 傳回set元素的個數

Sismember key member 判斷member是否在set

Sinter key1 key2 傳回所有給定key 的交集

Sinterstore dstkey key1….keyn  傳回所有的交集,并儲存交集到dstkey

Sunion

Sunionstore

Sdiff

Sdiffstore

Smembers key 傳回key對應的所有元素

8.       Sort set

sadd key

member 添加一個string 元素到key 對應set 集合中,成功傳回1,如果元素以及

在集合中則傳回0,key 對應的set 不存在則傳回錯誤。

srem key

member 從key 對應set 中移除指定元素,成功傳回1,如果member 在集合中不

存在或者key 不存在傳回0,如果key 對應的不是set 類型的值傳回錯誤。

spop key 删除并傳回key 對應set 中随機的一個元素,如果set 是空或者key 不存在傳回

nil。

srandmember

key 同spop,随機取set中的一個元素,但是不删除元素。

smove

srckey dstkey member 從srckey對應set中移除member并添加到dstkey對應set中,

整個操作是原子的。成功傳回1,如果member 在srckey 中不存在傳回0,如果key 不是set

類型傳回錯誤。

scard key 傳回set的元素個數,如果set是空或者key不存在傳回0。

sismember

key member 判斷member 是否在set 中,存在傳回1,0 表示不存在或者key 不

存在。

sinter

key1 key2 …… keyN 傳回所有給定key 的交集。

sinterstore

dstkey key1 ....... keyN 傳回所有給定key的交集,并儲存交集存到dstkey下。

sunion

key1 key2 ...... keyN 傳回所有給定key的并集。

sunionstore

dstkey key1 ...... keyN 傳回所有給定key的并集,并儲存并集到dstkey下。

sdiff

key1 key2 ...... keyN 傳回所有給定key 的差集。

sdiffstore

dstkey key1 ...... keyN 傳回所有給定key的差集,并儲存差集到dstkey下。

smembers key 傳回key 對應set 的所有元素,結果是無序的。

9.       安裝配置

#redis-server:Redis伺服器的daemon啟動程式

#redis-cli:Redis指令行操作工具。當然,你也可以用telnet根據其純文字協定來操作

#redis-benchmark:Redis性能測試工具,測試Redis在你的系統及配置下的讀寫性能

#redis-stat:Redis狀态檢測工具,可以檢測Redis目前狀态參數及延遲狀況

daemonize yes #預設是no,改為yes讓其背景運作.

pidfile:#pid檔案位置

port:#監聽的端口号

timeout:#請求逾時時間

loglevel:#log資訊級别

logfile:#log檔案位置

databases:#開啟資料庫的數量

save * *:#儲存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操作。在一定時間内執行一定數量的寫操作時,自動儲存快照。可設定多個條件。

rdbcompression:#是否使用壓縮

dbfilename:#資料快照檔案名(隻是檔案名,不包括目錄)

dir:#資料快照的儲存目錄(這個是目錄)

appendonly:#是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高資料抗風險能力,但影響效率。

appendfsync:#appendonlylog如何同步到磁盤(三個選項,分别是每次寫都強制調用fsync、每秒啟用一次fsync、不調用fsync等待系統自己同步)

10.   配置檔案資訊

daemonize 是否以背景程序運作,預設為no

pidfile 如以背景程序運作,則需指定一個pid,預設為/var/run/redis.pid

bind 綁定主機IP,預設值為127.0.0.1(注釋)

port 監聽端口,預設為6379

timeout 逾時時間,預設為300(秒)

loglevel 日志記錄等級,有4個可選值,debug,verbose(預設值),notice,warning

logfile 日志記錄方式,預設值為stdout

databases 可用資料庫數,預設值為16,預設資料庫為0

save 指出在多長時間内,有多少次更新操作,就将資料同步到資料檔案。這個可以多個條件配合,比如預設配置檔案中的設定,就設定了三個條件。

save 900 1 

900秒(15分鐘)内至少有1個key被改變

save 300 10  300秒(5分鐘)内至少有300個key被改變

save 60 10000  60秒内至少有10000個key被改變

rdbcompression 存儲至本地資料庫時是否壓縮資料,預設為yes

dbfilename 本地資料庫檔案名,預設值為dump.rdb

dir 本地資料庫存放路徑,預設值為 ./

slaveof 當本機為從服務時,設定主服務的IP及端口(注釋)

masterauth 當本機為從服務時,設定主服務的連接配接密碼(注釋)

requirepass 連接配接密碼(注釋)

maxclients 最大用戶端連接配接數,預設不限制(注釋)

maxmemory 設定最大記憶體,達到最大記憶體設定後,Redis會先嘗試清除已到期或即将到期的Key,當此方法處理後,任到達最大記憶體設定,将無法再進行寫入操作。(注釋)

appendonly 是否在每次更新操作後進行日志記錄,如果不開啟,可能會在斷電時導緻一段時間内的資料丢失。因為redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設值為no

appendfilename 更新日志檔案名,預設值為appendonly.aof(注釋)

appendfsync 更新日志條件,共有3個可選值。no表示等作業系統進行資料緩存同步到磁盤,always表示每次更新操作後手動調用fsync()将資料寫到磁盤,everysec表示每秒同步一次(預設值)。

vm-enabled 是否使用虛拟記憶體,預設值為no

vm-swap-file 虛拟記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共享

vm-max-memory 将所有大于vm-max-memory的資料存入虛拟記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體存儲的(Redis的索引資料就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在于磁盤。預設值為0。   

11.   CAP思想

C: Consistency 一緻性

A: Availability 可用性(指的是快速擷取資料)

P: Tolerance of network Partition 分區容忍性(分布式)

CA:傳統的關系型資料庫

AP:key-value資料庫

BASE

說起來很有趣,BASE的英文意義是堿,而ACID是酸。真的是水火不容啊。

Basically Availble --基本可用

Soft-state --軟狀态/柔性事務

"Soft state" 可以了解為"無連接配接"的, 而 "Hard

state" 是"面向連接配接"的

Eventual Consistency --最終一緻性

最終一緻性,

也是是 ACID 的最終目的。

BASE模型反ACID模型,完全不同ACID模型,犧牲高一緻性,獲得可用性或可靠性: Basically

Available基本可用。支援分區失敗(e.g.

sharding碎片劃分資料庫) Soft state軟狀态

狀态可以有一

段時間不同步,異步。 Eventually

consistent最終一緻,最終資料是一緻的就可以了,而不是時時一緻。

BASE思想的主要實作有

1.按功能劃分資料庫

2.sharding碎片

BASE思想主要強調基本的可用性,如果你需要高可用性,也就是純粹的高性能,那麼就要以一緻性或容錯性為犧牲,BASE思想的方案在性能上還是有潛力可挖的。

五分鐘法則:在記憶體中保持 1KB 的資料成本相當于硬碟中存儲同樣大小資料 400 秒的開銷(接近五分鐘)。在閃存時代,5 分鐘法則依然有效,隻不過适合更大的記憶體頁(适合 64KB 的頁,這個頁大小的變化恰恰展現了計算機硬體工藝的發展,以及帶寬、延時)。

就是說如果一個頁面每五分鐘就會被通路一次的話,就應該把它放到記憶體中去,否則就應該把它存儲在磁盤上

12.   亞馬遜:Dynamo

Facebook: Cassandra

Googel:bigtable(Hypertable)

新浪:redis

13.   傳統MySQL+ Memcached架構遇到的問題

l  MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟着擴容,擴容和維護工作占據大量開發時間

l  Memcached與MySQL資料庫資料一緻性問題

l  Memcached資料命中率低或down機,大量通路直接穿透到DB,MySQL無法支撐

l  跨機房cache同步問題

Nosql應用場景

l  少量存儲,高速讀寫通路。Redis

l  海量資料存儲,分布式系統支援,資料一緻性保證,友善的叢集節點添加/删除。

Dynamo, bigtable

l  Schema free,auto-sharding. Mongodb

14.   Redis常用指令

Keys:傳回滿足給定pattern的所有key

Exists:确認一個key是否存在

Del:删除一個key

Expire:設定一個Key的過期時間

Move:将目前資料庫中key轉移到其他資料庫中

Randomkey:随機傳回key空間的一個key

Rename:重命名key

Type:傳回值得類型

Ping:測試連接配接是否存活

Select:選擇資料庫

Dbsize:傳回目前資料庫key的數目

Info:擷取伺服器的資訊和統計

Config get *:得到所有的配置資訊

Flushdb:删除目前資料庫的所有key;

Flushall:删除所有資料庫的所有key

15.   事務

Multi:開始事務

Exec:執行事務

Discard:復原事務

Watch:對某個key值進行加鎖

Save/bgsave:做持久化操作

Bgrewriteaof:

16.   redis 的虛拟記憶體在設計上為了保證key 的查找速度,隻會将value 交換到swap 檔案中。redis 規定同一個頁面隻能儲存一個對象。但是一個對象可以儲存在多個頁面中。

vm-enabled yes #開啟vm 功能

vm-swap-file /tmp/redis.swap #交換出來的value 儲存的檔案路徑

vm-max-memory 1000000 #redis 使用的最大記憶體上限

vm-page-size 32 #每個頁面的大小32 個位元組

vm-pages 134217728 #最多使用多少頁面

vm-max-threads 4

#用于執行value 對象換入換出的工作線程數量

17.   主要nosql資料庫之間的比較

Bigtable

Cassandra

redis

mongoDB

設計理念

海量存儲和處理

簡單有效的擴充

高并發

全面

資料模型

Column-family

Key-value

Document

分布式

Single-master

P2P

M/S備份

Replica sets

特色

支援海量資料

采用dynamo和P2P

List,set的處理

不足

不适用低延遲的應用

Dynamo機制收到限制

在分布式方面支援有限

在性能和擴充性方面有限