讓你的程序性能獲得百倍的提升—Redis入門
應用程序處理的數據越來越多,對并發訪問的要求越來越大,程序的性能卻并沒有提升。發布日期越近,我們的心情就越想熱鍋上的螞蟻,那叫一個急啊!不停的做性能剖析,做性能調優,卻百思不得其解。幸好,我們及時遇到了Redis,讓性能瞬間提升了百倍,真的有一種山窮水盡疑無路,柳暗花明又一村的感覺!今天我們就簡單介紹一下Redis的一些用法,給大家的性能調優提供一種新的思路。
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是一個內存數據庫,通過內存緩存功能來達到性能的極大提升。
- 環境搭建
Redis可以通過兩種方式安裝
- 通過源代碼安裝
從redis.io下載最新版redis-X.Y.Z.tar.gz后解壓,然后進入redis-X.Y.Z文件夾后直接make即可
- 通過安裝包管理工具安裝
#sudo apt-get install redis-server
這種方式安裝的redis server不是最新版本,但是滿足基本使用是沒有問題的
- 常用配置
Redis提供了豐富的配置,缺省配置文件是安裝根目錄下的redis.conf。通常情況下大部分配置項只需要保持缺省值就能滿足大多數應用場景,下面是一些常用的配置項。
- Redis是否以daemon形式來運行
daemonize no
缺省為no
- Redis響應請求的IP
bind 192.168.1.100 10.0.0.1
缺省會響應本機所有可用網卡的連接請求,如果要響應所有機器的連接,需要修改為bind 0.0.0.0
- Redis服務端口號
port 6379
- 日志等級,共分四級,即debug、verbose、notice、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傳入一個空字符串參數也可以達到相同效果
- 設置Redis主從同步
slaveof <masterip> <masterport>
- AOF持久化
appendonly no
redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到后再重復執行一遍,就可以實現數據恢復了
- 常用命令
- 客戶端連接
#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
- 應用程序接口
因為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’)
- 案例分析
在我們的項目中,Redis作為關系型數據庫的一個內存緩存,當有用戶查詢時,先查看Redis中是否有用戶需要的信息,有的話直接返回;沒有需要的信息,再到關系型數據庫中進行查詢,同時查詢的結果緩存到Redis中,加快后續查詢的性能。總體而言,使用Redis之后,整個應用程序的性能提升了上百倍。
來自:http://www.flyml.net/2016/08/20/讓你的程序性能獲得百倍的提升-redis入門/