Python使用Redis數據庫

Redis 簡介

Redis是開源的高性能Key-Value數據庫,能夠用於緩存等用途.python

Redis能夠提供事務和持久化支持保證併發安全性,並提供TTL(time to life)服務.redis

使用Redis

Ubuntu系統能夠用包管理器安裝Redis服務:數據庫

sudo apt-get install redis-serverjson

並安裝客戶端:緩存

sudo apt-get install redis-tools安全

進入Redis客戶端服務器

redis-clisession

登陸遠程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']

參考連接:

Redis官網

redis-py

Redis 教程

使用Python操做Redis

相關文章
相關標籤/搜索