Redis, Memcache 基本使用
Redis, Memcache
Memcache
MemCache是一個自由、源碼開放、高性能、分布式的內存對象緩存系統,用于動態Web應用以減輕數據庫的負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高了網站訪問的速度。
安裝
https://github.com/memcached/memcached/wiki/Install
啟動服務
memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid參數說明:-d 是啟動一個守護進程-m 是分配給Memcache使用的內存數量,單位是MB-u 是運行Memcache的用戶-l 是監聽的服務器IP地址-p 是設置Memcache監聽的端口,最好是1024以上的端口-c 選項是最大運行的并發連接數,默認是1024,按照你服務器的負載量來設定-P 是設置保存Memcache的pid文件測試時可以關閉防火墻,否則客戶端無法訪問:systemctl stop firewalld.service
python中操作MemCache
安裝API
pip install python-memcached -i https://pypi.douban.com/simple操作測試
這里在Django項目中測試
from django.conf.urls import url from django.shortcuts import HttpResponse import memcachedef test(request):mc = memcache.Client(['192.168.14.16:12000'], debug=True)mc.set('name', 'Lena', time=5) # 超時5秒name = mc.get('name')return HttpResponse(name)urlpatterns = [url(r'^test/', test), ]分布式緩存
配置多個服務端,并設置權重,權重越高,命中幾率越高。
mc = memcache.Client([('192.168.14.16:12000', 1), ('192.168.14.17:12000', 2), ('192.168.14.18:12000', 3)], debug=True) # 分別設置1,2,3權重Memcache的分布式是由客戶端程序的一致性哈希實現的,更多參考:http://www.csdn.net/article/2016-03-16/2826609
MemCache常用方法
注意:
- MemCache中存的值只支持字符串和數字
- 超時設置的時間單位是秒,超時后取出結果是None
| get | 返回Key對應的Value值:mc.get(key) |
| add | 添加一個Key值,沒有則添加,有則報錯:mc.add(key, val, time=10) 添加鍵值,并設置超時10秒 |
| set | 設置一個Key值,沒有就增加,有就覆蓋:mc.set(key, val, time=10) |
| replace | 按照相應的Key值替換數據,如果Key值不存在則會操作失敗:mc.replace(key, val) |
| delete | 刪除一個鍵值對:mc.delete(key) |
| stats | 返回MemCache通用統計信息 |
| flush_all | 清空所有鍵值,但不會刪除items,所以此時MemCache依舊占用內存:mc.flush_all() |
其它方法
set_multi 設置多個鍵值對
mc.set_multi({k1: v1, k2: v2})del_multi刪除多個鍵值對
mc.set_multi([k1, k2])incr & decr
將key對應的值增加/減小
mc.set('a', 10) mc.incr('a', 10) # 'a' = 20 mc.decr('a', 5) # 'a' = 15append & prepend
在指定key值后面/前面追加
mc.set('name', 'Lena') # 'name'= 'Lena' mc.append('name', 'Ayhan') # 'name' = 'LenaAyhan'cas & gets
為了避免兩個請求同時修改某個值,造成數據異常。gets和cas需要配合使用。
通過gets獲取值的時候(假設是val),會多返回一個數字,就叫做cas_id吧,當val改變時(比如期間有另一個請求修改了val),這個cas_id也會變。當執行cas(check and set)重新設置值時,將檢查cas_id是否和gets取出值時的cas_id匹配,如果匹配則修改,如果不匹配,表示期間有其它請求修改了val,則無法修改.
val = mc.gets(key) # ... # 如果在gets和cas之間有請求修改了key的值,那么,下面的cas將會檢查到cas_id變了,拋出異常,避免修改造成數據異常 mc.cas(key, new_val)Redis
同MemCache一樣,Redis也是在服務器內存中保存的非關系型數據庫(緩存),但是二者還是有些區別:
如果你對數據持久化和數據同步有所要求,那么推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統后緩存數據不會丟失,選擇Redis也是明智的。
Redis相比Memcached來說,擁有更多的數據結構和并支持更豐富的數據操作。
Redis不僅可以支持分布式,還具有高可用的特點:可以將數據定時刷入硬盤,解決了內存斷電易失的問題。并且它支持更多的的數據類型:字符串,數字,列表,集合,字典,有序集合。
在python中使用Redis
centos服務端安裝
yum install redis如果安裝不上,先安裝epel倉庫yum install epel-release,再執行上述安裝命令。
啟動服務端:
systemctl start redis配置:
vim/etc/redis.conf# bind 127.0.0.1 這一行要注釋掉,否則客戶端連接不上 equirepass 123 # 設置密碼客戶端安裝:
pip install redis連接
方式一
import redis conn = redis.Redis(host=, port=, password='123')不推薦,每次都會重新連接,創建新的對象。
方式二 推薦
推薦用連接池:
pool = redis.ConnectionPool(host=xx, port=xx, password='123') conn = redis.Redis(connection_pool = pool)進階:單例模式
這里的host, port, password可以寫到配置文件中。
import redisclass Singleton(object):def __new__(cls, *args, **kwargs):# 如果當前類沒有_instance屬性,那么就調用父類的__new__方法實例化對象,新增_instance屬性并賦值if not hasattr(cls, "_instance"):cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass SingleRedis(Singleton):def __init__(self, host='192.168.14.16', port=6379, password=123):pool = redis.ConnectionPool(host=host, port=port, password=password)self.conn = redis.Redis(connection_pool=pool)# 使用 redis = SingleRedis() redis.conn.set(key, val)字符常用操作
conn.set(name, value, ex=None, px=None, nx=False, xx=False)
為name設置value(字符/數字類型);
ex/px: 過期時間(秒/毫秒);
nx: 如果為True,那么只有當name對應的value不存在時,該操作才能成功(即如果name在Redis中已經有value,將不會設置新的value,保留原來的值);默認False,無論如何設置新值。
xx: 如果為True,那么只有當name對應的value已經存在時,該操作才能成功(即只能更新已存在的name)。
conn.mset(*args, **kwargs)
批量設置值
conn.mset(k1=v1, k2=v2) # 或者 conn.mset({k1: v1, k2: v2})conn.get(name)
返回name對應的value,如果不存在返回None
conn.get(keys, *args)
批量獲取值
conn.mget(k1, k2) # 或者 conn.mget([k1, k2])conn.incr/decr(name, amount=1)
將name對應的value增加/減少amount,如果name不存在,將創建并初始化值為amount
列表常用操作
conn.lpush(name, *values)
往name對應的列表中添加元素(依次添加到最左邊)
redis.conn.lpush('fruits', 'banana', 'orange') # fruits: ['orange', 'banana']conn.rpush(name, *values)
往k對應的列表中添加元素(從右邊添加)
conn.llen(name)
name對應列表的長度
conn.lpop(name)
name對應列表的左邊彈出一個值并返回
conn.rpop(name)
name對應列表的右邊彈出一個值并返回
字典常用操作
conn.hset(name, key, value)
設置字典 name: {key: value};
conn.hset(name, key2, value2) name: {key: value, key2: value2} 字典
注意如果value是字典或其它格式,需要先序列化為字符串
conn.hget(name, key)
獲取name對應字典中key對應的value
conn.hdel(name, key)
刪除name對應字典中的key
集合操作
將前綴s改為z,即可變為有序集合
conn.sadd(name, *values)
往name集合中添加元素
conn.scard(name)
返回name集合中元素的個數
conn.smembers(name)
獲取name集合中的所有元素
conn.srem(name, *values)
刪除name集合中某些元素
其它操作
delete(*names)
刪除指定的keys
exists(name)
判斷name是否存在,返回True/False
expire(name, time)
為某個name設置超時時間,單位是秒
總結
以上是生活随笔為你收集整理的Redis, Memcache 基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux基础命令---ab测试apac
- 下一篇: linux cmake编译源码,linu