ホームページ  >  記事  >  データベース  >  Python で redis モジュールをインストールして使用する方法についての簡単な説明

Python で redis モジュールをインストールして使用する方法についての簡単な説明

青灯夜游
青灯夜游転載
2021-05-18 11:14:222991ブラウズ

この記事では、Python で redis モジュールをインストールして使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Python で redis モジュールをインストールして使用する方法についての簡単な説明

[関連する推奨事項:

Redis ビデオ チュートリアル]

インストールと使用

インストール

redis モジュールのインストール

pip3 install redis

通常の接続

redis-py は、Redis コマンドの実装に Redis と StrictRedis の 2 つのクラスを提供します。 StrictRedis は、ほとんどの公式コマンドを実装し、公式構文とコマンドを使用するために使用されます。Redis は StrictRedis のサブクラスであり、古いバージョンの redis-py

import redis
conn = redis.Redis(host='127.0.0.1', port=6379)
# 可以使用url方式连接到数据库
# conn = Redis.from_url('redis://@localhost:6379/1')
conn.set('name', 'LinWOW')
print(conn.get('name'))

Connection Pool

redis との下位互換性のために使用されます。 -py は、接続プールを使用して Redis サーバーへのすべての接続を管理し、毎回の接続の確立と解放のオーバーヘッドを回避します。デフォルトでは、各 Redis インスタンスは独自の接続プールを維持します。接続プールを直接作成し、それをパラメータ Redis として使用すると、複数の Redis インスタンスが接続プールを共有できるようになります。

接続プール: redis_pool.py

from redis import ConnectionPool
POOL=ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)

接続プール: test_redis を使用します。 py

import redis
from redis_pool import POOl
conn = redis.Redis(connection_pool=POOl)
conn.set('name', 'LinWOW')
print(conn.get('name'))

データベースに接続するための URL メソッドを構築します。次の 3 つのモードがあります:

redis://[:password]@host:port/db    # TCP连接
rediss://[:password]@host:port/db   # Redis TCP+SSL 连接
unix://[:password]@/path/to/socket.sock?db=db    # Redis Unix Socket 连接

Python 操作 Redis

文字列操作

メソッド関数例結果の例set(名前, 値, ex=None, px=None, nx=False, xx=False)ex, 有効期限 (秒); px, 有効期限時間 (ミリ秒); nx、True に設定すると、現在の設定操作は名前が存在しない場合にのみ実行されます。値が存在する場合は変更できず、実行は効果がありません。xx、True に設定すると、現在の設定操作は、名前が存在する場合にのみ実行されます。値は、値が存在する場合にのみ変更できます。値が存在しない場合、新しい値は設定されません。効果は次と同じです。 setex と setnxset(name , value)値を name に割り当てますredis.set( 'name', 'Bob')Trueget(name)データベース内の name をキーとする文字列の値を返しますredis.get('name')b'Bob'getset(name, value)値の割り当てデータベース内の name をキーとする文字列に代入し、最後の値を返します##mget(keys, *args)複数のキーに対応する値を返しますredis.mget(['name', 'nickname']) [b'Mike', b'Miker']setnx(name, value )キーが存在しない場合は値を設定します redis.setnx('newname', 'James')初回は True、2 回目は Falsesetex(name, time, value)対応する値を文字列型の値に設定し、このキーの値に対応する有効期間を指定します指定されたキーを設定します value の部分文字列バッチ割り当てキーが存在しない場合のみバッチ割り当てkey は name の付加価値演算です。デフォルトは 1 です。存在しない場合は、作成され、 amountkey は name の値のデクリメント操作です。デフォルトは 1 です。キーが存在しない場合は、キーが作成され、-amount# に設定されます。 ##redis.decr('age', 1)-1、これは変更された値ですappend(key, value)key は、nameredis.append('nickname', 'OK')13 の文字列値に value を追加します。これは、変更された文字列の長さです substr(name, start, end=-1)キーが name である文字列の値の部分文字列を返しますredis.substr('name' , 1, 4)b'ello'getrange(key, start, end)先頭から末尾までのキーの値を取得します。 redis.getrange('name', 1, 4)b'ello' の

キー操作


#redis.getset('name', 'Mike') b'Bob'
#redis .setex('name', 1, 'James') True setrange(name, offset, value)
redis.set('name' , 'Hello') redis.setrange('name', 6, 'World') 11, 変更された文字列長 mset(mapping)
redis.mset({'name1': 'Durant', 'name2': ' James'}) True ##msetnx(マッピング)
redis.msetnx ({'name3': 'Smith', 'name4': 'Curry'}) True incr(name, amount=1)
redis.incr('age', 1) 1 (つまり、変更後) に設定されます。 の値 decr(name, amount=1)
#exists(name)キーが存在するかどうかを確認するdelete(name)#type(name)キーの種類を判定redis.type('name')b'string'keys(pattern)ルールに一致するすべてのキーを取得redis.keys('n*')[ b' name']randomkey()ランダムキーを取得しますrandomkey()b'name'rename(src, dst)キーの名前を変更しますredis.rename('name', 'nickname') Truedbsize()現在のデータベース内のキーの数を取得しますdbsize()100expire(name, time)キーの有効期限を秒単位で設定しますredis.expire('name', 2) Truettl(name)キーの有効期限を秒単位で取得します。-1 は期限切れにならないことを意味しますredis。 ttl('name ')-1キーを他のデータベースに移動現在選択されているデータベース内のすべてのキーを削除しますすべてのデータベースのすべてのキーを削除します#リスト操作
メソッド 関数 結果の例
##redis.exists('name') True
キーを削除します redis.delete('name') 1
#move(name, db)
move( 'name ', 2) True flushdb()
flushdb( ) True flushall()
flushall() True

##メソッド

関数例リストの最後に次のように追加します。キー名 値が value である要素の場合、複数の redis.rpush('list', 1, 2, 3) ##lpush(name, *values)キー名を持つリスト ヘッダーに値として value を持つ要素を追加します。複数の redis.lpush('list' を渡すことができます) , 0)4, リスト サイズllen(name)キー名を持つリストの長さを返します redis.llen(' list')4[b'3', b'2', b'1']Trueb'2'#redis.lset('list', 1, 5)Truelrem(name, count, value)count キーのリスト内の値が value である要素を削除しますredis.lrem ('list', 2, 3)1、つまり削除された要素 Numberlpop(name)戻り、削除します。キー名を持つリストの最初の要素redis.lpop('list')b'5'rpop(name)キー名を持つリストの最後の要素を返し、削除します。redis .rpop('list')b'2'blpop(keys, timeout=0)keys 内の名前を返して削除します。リストの最初の要素。リストが空の場合、常にブロックして待機します。redis。 blpop('list')[b'5']brpop(keys, timeout=0)戻り、最後の要素を削除しますキーが name のリストにあります。リストが空の場合は、常にブロックして待機します#[b'2']#rpoplpush(src, dst)

应用场景:

blpop实现简单分布式爬虫:

多个url放到列表里,往里不停放URL,程序循环取值,但是只能一台机器运行取值,可以把url放到redis中,多台机器从redis中取值,爬取数据,实现简单分布式

将多个列表排列,按照从左到右去pop对应列表的元素
参数:
   keys,redis的name的集合
   timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞
更多:
   r.brpop(keys, timeout),从右向左获取数据

自定义增量迭代:

由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:

    1、获取name对应的所有列表

    2、循环列表

但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:

import redis
conn=redis.Redis(host='127.0.0.1',port=6379)
# conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
# conn.flushall()
def scan_list(name,count=2):
    index=0
    while True:
        data_list=conn.lrange(name,index,count+index-1)
        if not data_list:
            return
        index+=count
        for item in data_list:
            yield item
print(conn.lrange('test',0,100))
for item in scan_list('test',5):
    print('---')
    print(item)

Set操作

結果の例 rpush(name, *values)
3, list size # を渡すことができます。
##lrange(name, start, end) リストの開始と終了の間の要素を返しますキーの名前は redis.lrange('list', 1, 3)
ltrim(name, start, end) キーが name であるリストをインターセプトし、先頭から末尾までインデックス付きのコンテンツを保持します ltrim('list', 1 , 3)
lindex(name,index) キー名を持つリストのインデックス位置の要素を返します redis.lindex(' list', 1)
lset(名前, インデックス, 値) キー名を持つリスト内のインデックス位置要素に値が割り当てられている場合、境界を越えるとエラーが報告されます。
#redis .brpop('list')
src という名前のファイルを返し、リストの末尾要素を削除し、その要素を dst という名前のリストの先頭に追加します redis.rpoplpush('list', 'list2') b'2'
方法 作用 示例 示例结果
sadd(name, *values) 向key为name的set中添加元素 redis.sadd(‘tags’, ‘Book’, ‘Tea’, ‘Coffee’) 3,即插入的数据个数
srem(name, *values) 从key为name的set中删除元素 redis.srem(‘tags’, ‘Book’) 1,即删除的数据个数
spop(name) 随机返回并删除key为name的set中一个元素 redis.spop(‘tags’) b’Tea’
smove(src, dst, value) 从src对应的set中移除元素并添加到dst对应的set中 redis.smove(‘tags’, ‘tags2’, ‘Coffee’) True
scard(name) 返回key为name的set的元素个数 redis.scard(‘tags’) 3
sismember(name, value) 测试member是否是key为name的set的元素 redis.sismember(‘tags’, ‘Book’) True
sinter(keys, *args) 返回所有给定key的set的交集 redis.sinter([‘tags’, ‘tags2’]) {b’Coffee’}
sinterstore(dest, keys, *args) 求交集并将交集保存到dest的集合 redis.sinterstore(‘inttag’, [‘tags’, ‘tags2’]) 1
sunion(keys, *args) 返回所有给定key的set的并集 redis.sunion([‘tags’, ‘tags2’]) {b’Coffee’, b’Book’, b’Pen’}
sunionstore(dest, keys, *args) 求并集并将并集保存到dest的集合 redis.sunionstore(‘inttag’, [‘tags’, ‘tags2’]) 3
sdiff(keys, *args) 返回所有给定key的set的差集 redis.sdiff([‘tags’, ‘tags2’]) {b’Book’, b’Pen’}
sdiffstore(dest, keys, *args) 求差集并将差集保存到dest的集合 redis.sdiffstore(‘inttag’, [‘tags’, ‘tags2’]) 3
smembers(name) 返回key为name的set的所有元素 redis.smembers(‘tags’) {b’Pen’, b’Book’, b’Coffee’}
srandmember(name) 随机返回key为name的set的一个元素,但不删除元素 redis.srandmember(‘tags’)

Sorted Set 操作

#redis.zadd('grade', 100, 'Bob', 98, 'Mike')2 (追加された要素の数) を更新します#zrem(name, *values)zincrby(name, value, amount=1)zrank(name, value)#zrevrank(name, value )キー名を持つ zset 内の要素の逆順位 (スコアによって大きいものから小さいものにソート) を返します。 subscript redis.zrevrank('grade', 'Amy')2zrevrange(name, start, end, withscores=False) キーが name である zset を返します (スコアの大きいものから小さいものまでソート) 最初から最後までのインデックスを持つすべての要素redis.zrevrange('grade', 0, 3)[b'ボブ', b'マイク', b'エイミー', b'ジェームス']zrangebyscore(name, min, max, start=None, num =None、withscores=False)キー名を持つ zset に戻ります指定された間隔で要素をスコアリングしますredis.zrangebyscore('grade', 80, 95) [b'Amy', b'James']zcount(name, min, max)zset 内の指定された間隔内のスコアの数を返します。キーは nameredis.zcount('grade', 80, 95) 2zcard(name)キーが nameredis.zcard('grade')3zremrangebyrank(name, min である zset の要素の数を返します。 、max)キー名 redis.zremrangebyrank('grade', 0, 0)1 を持つ zset 内の指定された間隔でランク付けされた要素を削除します。は削除された要素の数です。zremrangebyscore(name, min, max)キー名を持つ zset 内の指定された間隔内にスコアがある要素を削除しますredis.zremrangebyscore('grade', 80, 90)1、つまり要素の数を削除しますハッシュ操作
メソッド 関数 結果の例
zadd(name, args, *kwargs) キーが name である要素メンバーを zset に追加し、スコアはソートに使用されます。要素が存在する場合は、その順序
キーが name である zset 内の要素を削除します redis.zrem('grade', 'Mike ' ) 1、つまり削除された要素の数
If in the zsetキーは name です要素の値がコレクションに既に存在する場合、要素のスコアは amount だけ増加します。それ以外の場合、要素はコレクションに追加され、そのスコア値は amount redis.zincrby(' Grade', 'Bob', -2) 98.0、つまり変更された値
キーが名前である zset 内の要素のランキング (スコアによる小さいものから大きいものへの並べ替え)、つまり添え字 redis.zrank('grade', 'Amy') 1

メソッド関数 例結果の例hset(name, key, value)キーは、名前のハッシュにマッピングを追加します。hset('price', 'cake', 5)1 (追加されたマッピングの数) hsetnx(name, key, value)キーを使用してハッシュにマッピングを追加しますname (マッピング キー名が存在しない場合)hsetnx('price', 'book', 6)1、つまり追加されたマッピングの数キーが name であるハッシュ内のフィールドに対応する値を返しますredis.hget('price', 'cake')5Return キーは、name のハッシュ内の各キーに対応する値です。 キー名を持つハッシュにマッピングをバッチで追加します#Trueredis.hincrby('price', 'apple', 3)#6 を変更後​​の値にTrueTrue6[b'ケーキ', b'本', b'バナナ', b'洋梨'][b '5', b'6', b' 2', b'6']{b'ケーキ': b'5'、b'本': b'6'、b'オレンジ': b'7'、b'洋ナシ': b' 6'}
##hget(name, key)
##hmget(name, key, *args)
redis.hmget('価格', ['リンゴ', 'オレンジ']) [b'3', b'7 '] hmset(名前, マッピング)
redis.hmset('price', {'banana': 2, 'pear': 6}) hincrby(name, key, amount=1) will キーは、名前のハッシュにマッピングされた値です。金額を追加します
##hexists(name, key) key は、namehash に key という名前のキーとのマッピングがあるかどうかです。 redis.hexists('price', 'banana')
hdel(name, *keys) key は、namehash の key という名前のキーを削除するマッピングです。 redis.hdel( 'price', 'banana')
hlen(name) キー名のハッシュからマッピングの数を取得します redis.hlen('price ')
hkeys(name) キー名マッピングキー名を持つすべてのハッシュを取得 redis.hkeys ('価格')
hvals(名前) キー名のハッシュからすべてのマッピング キー値を取得 redis.hvals('price')
hgetall(name) キー名マッピングのキーと値のペア redis を持つすべてのハッシュを取得します。 hgetall('価格')

注意点:

hscan(name, cursor=0, match=None, count=None):增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆

参数:
    name,redis的name
    cursor,游标(基于游标分批取获取数据)
    match,匹配指定key,默认None 表示所有的key
    count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
如:
    第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
    第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
    ...
    直到返回值cursor的值为0时,表示数据已经通过分片获取完毕

hscan_iter(name, match=None, count=None): 利用yield封装hscan创建生成器,实现分批去redis中获取数据

参数:
    match,匹配指定key,默认None 表示所有的key
    count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
如:    for item in r.hscan_iter('xx'):
        print item

管道

redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

import redis
pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set('name', 'linwow')
pipe.set('age', '18')
pipe.execute()

Django中使用redis

方式一:

utils文件夹下,建立redis_pool.py

import redis
POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)

视图函数中使用:

import redis
from django.shortcuts import render,HttpResponse
from redis_pool import POOL

def index(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.hset('liwow','age',18)
    return HttpResponse('设置成功')
    
def order(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.hget('kkk','age')
    return HttpResponse('获取成功')

方式二:

安装django-redis模块

pip3 install django-redis

setting里配置:

# redis配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}

视图函数:

from django_redis import get_redis_connection
conn = get_redis_connection('default')
print(conn.hgetall('xxx'))

更多编程相关知识,请访问:编程教学!!

以上がPython で redis モジュールをインストールして使用する方法についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。