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,如需轉載請自行聯系原作者