標籤:style blog http color java 使用 os io
目錄
1. Redis 簡介2. Redis安裝配置3. 編程使用Redis
1. Redis 簡介
0x1: Redis是什麼
Redis是一款Nosql類型的基於key-value的快取系統,
從架構上看,redis有3種特性
1. key value store是一個以key-value形式儲存的資料庫,定位直指MySQL,用來作為唯一的儲存系統2. memory cache是一個把資料存放區在記憶體中的快取,用來在應用和資料庫間提供緩衝,替代memcachd3. data structrue server把它支援對複雜資料結構的高速操作作為賣點,提供某些特殊業務情境的計算和展現需求。比如熱門排行榜應用,Top 10之類的
在redis的索引值的"值"中,它所支援的資料結構有:
1. String 1) 常用命令 set、get、decr、incr、mget等 2) 應用情境 String是最常用的一種資料類型,普通的key/value儲存都可以歸為此類 3) 實現方式 String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr、decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int2. Hash 1) 常用命令 hget、hset、hgetall等 2) 應用情境 3) 實現方式 Redis Hash對應Value內部實際就是一個HashMap,實際這裡會有2種不同實現 3.1) 這個Hash的成員比較少時Redis為了節省記憶體會採用類似一維數組的方式來緊湊儲存,而不會採用真正的HashMap結構,對應的value redisObject的encoding為zipmap 3.2) 當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht3. List 1) 常用命令 lpush、rpush、lpop、rpop、lrange等 2) 應用情境 Redis list的應用情境非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現 3) 實現方式 Redis list的實現為一個雙向鏈表,即可以支援反向尋找和遍曆,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝隊列等也都是用的這個資料結構4. Set 1) 常用命令 sadd、spop、smembers、sunion等 2) 應用情境 Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集
合內的重要介面,這個也是list所不能提供的 3) 實現方式: set的內部實現是一個value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因5. Sorted set 1) 常用命令 zadd、zrange、zrem、zcard等 2) 使用情境 Redis sorted set的使用情境與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的參數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集
合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣擷取時就是自動按時間排好序的 3) 實現方式 Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的映射,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲
得比較高的尋找效率,並且在實現上比較簡單
Redis內部使用一個redisObject對象來表示所有的key和value
1. type代表一個value對象具體是何種資料類型2. encoding不同資料類型在redis內部的儲存方式,比如:type=string代表value儲存的是一個一般字元串,那麼對應的encoding可以是raw或者是int,如果是int則代表實際redis內部是按數值型類儲存和表示這個字串的,當然前提是這個
字串本身可以用數值表示,比如:"123" "456"這樣的字串3. ptr資料指標4. vm只有開啟了Redis的虛擬記憶體功能,此欄位才會真正的分配記憶體,該功能預設是關閉狀態的
我們可以發現Redis使用redisObject來表示所有的key/value資料是比較浪費記憶體的,當然這些記憶體管理成本的付出主要也是為了給Redis不同資料類型提供一個統一的管理介面
Relevant Link:
http://try.redis.io/http://www.redis.cn/http://jandyu.diandian.com/post/2012-03-15/16145594http://tech.it168.com/a2011/0818/1234/000001234478_all.shtmlhttp://hedatou.com/archives/introduction_to_redis.html
2. Redis安裝配置
0x1: 主程式安裝
cd /usr/localwget http://download.redis.io/releases/redis-2.8.13.tar.gztar xzf redis-2.8.13.tar.gzcd redis-2.8.13make/*make命令執行完成後,會在當前src目錄(/usr/local/redis-2.8.13/src)下產生本個可執行檔如下:1. redis-server:Redis伺服器的daemon啟動程式2. redis-cli:Redis命令列操作工具。當然,你也可以用telnet根據其純文字協議來操作3. redis-benchmark:Redis效能測試工具,測試Redis在你的系統及你的配置下的讀寫效能4. redis-stat:Redis狀態偵查工具,可以檢測Redis目前狀態參數及延遲狀況 */
0x2: 命令測試
//啟動server./redis-server//測試benchmark./redis-benchmark//使用內建的用戶端串連Redis./redis-cli127.0.0.1:6379> set foo barOK127.0.0.1:6379> get foo"bar"127.0.0.1:6379>
0x3: 運行Redis所需要的核心參數最佳化
/*1. overcommit_memory指定了核心針對記憶體配置的策略,其值可以是0、1、2。0: 表示核心將檢查是否有足夠的可用記憶體供應用進程使用 1) 如果有足夠的可用記憶體,記憶體申請允許 2) 否則,記憶體申請失敗,並把錯誤返回給應用進程1: 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何2: 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體*/vim /etc/sysctl.conf//添加vm.overcommit_memory=1//重新整理配置使之生效sysctl vm.overcommit_memory=1
0x4: Redis設定檔
vim /usr/local/redis-2.8.13/redis.conf//1. 開啟守護進程daemonize yes //2. 每隔5秒輸出一行監控資訊(預設)daemonize no//3. 減小改變次數,這個參數可以根據情況進行指定save 60 1000 //4. 分配256M記憶體maxmemory 256000000 //5. pid檔案位置pidfile /var/run/redis.pid //6. 監聽的連接埠號碼port 6379//7. 請求逾時時間timeout 0//8. log資訊層級loglevel notice//9. 開啟資料庫的數量databases 16/*10. 儲存快照的頻率 1) 第一個*表示多長時間 2) 第二個*表示執行多少次寫操作在一定時間內執行一定數量的寫操作時,自動儲存快照。可設定多個條件*/save * *//11. 是否使用壓縮rdbcompression yese//12. 資料快照檔案名稱(只是檔案名稱,不包括目錄)dbfilename dump.rdb//13. 資料快照的儲存目錄(這個是目錄)dir .///14. 是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高資料抗風險能力,但影響效率appendonly no/*15. appendonlylog如何同步到磁碟 1) always: 每次寫都強制調用fsync 2) everysec: 每秒啟用一次fsync 3) no: 不調用fsync等待系統自己同步*/ appendfsync everysec
配置好儲存,重啟redis,就可以正常啟動了,和mysql一樣,redis是基於socket監聽連接埠的方式提供服務的,我們可以使用telnet、或者socket方式進行串連
Relevant Link:
http://www.redis.cn/documentation.htmlhttp://www.redis.cn/download.htmlhttp://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/0406/7873.html
3. 編程使用Redis
0x1: PHP串連Redis
使用php串連redis需要安裝php的擴充
下載redis擴充原始碼http://pecl.php.net/package/redis解壓縮後進行編譯phpize./configure --enable-hellomake關於php擴充的原理以及編譯過程請參閱另一篇文章http://www.cnblogs.com/LittleHann/p/3562259.html將編譯好的.so檔案複製到php的擴充目錄中cp redis.so /usr/lib/php/modules/修改php.ini中的extension,增加redis擴充的自動啟動重啟apache即可
Code
<?php $redis = new redis(); $result = $redis->connect(‘192.168.207.128‘, 6379); var_dump($result); //結果:bool(true) $result = $redis->set(‘name‘,"LittleHann"); var_dump($result); //結果:bool(true) $result = $redis->get(‘name‘); var_dump($result); //結果:LittleHann $redis->delete(‘name‘); var_dump($result); //結果:bool(true) ?>
Relevant Link:
https://github.com/nrk/predishttps://github.com/Shumkov/Rediskahttps://github.com/jdp/redisenthttp://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.htmlhttp://blog.51yip.com/cache/1439.htmlhttp://www.cnblogs.com/jackluo/p/3412670.html
0x2: Java串連Redis
Relevant Link:
http://outofmemory.cn/code-snippet/128/java-usage-redis-jiandan-usagehttp://www.cnblogs.com/edisonfeng/p/3571870.html
Copyright (c) 2014 LittleHann All rights reserved