一、memcache介紹
1.1memcache
Memcached 是國外 社區 網站 LiveJournal 的開發團隊開發的 高性能的分布式內存緩存服務器。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態 Web 應用的速度、提高可擴展性。
1.2php操作memcache
1.2.1有效期
可以根據需求,把key的過期時間進行設置,如果key過期,返回的數據不存在則為false。
①時間差 多少秒之后過期
$mem->set(key,value,0,時間差);
當時間差的值,大於30天時(2592000分界值),被認為是時間戳
②時間戳 在什么時間戳點過期
$mem->set(key,value,0,時間戳[現在時間戳+時間差]);
注意:在linux環境下測試,使用1.5.0以上的版本,過期時間時間戳的方式不可用,可以使用時間差的方式。
測試在windows下環境下,使用1.2.6版本,過期時間設置時間差和時間戳的方式都可用。
1.2.2存儲各種數據類型
①標量類型 string(字符串) int(整型) float(浮點型) bool(布爾型)
標量類型在memcached中可以正常使用存儲
②復合類型 array(數組) object(對象)
復合類型在memcached中可以正常使用存儲
③特殊類型 null resource(資源)
Resource類型在memcached中不可以存儲使用
1.2.3 其他相關操作方法
刪除指定鍵的信息,(指定$timeout,則$timeout秒后刪除)
$mem->delete(鍵 [, int $timeout ]);
僅添加:Key存在則失敗,KEY不存在添加
$mem->add(key, value, 是否壓縮, 有效期)
僅替換(修改):Key存在則修改,KEY不存在失敗。
$mem->replace(Key, Value, 是否壓縮, 有效期)
add和replace語法使用set語法進行替代。
按照num的幅度,對key的值進行減少操作;
在memcached中,最小減到0,沒有負數。
$mem -> decrement(key,[數字])
按照num的幅度,對key的值進行增加操作
$mem -> increment(key,[數字])
刪除所有鍵
$mem->flush();
1.3 memcache的應用拓展
1、失效機制
①懶惰機制 過期的key不會直接刪除掉,會再次獲取時,才刪除。
②LRU Least Recently USE 最近最少使用 最近get。如果內存不夠存儲,會刪除這部分數據。如果不想啟動LRU機制,可以啟動時加入使用-M參數
2、分布式 memcache
分布式: 多台服務器同時使用。
分布式memcache,多個memcached同時使用。
memcache分布式是屬於共享模式的,使用內存大小等於多個memcache算術和(相加)。
2.1 使用分布式memcache的好處
①提高並發量
②提高數據穩定性
2.2 實現分布式memcache方式:
①多台服務器部署 性能更好
②一個服務器通過監聽不同的端口號,啟動多個memcache實列 性價比更高
實現操作:
①通過-p端口參數,啟動多個memcache實列
開啟防火牆端口,允許遠程訪問
注意重啟防火牆,使配置生效
②連接使用多個memcached的語法
$mem = new Memcache(); $mem->addserver('IP地址',‘不同端口號’);
二、redis介紹
1.1.1 介紹
redis是 Nosql 非關系數據庫 是由意大利人 antirez(Salvatore Sanfilippo) 開發的一款 內存高速緩存數據庫。
該軟件使用C語言編寫,它的數據模型為 key-value。
它支持豐富的數據結構,比如 String list(雙向鏈表) hash(哈希) set(集合) sorted set(有序集合)
可持久化(保存數據到磁盤中),保證了數據安全。
1.1.2適用的場合
①排行榜應用,取top n 操作 [Sort Set]
②獲得最新的N 個數據或者某個分類的最新數據 [List]
③計數器應用 [String]
④sns(social network site)獲得共同好友 [Set]
⑤防攻擊系統(ip判斷)等 [Set]
1.1.3 比較 memcache
①Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
②Redis支持master-slave(主—從)模式應用。
③Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
④Redis單個value的最大限制是1GB, memcached只能保存1MB的數據
⑤redis是單核進程,memcached是多核多進程
二、 操作使用
1.key
key的命名規則不同於一般語言,鍵盤上除了空格、\n換行外其他的大部分字符都可以使用。
Key不要太長。占內存,查詢慢 Key不要太短
exists key 測試指定 key 是否存在 del key1 key2 ... keyN 刪除給定key type key 返回給定key的value類型 rename oldkey newkey 改名字 flushdb 刪除當前數據庫中所有的key 等等
2、string
string是redis最基本的類型
redis的string可以包含任何數據。包括jpg圖片 或者序列化的對象。
單個value值最大上限是1G字節。
如果只用string類型,redis就可以被看作加上持久化特性的memcache
set key value 設置key對應的值為string類型的value mset key1 value1 ... keyN valueN 一次設置多個key的值 mget key1 ... keyN 一次獲取多個key的值 append key value 給指定key的字符串值追加value substr key start end 返回截取過的key的字符串值 等等
3、List
list類型其實就是一個雙向鏈表。通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。
這使得list既可以用作棧,也可以用作隊列。
同一端進出 先進后出 棧
一端 另外一端出 先進先出 隊列
lpush key string 在key對應list的頭部添加字符串元素 rpop key 從list的尾部刪除元素,並返回刪除元素 lrange key start end 返回指定區間內的元素,下標從0 開始 ltrim key start end 截取list,保留指定區間內元素 等等
4、set
redis的set是string類型的無序集合。集合里不允許有重復的元素
set元素最大可以包含(2的32次方-1)個元素
set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦功能。
sadd key member 添加一個string 元素到key對應的set集合中,成功返回1 scard key 返回set的元素個數 sismember key member 判斷member是否在set中 smembers key 返回key對應set的所有元素,結果是無序的 等等
5、zset
和set一樣sorted set也是string類型元素的集合,
不同的是每個元素都會關聯一個權。
通過權值可以有序的獲取集合中的元素,可以通過score值進行排序
zadd key score member 添加元素到集合,元素在集合中存在則更新對應score zrem key member 刪除指定元素,1表示成功,如果元素不存在返回0 zrange key start end 類似 lrange 操作從集合中去指定區間的元素。返回的是有序結果 zrevrange key start end 同上,返回結果是按score逆序 等等
6、Hash
Hash存儲數據和關系型數據庫(mysql),存儲的一條數據的結構極為相似。
Key:value(field:value)
hset key field value 設置 hash field 為指定值,如果key不存在,則先創建 hget key field 獲取指定的 hash field hincrby key field integer 將指定的 hash field 加上給定值 hlen key 返回指定 hash的field數量 hgetall key 返回hash 的所有 ffiled 和 value 等等