Redis是開源的高性能Key-Value數據庫,能夠用於緩存等用途.python
Redis能夠提供事務和持久化支持保證併發安全性,並提供TTL(time to life)服務.redis
Ubuntu系統能夠用包管理器安裝Redis服務:數據庫
sudo apt-get install redis-server
json
並安裝客戶端:緩存
sudo apt-get install redis-tools
安全
進入Redis客戶端服務器
redis-cli
session
登陸遠程Redis服務數據結構
redis-cli -h host -p port -a password
併發
Redis的Key-Value均爲大小寫敏感的,可是Redis指令對大小寫不敏感.
Redis使用字符串做爲Key,經常使用操做命令有:
SET key val
設置鍵值對,無則新建有則更新
127.0.0.1:6379> set user name OK
DEL key
刪除鍵值對, 返回刪除的條數
127.0.0.1:6379> del user (integer) 1
GET key
返回Value
127.0.0.1:6379> get user "name"
EXISTS key
檢查指定鍵值對是否存在
127.0.0.1:6379> exists user (integer) 1
KEYS pattern
使用通配符篩選顯示全部符合條件的鍵
127.0.0.1:6379> keys * 1) "playing_yichya" 2) "playing_yy" 3) "online_yichya" 4) "user" 5) "online_yy" 127.0.0.1:6379> keys *_* 1) "playing_yichya" 2) "playing_yy" 3) "online_yichya" 4) "online_yy"
RANDOMKEY
隨機返回一個鍵
127.0.0.1:6379> randomkey "hm1"
RENAME key newname
重命名鍵
127.0.0.1:6379> set user2 234 OK 127.0.0.1:6379> set user 233 OK 127.0.0.1:6379> rename user user2 OK 127.0.0.1:6379> get user (nil)
RENAMEX key newname
重命名鍵, 不容許新名與已有的鍵名重複
QUIT
退出redis客戶端
EXPIRE key seconds
以秒爲單位,指定鍵值對的生存週期
127.0.0.1:6379> expire user 10000 (integer) 1
PEXIRE key mseconds
以毫秒爲單位,指定鍵值對的生存週期
TTL key
以秒爲單位,返回鍵值對的剩餘生存週期
127.0.0.1:6379> ttl user (integer) 9996
PTTL key
以毫秒爲單位,返回鍵值對的剩餘生存週期
127.0.0.1:6379> pttl user (integer) 9991684
PERSIST key
將鍵值對的生存週期設爲永久
127.0.0.1:6379> persist user (integer) 1
EXPIREAT key timestamp
使用Unix時間戳指定過時時間
Redis哈希命令以Hash表做爲數據結構, Hash表中全部鍵值對共享一樣的TTL,並有着比一般鍵值對更快的操做速度.
HSET table key val
示例:
127.0.0.1:6379> hset hml yichya 233 (integer) 1
執行keys和hkeys命令,能夠看出hash表的數據結構
127.0.0.1:6379> keys * 1) "hml" 2) "user" 127.0.0.1:6379> hkeys hml 1) "yichya"
HDEL table key
刪除鍵
HGET table key
獲得鍵值對
HKEYS tabel
獲得哈希表上全部鍵
HGETALL table
返回全部key和value
127.0.0.1:6379> hgetall hml 1) "yichya" 2) "233"
MULTI
開啓事務塊
127.0.0.1:6379> multi OK
EXEC
提交事務執行
DISCARD
放棄事務
WATCH key [key ...]
WATCH命令在事務執行以前監控Keys.
若在WATCH以後有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk
UNWATCH
放棄全部WATCH
redis-py是經常使用的python-redis鏈接器,使用python包管理器安裝此模塊:
pip install redis
在Python環境下導入redis模塊
>>> from redis import Redis
>>> r = Redis()
Redis是封裝了Redis數據庫操做的類,並提供了相似的API.
除Redis-Hash表以外,redis-py將鍵值都做爲字符串處理
>>> r.set('user', 233) True >>> r.get('user') '233'
對於複雜數據類型,處理返回的字符串很是不便:
>>> r.set('user', [1,[{'name':'yichya'}]]) True >>> r.get('user') "[1, [{'name': 'yichya'}]]" >>> result = r.get('user') >>> list(result) ['[', '1', ',', ' ', '[', '{', "'", 'n', 'a', 'm', 'e', "'", ':', ' ', "'", 'y', 'i', 'c', 'h', 'y', 'a', "'", '}', ']', ']']
能夠選擇使用JSON做爲存儲類型,並以python內置json模塊進行編碼和解碼.
另外,一個redis實例只維護一個數據表而應用中常常出現須要維護多個字典的狀況.
草民建議使用prefix+key做爲redis的鍵來模擬多個數據表.
草民寫了一個簡單的Redis-dict適配器,容許以相似字典的方式操做Redis數據庫:
from redis import Redis import json class RedisDict: def __init__(self, prefix=''): self.data = Redis() self.prefix = prefix def get(self, key): redis_key = self.prefix + '_' + key redis_val = self.data.get(redis_key) if redis_val is None: return None else: return json.loads(redis_val) def set(self, key, val): redis_key = self.prefix + '_' + key redis_val = json.dumps(val) self.data.set(redis_key, redis_val) def pop(self, key): redis_key = self.prefix + '_' + key self.data.delete(redis_key) def __iter__(self): for item in self.data.keys(self.prefix + '*'): prefix, key = decode(item) yield key def decode(redis_key): sep = redis_key.find('_') prefix = redis_key[:sep] key = redis_key[sep+1:] return prefix, key if __name__ == '__main__': r = RedisCache('online') r.set('user', [1,[{'name':'yichya'}]]) for item in r: print(item) print(r.get(item))
redis-py的hash操做與redis命令相似:
from redis import Redis import json class RedisDict: def __init__(self, table): self.session = Redis() self.table = table self.session.delete(table) def get(self, key): redis_val = self.session.hget(self.table, key) if redis_val is None: return None else: return json.loads(redis_val) def set(self, key, val): redis_val = json.dumps(val) self.session.hset(self.table, key, redis_val) def pop(self, key): self.session.hdel(self.table, key) def __iter__(self): for key in self.session.hkeys(self.table): yield key
用hash表模擬dict,這個實現比用前綴區分高效得多.
Redis-Server是一個TCP服務器,使用pipline維護消息隊列能夠提升批量處理的效率.
>>> p = r.pipeline() >>> p.set('yichya', 2333) Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=0>>> >>> p.get('yichya') Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=0>>> >>> p.execute() [True, '2333']
參考連接: