Redis簡介
Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API, 包括Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等
Redis 是一個高效能的key-value資料庫,它支援儲存的value類型包括string (字串)、list(鏈表)、set(集合)、zset(sorted set–有序集合)和hash(雜湊類型)。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支援各種不同方式的排序。
為了保證效率,資料都是緩衝在記憶體中,並且周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。Redis在一些應用場合可以對關聯式資料庫起到很好的補充作用。在某些場合,可以認為Redis是一個記憶體資料庫,通過記憶體緩衝功能來達到效能的極大提升。
1. 環境搭建
Redis可以通過兩種方式安裝
通過原始碼安裝
從redis.io下載最新版redis-X.Y.Z.tar.gz後解壓,然後進入redis-X.Y.Z檔案夾後直接make即可
通過安裝包管理工具安裝
以ubuntu為例 :#sudo apt-get install redis-server
這種方式安裝的redis server不是最新版本,但是滿足基本使用是沒有問題的
2. 常用配置
Redis提供了豐富的配置,預設設定檔是安裝根目錄下的redis.conf。通常情況下大部分配置項只需要保持預設值就能滿足大多數應用情境,下面是一些常用的配置項。
是否以daemon形式來運行
daemonize no
預設為no
響應請求的IP
bind 192.168.1.100 10.0.0.1
預設會響應本機所有可用網卡的串連請求,如果要響應所有機器的串連,需要修改為bind 0.0.0.0
連接埠號碼
port 6379
日誌等級
共分四級,即debug、verbose、notice、warning, 其中warning的層級最高
loglevel notice
logfile設定記錄檔的產生位置
logfile
如果為空白,則日誌會輸出到標準輸出
資料庫的總數量
databases 16
這16個資料庫的編號將是0到15。預設的資料庫是編號為0的資料庫。使用者可以使用select <DBid>來選擇相應的資料庫
資料儲存到磁碟上,即控制RDB快照功能
save 900 1 //表示每15分鐘且至少有1個key改變,就觸發一次持久化
save 300 10 //表示每5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000 //表示每60秒至少有10000個key改變,就觸發一次持久化
禁用RDB持久化的策略,只要不設定任何save指令就可以,或者給save傳入一個Null 字元串參數也可以達到相同效果
設定Redis主從同步
slaveof <masterip> <masterport>
AOF持久化
appendonly no
redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢複了
3. 常用命令
用戶端串連
#src/redis-cli
停止redis服務:
src/redis-cli> shutdown
取出當前匹配的所有key
> keys *
設定key的值
> set keyname keyvalue
擷取key的值
> get keyname
當前的key是否存在, 0表示不存在
> exists larry
(integer) 0
刪除指定的key
> del lv
設定到期時間
> expire larry 10
(integer) 1
移動larry索引值對到ad4資料庫
> move larry ad4
(integer) 1
移除當前key的到期時間
> persist lv
(integer) 1
隨機返回一個key
> randomkey
重新命名key
> rename
測試連接是否還在
> ping
PONG
列印
> echo name
“larry”
資料庫切換
> select ad4databank
OK
退出串連
> quit
當前資料庫中key的數量
> dbsize
(integer) 12
伺服器基本資料
> info
擷取伺服器的參數配置
> config get
清空當前資料庫
> flushdb
清除所有資料庫
> flushall
4. 應用程式介面
因為Redis的資料操作非常簡單,應用程式API介面用法也非常直觀明了,有了相應的第三方庫支援,串連上Redis Server之後,剩下的就是很簡單的一些操作,上面第四節中命令支援的,應用程式API介面也基本上都支援。
Java
引入Jedis這個第三方庫之後,就可以用例子代碼進行簡單的資料插入和查詢動作了
public static void main(String[] args) {
Jedis jedis = new Jedis("147.151.240.234",6379);
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
}
當然也有好事者對Jedis進行了進一步封裝,使得該API更方便靈活,很有名的例子就是Jfinal中的RedisPlugin
Python
首先需要安裝python的支援庫,通過執行命令sudo apt-get install python-redis或者在Windows環境下執行pip install redis即可,接下來就是對資料的增刪查操作了,非常直觀
import redis
r = redis.Redis(host='10.0.1.7', port=6379, db=1)
# 查資料庫大小
print '\ndbsize: %s' % r.dbsize()
# 塞資料
r['c1'] = 'bar'
#或者
r.set('c2','bar')
# 取資料
print 'r['']:',r['c1']
#或者
print 'get:',r.get('a')
#或者 同時取一批
print 'mget:',r.mget('c1','c2')
#或者 同時取一批 它們的名字(key)很像 而恰好你又不想輸全部
print 'keys:',r.keys('c*')
#又或者 你只想隨機取一個:
print 'randomkey:',r.randomkey()
# 查看一個資料有沒有 有 1 無0
print 'existes:',r.exists('a')
# 刪資料 1是刪除成功 0和None是沒這個東西
print 'delete:',r.delete('cc')
# 哦對了 它是支援大量操作的
print 'delete:',r.delete('c1','c2')
5. 案例分析
在我們的項目中,Redis作為關係型資料庫的一個記憶體緩衝,當有使用者查詢時,先查看Redis中是否有使用者需要的資訊,有的話直接返回;沒有需要的資訊,再到關係型資料庫中進行查詢,同時查詢的結果緩衝到Redis中,加快後續查詢的效能。總體而言,使用Redis之後,整個應用程式的效能提升了上百倍。