標籤:字串 周期性 持久性 關聯式資料庫 用戶端
簡介
redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)和zset(有序集合)。這些資料類型都支push/pop,add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高效能的key-value資料庫,redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部分場合可以對關聯式資料庫起到很好的補充作用,它提供了Python,Ruby,Erlang,PHP用戶端,使用很方便。
ACID
ACID,指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支援事務(Transaction)的資料庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證資料的正確性,交易過程極可能達不到交易方的要求。
原子性
整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被復原(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性
在事務開始之前和事務結束以後,資料庫的完整性條件約束沒有被破壞。
隔離性
兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的資料。
持久性
在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被復原。
具體操作:
1. 安裝redis 並布置環境(指定後台運行)# tar -zxvf redis-2.4.17.tar.gz 解壓# cd redis-2.4.17 進入目錄# make 編譯# make PREFIX=/usr/local/redis install 指定目錄安裝# cd /usr/local/redis/ 進入安裝後的目錄# mkdir etc logs 建立兩個目錄# cd etc# cp /lamp/redis-2.4.17/redis.conf /usr/local/redis/etc/ 複製設定檔# cd etc/# vi redis.conf 修改設定檔:開啟後台運行、指定記錄檔。 daemonize yes 開啟後台運行 logfile /usr/local/redis/logs/redis.log 指定記錄檔。# ./redis-server /usr/local/redis/etc/redis.conf 啟動# ps -ef | grep redis 查看進程# netstat -tunpl | grep 6379 查看連接埠# ./redis-cli 用戶端命令連結的伺服器 redis 127.0.0.1:6379> redis 127.0.0.1:6379>quit 退出# pkill redis-server 結束redis進程。或: # ./redis-cli shutdown 執行關閉
Redis的資料類型
1. 共計5種類型:string(字串)、hashes類型、list(雙向鏈表)、set(集合)和zset(有序集合)
2. String(子串類型)
set命令:設定一個鍵和值,鍵存在則只覆蓋,返回ok > set 鍵 值 例如: >set name zhangsan get命令:擷取一個鍵的值,傳回值 > get 鍵 例如:>get name setnx命令:設定一個不存在的鍵和值(防止覆蓋), > setnx 鍵 值 若鍵已存在則返回0表示失敗 setex命令:設定一個指定有效期間的鍵和值(單位秒) > setex 鍵 [有效時間] 值 例如: >setex color 10 red 不寫有效時間則表示永久有效,等價於set setrange命令:替換子字串 (替換長度由子子串長度決定) > setrange 鍵 位置 子字串 > setrange name 4 aa 將name鍵對應值的第4個位置開始替換 mset命令:大量設定鍵和值,成功則返回ok > mset 鍵1 值1 鍵2 值2 鍵3 值3 .... msetnx命令:大量設定不存在的鍵和值,成功則返回ok > msetnx 鍵1 值1 鍵2 值2 鍵3 值3 .... getset命令:擷取原值,並設定新值 getrange命令:擷取指定範圍的值 >getrange 鍵 0 4 //擷取指定0到4位置上的值 mget命令: 批量擷取值 >mget 鍵1 鍵2 鍵3.... incr命令: 指定鍵的值做加加操作,返回加後的結果。 > incr 鍵 例如: >incr kid incrby命令: 設定某個鍵加上指定值 > incrby 鍵 m //其中m可以是正整數或負整數 decr命令: 指定鍵的值做減減操作,返回減後的結果。 > decr 鍵 例如: >decr kid decrby命令: 設定某個鍵減上指定值 > decrby 鍵 m //其中m可以是正整數或負整數 append命令:給指定key的字串追加value,返回新字串值的長度 >append 鍵 追加字串ha strlen求長度 >strlen 鍵名 //返回對應的值。
3. hashes類型
hset命令:設定一個雜湊表的鍵和值>hset hash名 鍵 值如:>hset user:001 name zhangsan hsetnx命令:設定一個雜湊表中不存在的鍵和值>hsetnx hash名 鍵 值 //成功返回1,失敗返回0如:>hsetnx user:001 name zhangsanhmset命令: 大量設定 hget命令: 擷取執行雜湊名中的鍵對應值 >hexists user:001 name //是否存在, 若存在返回1>hlen user:001 //擷取某雜湊user001名中鍵的數量>hdel user:001 name //刪除雜湊user:001 中name鍵>hkeys user:002 //返回雜湊名為user:002中的所有鍵。>hvals user:002 //返回雜湊名為user:002中的所有值。>hgetall user:002 //返回雜湊名為user:002中的所有鍵和值。
4. list類型(雙向鏈表結構)
list即可以作為“棧”也可以作為"隊列"。
操作:
>lpush list1 "world" //在list1頭部壓入一個字串>lpush list1 "hello" // 在list1頭部壓入一個字串>lrange list1 0 -1 //擷取list1中內容 0:表示開頭 -1表示結尾。 >rpush list2 "world" //在list2尾部壓入一個字串>rpush list2 "hello" // 在list2尾部壓入一個字串>lrange list2 0 -1 //擷取list2中內容 0:表示開頭 -1表示結尾。 >linsert list2 before "hello" "there"在key對應list的特定位置前或後添加字串>lset list2 1 "four"修改指定索引位置上的值>lrem list2 2 "hello" //刪除前兩個hello值>lrem list2 -2 "hello" //刪除後兩個hello值>lrem list2 0 "hello" //刪除所有hello值>ltrim mylist8 1 -1 //刪除此範圍外的值>lpop list2 //從list2的頭部刪除元素,並返回刪除元素>rpop list2 //從list2的尾部刪除元素,並返回刪除元素>rpoplpush list1 list2 //將list1的尾部一個元素移出到list2頭部。並返回>lindex list2 1 //返回list2中索引位置上的元素>llen list2 //返回list2上長度
5.sets類型和操作
>sadd myset "hello" //向myset中添加一個元素 成功返回1,失敗(重複)返回0>smembers myset //擷取myset中的所有元素>srem myset "one" //從myset中刪除一個one 成功返回1,失敗(不存在)返回0 >spop myset //隨機返回並刪除myset中的一個元素>sdiff myset1 myset2 //返回兩個集合的差集以myset1為標準,擷取myset2中不存在的。>sdiffstor
Redis常用命令
1. 索引值相關命令
>keys * //返回鍵(key)>keys list* //返回名以list開頭的所有鍵(key)>exists list1 //判斷鍵名為list1的是否存在 存在返回1, 不存在返回0>del list1 //刪除一個鍵(名為list1)>expire list1 10 //設定鍵名為list1的到期時間為10秒後>ttl list1 //查看鍵名為list1的到期時間,若為-1表示以到期>move age 1 //將鍵名age的轉移到1資料庫中。>select 1 //表示進入到1資料庫中,預設在0資料庫>persist age //移除age的到期時間(設定為到期)
Redis進階實用特性
1. 安全性:為Redis添加密碼
1.進入設定檔:
requirepass redis的密碼
2. 重啟服務:
# ./redis-cli shutdown 執行關閉
# ./redis-server /usr/local/redis/etc/redis.conf 啟動
3. 登入(兩種)
# ./redis-cli 用戶端命令連結的伺服器
>auth 密碼值 //授權後方可使用
# ./redis-cli -a 密碼 //串連時指定密碼來進行授權
2.主從複製
操作步驟:
1.先將linux虛擬機器關閉,之後複製一個。
2.啟動兩個虛擬機器:master(主)和slave(從)
3. 在slave(從)中配置一下ip地址
# ifconfig eth0 192.168.128.229
# ping 一下看看通不通。
4. 配置從機
進入:設定檔
slaveof 192.168.128.228 6379 //配置串連主機的Redis的ip和連接埠
masterauth 密碼 //配置串連密碼
最後啟動slave(從)機的Redis服務。
其他:可以通過info命令中的role屬性查看自己角色是master、slave
3.交易處理
>multi //開啟一個事務
>set age 10 //暫存指令隊列
>set age 20
>exec //開始執行(提交事務)
或>discard //清空指令隊列(交易回復)
4.樂觀鎖
在事務前對被操作的屬性做一個:
> watch age
>multi //開啟一個事務(在此期間有其他修改,則此處會失敗)
>set age 10 //暫存指令隊列
>set age 20
>exec //開始執行(提交事務)
或>discard //清空指令隊列(交易回復)
5.持久化機制
1. snapshotting(快照)預設
配置save
save 900 1 #900秒內如果超過1個key被修改,則發起快照儲存
save 300 10 #300秒內容如超過10個key被修改,則發起快照儲存
save 60 10000
2. Append-only file(aof方式)
配置 appendonly on 改為yes
會在bin目錄下產生一個.aof的檔案
關於aof的配置
appendonly yes //啟用aof 持久化方式
# appendfsync always //收到寫命令就立即寫入磁碟,最慢,但是保證完全的持久化
appendfsync everysec //每秒鐘寫入磁碟一次,在效能和持久化方面做了很好的折中
# appendfsync no //完全依賴os,效能最好,持久化沒保證
6.發布及訂閱訊息
需要開啟多個會話連接埠
會話1:>subscribe tv1 //監聽tv1頻道
會話2:>subscribe tv1 tv2 //監聽tv1和tv2頻道
會話3: >publish tv1 訊息 //向tv1頻道發送一個訊息
7.使用虛擬記憶體
在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對象換入患處的背景工作執行緒數量
redis 簡介與常用操作