Redis 簡介
Redis是開源的高性能Key-Value數據庫,可以用於緩存等用途.
Redis可以提供事務和持久化支持保證並發安全性,並提供TTL(time to life)服務.
使用Redis
Ubuntu系統可以用包管理器安裝Redis服務:
sudo apt-get install redis-server
並安裝客戶端:
sudo apt-get install redis-tools
進入Redis客戶端
redis-cli
登錄遠程Redis服務
redis-cli -h host -p port -a password
Redis基本操作指令
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客戶端
Redis TTL服務命令
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哈希命令
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"
Redis事務支持
MULTI
開啟事務塊
127.0.0.1:6379> multi
OK
EXEC
提交事務執行
DISCARD
放棄事務
WATCH key [key ...]
WATCH命令在事務執行之前監控Keys.
若在WATCH之后有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk
UNWATCH
放棄所有WATCH
Python使用Redis數據庫
redis-py是常用的python-redis連接器,使用python包管理器安裝此模塊:
pip install redis
在Python環境下導入redis模塊
>>> from redis import Redis
>>> r = Redis()
Redis是封裝了Redis數據庫操作的類,並提供了類似的API.
使用JSON存儲
除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))
hash表操作
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,這個實現比用前綴區分高效得多.
pipeline操作
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']
參考鏈接: