天天看點

Redis學習Redis資料類型 String類型 list類型 set類型 sorted set類型 redis常用指令 Redis進階實用特性

noSQL适用場景

1.      對資料高并發讀寫

2.      對海量資料的高效存儲和通路

3.      對資料的高可擴充和高可用性

redis适用場合:

目前全球最大的redis使用者新浪微網誌

1.      取最新N個資料的操作

2.      排行榜應用,取TOP N操作

3.      需要精确設定過期時間的應用

4.      計數器應用

5.      Uniq操作,擷取某段時間所有資料排重值

6.      實時系統,反垃圾系統

7.      Pub/Sub建構實時消息系統

8.      建構隊列系統

9.      緩存

redis

mysql

mogodb

庫 

集合

行/列

字段

Redis安裝:

步驟一:

     下載下傳安裝包:

步驟二:

編譯源代碼:

tar zxvfredis-2.4.17.tar.gz

cd redis-2.4.17

make

cd src&& make install

步驟三:

     移動檔案,便于管理:

     mkdir –p /usr/local/redis/bin

    mkdir –p /usr.local/redis/etc

    mv /djh/redis-2.4.17/redis.conf /usr/local/redis/etc

    cd /djh/redis-2.4.17/src

    mv mkreleasehdr.sh redis-benchmark redis-check-aof  redis-check-dump  redis-cli redis-server   /usr/local/redis/bin

步驟四:

啟動redis服務:

  /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

   Redis服務端的預設端口是6379

預設情況下,redis不是在背景運作的,需要開啟redis的背景運作。

vi /usr/local/redis/redis.conf

将daemonize值改為yes

步驟五:

   用戶端連接配接:

  /usr/local/redis/bin/redis-cli

步驟六:

   停止redis:

  /usr/local/redis/bin/redis-cli shutdown

   或

  pkill redis-server

Redis配置:

daemonize  如果需要在背景運作,把該項改為yes

pifile 配置多個pid的位址,預設在/var/run/redis.pid

bind  綁定ip,設定後隻接受來自該IP的請求

port 監聽端口,預設6379

timeout 設定用戶端連接配接時的逾時時間,機關為秒

loglevel 分級4級,debug,verbose,notice,warning

logfile  配置log檔案位址

databases  設定資料庫的個數,預設使用的資料庫為0

save  設定redis進行資料庫鏡像的頻率

rdbcompression   在鏡像備份時,是否進行壓縮

dbfilename  鏡像備份檔案的檔案名

dir    資料庫鏡像備份的檔案存放位置

slaceof   設定資料庫為其它資料庫的從資料庫

masterauth  主資料庫連接配接需要的密碼驗證

requirepass   設定登入時需要使用的密碼

maxclients  限制同時連接配接的用戶端數量

maxmemory  設定redis能夠使用的最大記憶體

appendonly  開啟append only 模式

appendfsync   設定對appendonly.aof檔案同步頻率

vm-enabled  是否開啟虛拟記憶體支援

vm-swap-file   設定虛拟記憶體的交換檔案路勁

vm-max-memory   設定redis使用的最大實體記憶體大小

vm-page-size   設定虛拟記憶體的葉大小

vm-pages  設定交換檔案總的page數量

vm-max-threads   設定VMIO同時使用的線程數量

glueoutputbuf   把小的輸出緩存存放在一起

hash-max-zipmap-entries   設定hash的臨界值

activerehashing   重新hash

String類型及操作:

   String是最簡單的類型,一個key對應一個value,string類型是二進制安全的。Redis的string可以包含任何資料,比如JPG圖檔或者序列化對象。

Set

設定key對應的值為string類型的value

例如:添加一個name=lijie的鍵值對

set name lijies

setnx

設定key對應的值為string類型的value,如果key已經存在,傳回0,nx是not exist的意思。

setex

設定key對應的值為string類型的value,并指定此鍵值對應的有效期。

例如:setexhaircolor 10 red

mset

一次設定多個key的值,成功傳回ok表示所有的值都設定了,失敗傳回0表示沒有任何值被設定。

例:mset key1lijie1 key2 lijie2

msetnx

get

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

getset

設定key的值,并傳回key的舊值。

getrange

例:getrange name 0 5

mget

incr

對某一個key的值遞增。

例: incr key1

incrby

同incr類似,加指定值,key不存在時候會設定key,并認為原來的value是0.

例:incrby key1 5

decr

對某一個key的值遞減。

decrby

append

給指定key的字元串追加value,傳回新字元串的長度。

strlen

取指定key的value值的長度。

hashes類型

Redis hash 是一個string類型的field和value的映射表。他的添加、删除操作是o(1)(平均)。hash特别适合用于存儲對象。相較于對象的每個字段存成單個string類型。将一個對象存儲在hash類型中會占用更少的記憶體,并且可以更友善的存取整個對象。

hset

設定hash field為指定值,如果key不存在,則先建立。

hsetnx

hmset

hget

hmget

hincrby

hexists

測試指定field是否存在。

hlen

傳回指定hash的field數量。

hdel

删除指定hash的field。

hkeys

傳回hash的所有field.

hvals

傳回hash的所有value。

hgetall

擷取某個hash中全部的field及value。

List是一個連結清單結構,主要功能是push、pop、擷取一個範圍的所有值等,操作中key了解為連結清單的名字。Redis的list類型其實就是一個每個子元素都是string類型的雙向連結清單。可以通過push、pop操作連結清單的頭部或尾部添加删除元素,這樣list既可以作為棧,又可以作為隊列。

lpush

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

rpush

在key對應list的尾部添加字元串元素。

linsert

在key對應list的特定位置前或後添加字元串。

例:linsert list3 before one three

lset

設定list中指定下标的元素值。

例:lset list1 0 “world”

lrem

從key對應list中删除n個和value相同的元素。

ltrim

保留指定key的值範圍内的資料。

例:ltrim list1 1 -1

lpop

從list的頭部删除元素,并傳回删除元素。

例:lpop list1

rpop

從list的尾部删除元素,并傳回删除元素。

例:rpop list1

rpoplpush

從第一個list的尾部移除元素并添加到第二個list的頭部。

例:rpoplpush list1 list2

lindex

傳回名稱為key的list中index位置的元素。

llen

傳回key對應list的長度。

Set是集合,他是string類型的無序集合。Set是通過hashtable實作的,添加、删除和查找的複雜度都是O(1)。對集合可以取并集、交集、差集。通過這些操作可以實作好友推薦和blog的tag功能。

sadd

向名稱為key的set中添加元素。

smembers

檢視名稱為key的set的元素。

srem

删除名稱為key的set中的元素。

spop

随機傳回并删除名稱為key的set中一個元素。

sdiff

傳回所有給定key與第一個key的差集。

sdiffstore

傳回所給定key與第一個key的差集,并将結果存為另一個key.

例:sdiffstore set1 set2 set3

sinter

傳回所有給定key的交集。

sinterstore

傳回所給定key的交集,并将結果存為另一個key.

sunion

傳回所有給定key的并集。

sunionstore

傳回所有給定key的并集,并存為另一個key。

smove

從第一個key對應的set中移除member并添加到第二個對應的set中。

例:smove set1 set2 “aaa”

scard

傳回名稱為key的set的元素的個數。

sismember

測試member是否是名稱為key的set的元素。

srandmember

随機傳回名稱為key的set的一個元素,但不删除元素。

sorted set是set的一個更新版本,它在set的基礎上增加了一個順序屬性,這一屬性在修改元素時可以指定,每次指定後,zset會自動重新按新的值調整順序。可以了解為有兩列mysql表,一列存value,一列存順序。操作中key了解為zset的名字。

zadd

向名稱為key的zset中添加元素member,score用于排序。如果該元素存在,則更新期順序。

例:zadd zset1 1 “one”

zrange

從key中取值。

例:zrange set1 0  -1 withscores

zrem

删除名稱為key的zset中的元素的member.

zincrby

如果在名稱為key的zset中已經存在元素member,則該元素的score增加increment否則向該集合中添加該元素,其score的值為increment。

例:zincrby zset1 2 “one”

zrank

傳回名稱為key的zset中指定值的索引。

zrevrank

傳回名稱為key的zset中member元素的排名(按score從大到小排序)即下标。

zrevrange

zrangebyscore

zcount

傳回集合中score在給定區間的數量。

例:zcount zset1 2 3

zcard

傳回集合中元素個數。

zremrangebyrank

删除集合中排名在給定區間的元素。

例:zremtangebyrank zset1 1 1

zremrangebyscore

keys

傳回滿足給定pattern的所有key。

用表達式*,代表取出所有的key。

exists

确認一個key是否存在

del

删除一個key

expire

設定一個key的過期時間

例:expire  addr 10

ttl

檢視一個key的有效時長。

move

将目前資料庫中的key轉移到其它資料庫中。

persist

移除給定key的過期時間。

randomkey

随機傳回key空間的一個key

rename

type

傳回key的類型。

ping

測試連接配接是否存活。

echo

在指令行列印一些資料。

select

選擇資料庫。Redis資料庫編号從0-15。

quit

退出連接配接。

dbsize

傳回目前資料庫中key的數目。

info

config get

實時傳儲收到的請求。

例:config get dir

flushdb

删除目前選擇資料庫中所有key.

flushall

删除所有資料庫中的所有key。

1.      安全性

設定用戶端連接配接後進行任何其他指定前需要使用的密碼。

警告:因為redis速度相當快,所有在一台比較好的伺服器下,一個外部的使用者可以在一秒鐘進行150k次密碼嘗試,這意味着需要指定非常強大的密碼來防止暴力破解。

#requirepassfoobared

requirepassddd

用戶端:auth ‘’     授權

登入用戶端時指定密碼:

/usr/local/redis/bin/redis-cli–a ddd

2.主從複制

Redis主從複制配置和使用非常簡單。通過主從複制可以允許多個slave server擁有和masterserver相同的資料庫副本。

Redis主從複制特點:

(1)master可以擁有多個slave

(2)多個slave可以連接配接同一個master外,還可以連接配接到其它slave。

(3)主從複制不會阻塞master,在同步資料時,master可以繼續處理client請求。

(4)提高系統的伸縮性。

Redis主從複制過程:

(1)slave與master建立連接配接,發送sync同步指令。

(2)master會啟動一個背景程序,将資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫指令并緩存。

(3)背景完成儲存後,就将此檔案發送給slave。

(4)slave将此檔案儲存到硬碟上。

配置主從伺服器:

配置slave伺服器很簡單,隻需要在slave的配置檔案中加入以下配置:

       slaveof 192.168.177.1 6379   #指定master的IP和端口

    masterauth  aaa      #這是主機的密碼

3.事務處理

Redis對事務的支援目前還比較簡單。Redis隻能保證一個client發起的事務中的指令可以連續的執行,而中間不會插入其它client的指令。當一個client在一個連接配接中發出multi指令時,這個連接配接會進入一個事務上下文,該連接配接後續的指令不會立即執行,而是先放在一個隊列中,當執行exec指令時,redis會順序的執行隊列中的所有指令。

1.      持久化機制

snapshotting

快照是預設的持久化方式。這種方式是将記憶體中的資料以快照的方式寫入到二進制檔案中,預設的檔案名為dump.rdb。可以通過配置設定自動做快照持久化的方式。可以配置redis在n秒内如果m個key被修改就自動做快照。

Save 9001  #900秒内如果超過1個key被修改,則發起快照儲存

aof

由于快照方式是在一定間隔時間做一次的,是以如果redis意外down掉的話,就會丢失最後一次快照後的所有修改。

aof比快照方式有更好的持久性,是由于在使用aof時,redis會将每一個收到的寫指令都通過write函數追加到檔案中,當redis重新開機時會通過重新執行檔案中儲存的寫指令來子啊記憶體中重建整個資料庫内容。

當然由于OS會在核心中緩存write做的修改,是以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丢失部分修改。

可以通過配置檔案告訴redis我們想要通過fsync函數強制OS寫入到磁盤的時機。

appendonlyyes  //啟用aof持久化方式

#appendfsyncalways  //收到寫指令就立即寫入磁盤,最慢,但是保證完全的持久化

appendfsynceverysec   //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中

#appendfsyncno   //完全依賴OS,性能最好,持久化沒保證

5.釋出訂閱消息

釋出訂閱(pub/sub)是一種消息通信模式,主要的目的是解除消息釋出者和消息訂閱者之間的耦合,redis作為一個pub/sub的server,在訂閱者和釋出者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe指令向redisserver訂閱自己感興趣的消息類型,redis将資訊類型稱為通道(channel)。當釋出者通過publish指令向redis server發送特定類型的資訊時,訂閱該資訊類型的全部client都會受到此消息。

6.虛拟記憶體的使用

Redis的虛拟記憶體與作業系統的虛拟記憶體不是一回事,但是思路和目的都是相同的。就是暫時把不經常通路的資料從記憶體交換到磁盤中,進而騰出寶貴的記憶體空間用于其他需要通路的資料。尤其是對于redis這樣的記憶體資料庫,記憶體總是不夠用。除了可以将資料分割到多個redis server外。另外能夠提高資料庫容量的辦法就是使用虛拟記憶體把那些不經常通路的資料交換到磁盤上。

下面是vm相關配置:

vm-enabledyes                #開啟vm功能

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

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

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

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

vm-max-threads4            #用于執行value對象換入的工作線程數量

本文轉自 www19 51CTO部落格,原文連結:http://blog.51cto.com/doujh/1731220,如需轉載請自行聯系原作者