Heim >Datenbank >Redis >Eine kurze Diskussion zur Installation und Verwendung des Redis-Moduls in Python

Eine kurze Diskussion zur Installation und Verwendung des Redis-Moduls in Python

青灯夜游
青灯夜游nach vorne
2021-05-18 11:14:223061Durchsuche

In diesem Artikel erfahren Sie, wie Sie das Redis-Modul in Python installieren und verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein. 🔜 dis-py bietet zwei Klassen Re dis und StrictRedis wird zur Implementierung der meisten offiziellen Befehle und zur Verwendung der offiziellen Syntax und Befehle verwendet. Redis ist eine Unterklasse von StrictRedis und dient der Abwärtskompatibilität mit alten Versionen von redis-py

pip3 install redis

Connection poolEine kurze Diskussion zur Installation und Verwendung des Redis-Moduls in Python

redis -py verwendet den Verbindungspool, um alle Verbindungen zu einem Redis-Server zu verwalten und vermeidet so den Aufwand, jedes Mal Verbindungen herzustellen und freizugeben. Standardmäßig verwaltet jede Redis-Instanz ihren eigenen Verbindungspool. Sie können direkt einen Verbindungspool erstellen und ihn dann als Parameter Redis verwenden, sodass mehrere Redis-Instanzen einen Verbindungspool gemeinsam nutzen können

Verbindungspool: redis_pool.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'))

Verwenden Sie den Verbindungspool: test_redis.py

from redis import ConnectionPool
POOL=ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)
Erstellen Sie eine URL Zum Herstellen einer Verbindung verfügt die Datenbank über die folgenden drei Modi:
import redis
from redis_pool import POOl
conn = redis.Redis(connection_pool=POOl)
conn.set('name', 'LinWOW')
print(conn.get('name'))

Python-Operation Redis

String-Operation

Methode

Funktion

Beispiel

Beispielergebnis

set(name , Wert, ex=Keine, px=Keine, nx=Falsch, xx=Falsch)ex, Ablaufzeit (s); nx, wenn auf True gesetzt, nur wenn der Name nicht existiert , der aktuelle Satz Die Operation wird nur ausgeführt, wenn der Wert vorhanden ist, und die Ausführung hat keine Auswirkung geändert werden, wenn der Wert nicht vorhanden ist, wird kein neuer Wert festgelegt. Der Effekt ist der gleiche wie bei setex und setnx. Set(name, value)

Wert zuweisen nameredis.set('name', 'Bob')

Trueget(name)Gibt den Wert der Zeichenfolge mit dem Schlüsselnamen in der Datenbank zurückredis.get('name') b'Bob'getset(name, value)Weisen Sie die Zeichenfolge mit dem Schlüsselnamen im Datenbankwert zu und geben Sie den letzten Wert zurückredis.getset('name', 'Mike') b'Bob'mget(keys, *args)setnx(name, value)setex(name, time, value)setrange(name, offset, value)mset(mapping)msetnx(mapping)incr(name, amount=1)decr(name, amount=1)append(key, value)substr(name, start, end=-1)getrange(key, start, end)

Tastenbedienung


Gibt den Wert zurück, der mehreren Schlüsseln entspricht redis.mget(['name', 'nickname']) [b'Mike', b' Miker']
Wert nur festlegen, wenn der Schlüssel nicht existiert redis('newname', 'James') True zum ersten Mal, False zum zweiten Mal
Setzen Sie den entsprechenden Wert auf einen String-Typ-Wert und geben Sie diesen an. Die Gültigkeitsdauer, die dem Schlüsselwert entspricht redis.setex('name', 1, 'James' ) True
Legen Sie die Teilzeichenfolge des Werts des angegebenen Schlüssels fest redis.set('name', 'Hello') redis.setrange('name', 6, 'Welt') 11, geänderte Zeichenfolgenlänge
Batch-Zuweisung redis.mset({'name1': 'Durant', 'name2': 'James'}) True
Batch-Zuweisung nur, wenn keiner der Schlüssel vorhanden ist redis.msetnx({ 'name3': 'Smith', 'name4': 'Curry'}) True
key ist die Mehrwertoperation von name. Der Standardwert ist 1. Wenn der Schlüssel nicht vorhanden ist, wird er erstellt und auf amount redis.incr(' gesetzt. Alter', 1) 1, das ist der geänderte Wert
key ist die Wertabwertungsoperation von name, Standard 1. Wenn der Schlüssel nicht vorhanden ist, wird er erstellt und auf -amount redis.decr('age', 1) -1 gesetzt, was der geänderte Wert ist
key is name Der Zeichenfolgenwert wird mit value angehängt redis.append('nickname', 'OK') 13, was die geänderte Zeichenfolgenlänge ist
return key Es ist die Teilzeichenfolge des Werts von die Zeichenfolge des Namens redis.substr('name', 1, 4) b'ello'
Erhalten Sie den Wert des Schlüssels vom Anfang der Teilzeichenfolge bis zum Ende redis.getrange('name', 1, 4) b'ello'
delete(name)type(name)keys(pattern)randomkey() dbsize()Ermitteln Sie die Anzahl der Schlüssel in der aktuellen Datenbank.dbsize()100expire(name, time)Legen Sie die Ablaufzeit des Schlüssels in Sekunden fest.redis. expire( 'name', 2)Truettl(name)Ermitteln Sie die Ablaufzeit des Schlüssels in Sekunden. -1 bedeutet, dass er niemals abläuftredis.ttl('name')-1move(name, db)Schlüssel in andere Datenbanken verschiebenmove('name', 2)Trueflushdb()Alle Schlüssel in der aktuell ausgewählten Datenbank löschen flushdb( )Trueflushall()Alle Schlüssel in allen Datenbanken löschenflushall()TrueListenoperation Methode FunktionBeispielBeispielergebnis
Methode Funktion Beispiel Beispielergebnis
exists(name) Beurteilen, ob ein Schlüssel vorhanden ist dis.exists('name' ) True
Einen Schlüssel löschen redis.delete('name') 1
Bestimmen Sie den Schlüsseltyp redis.type('name' ) b'string'
Alle Schlüssel abrufen, die den Regeln entsprechen redis.keys('n*') [b'name']
Holen Sie sich einen zufälligen Schlüssel

rpush(name, *values)

Fügen Sie ein Element mit Wert als Wert am Ende der Liste mit Schlüsselnamen hinzu. Sie können mehrere redis.rpush('list übergeben ', 1, 2, 3)3, Listengrößelpush(name, *values)Fügen Sie ein Element mit Wert als Listenkopf hinzu, dessen Schlüssel name ist. Sie können mehrere redis.lpush übergeben ('list', 0 )4 ltrim(name, start, end)lindex(name, index)lset (Name, Index, Wert)lrem(name, count, value)lpop(name)rpop (Name) Geben Sie das erste Element in der Liste mit dem Namen „keys“ zurück und löschen Sie es. Wenn die Liste leer ist, wird sie immer blockiert und gewartet , timeout=0)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操作

Gibt die Elemente zwischen Anfang und Ende in der Liste mit dem Schlüsselnamen zurück redis.lrange('list', 1, 3) [b'3', b'2' , b'1']
Fangen Sie die Liste ab, deren Schlüssel der Name ist, und behalten Sie den Inhalt von Anfang bis Ende mit Index bei ltrim('list', 1, 3) True
Gibt das Element an der Indexposition in der Liste mit dem Schlüsselnamen zurück redis.lindex('list', 1) b'2'
gibt den Schlüssel an als Dem Element an der Indexposition in der Namensliste wird ein Wert zugewiesen. Wenn es den Grenzwert überschreitet, wird ein Fehler gemeldet redis.lset('list', 1 , 5) True
Löschen Sie die Liste der Zählschlüssel. Das Element, dessen Medianwert value ist redis.lrem('list', 2, 3) 1 , also die Anzahl der gelöschten Elemente
Gibt das erste Element in der Liste mit dem Schlüsselnamen Element redis.lpop('list') b'5' zurück und löscht es
Das letzte Element in der Liste mit dem Schlüsselnamen zurückgeben und löschen. Wenn die Liste leer ist, wird sie immer blockiert und gewartet redis.brpop('list') [b'2']
Gib das Endelement der Liste mit dem Namen src zurück und lösche es und füge das Element zur Liste mit dem Namen dst hinzu. Der Kopf der Liste 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-Operation

[b'Bob', b 'Mike', b'Amy', b'James']231, also die Anzahl der gelöschten Elemente1, d Beispielergebnishset(name, key, value)Mapping zum Hash hinzufügen, dessen Schlüssel name isthset( 'price', 'cake', 5)1, also die Anzahl der hinzugefügten Mappings hsetnx(name, key, value)Mapping zum Hash mit Schlüsselnamen hinzufügen, wenn der Mapping-Schlüsselname nicht existiert hsetnx('price', 'book', 6)1, that ist die Anzahl der hinzugefügten Zuordnungen redis.hmget('price' , ['apple', 'orange'])
Methode Funktion Beispiel Beispielergebnis
zadd(name, args, *kwargs) Elemente hinzufügen zset mit Schlüsselname Mitglied, Punktzahl ist zum Sortieren verwendet. Wenn das Element vorhanden ist, aktualisieren Sie seine Reihenfolge redis.zadd('grade', 100, 'Bob', 98, 'Mike') 2, was die Anzahl der hinzugefügten Elemente ist
zrem(name, * Werte) Löschen Sie die Elemente im Zset, deren Schlüssel Name ist redis.zrem('grade', 'Mike') 1, also die Anzahl der gelöschten Elemente
zincrby(name, value, Betrag = 1 ) Wenn der Elementwert bereits im Zset mit dem Schlüsselnamen vorhanden ist, wird die Bewertung des Elements um den Betrag erhöht, andernfalls wird das Element zum Satz hinzugefügt und der Wert seiner Bewertung ist Betrag redis. Zincrby('grade', ' Bob', -2) 98.0, das ist der geänderte Wert
zrank(name, value) Gibt die Rangfolge der Elemente im Zset zurück, deren Schlüssel Name ist (sortiert nach). Bewertung von klein nach groß), d zset mit Schlüsselnamen (sortiert von groß nach klein nach Punktzahl), d Falsch) Gibt das Zset mit Schlüsselnamen zurück (sortiert nach Punktzahl von groß nach klein) Alle Elemente mit Index von Anfang bis Ende redis.zrevrange('grade', 0, 3)
zrangebyscore(name, min, max, start=None, num=None, withscores=False) Gibt die Elemente im Zset mit dem Schlüsselnamen zurück, deren Die Punktzahl liegt im angegebenen Intervall der Punktzahlen im angegebenen Intervall im Zset mit dem Schlüsselnamen redis.zcount('grade ', 80, 95)
zcard(name) Gibt die Anzahl der Elemente des Zsets zurück, deren Schlüssel ist name redis.zcard('grade')
zremrangebyrank(name, min, max) Löschen Sie die im angegebenen Intervall im Zset eingestuften Elemente mit dem Schlüssel name redis.zremrangebyrank('grade ', 0, 0)
zremrangebyscore( name, min, max) Löschen Sie die Elemente, deren Punktzahl im angegebenen Bereich im Zset liegt, mit Schlüsselname redis.zremrangebyscore('grade', 80, 90)
hmget(Name, Schlüssel, *Argumente) Gibt den Wert zurück, der jedem Schlüssel im Hash mit dem Schlüsselnamen entspricht
[ b'3', b'7']

hmset(name, Mapping)Fügen Sie Mappings stapelweise zum Hash mit dem Schlüsselnamen hinzuErhöhen Sie den im Hash abgebildeten Wert mit dem Schlüsselnamen amountredis.hincrby('price', 'apple', 3)redis.hexists('price', 'banana') gibt redis.hdel('price', 'banana')redis.hlen('price')redis.hkeys('price')redis.hvals('price')redis.hgetall('price')
redis. Birne': 6}) True hincrby(name, key, amount=1)
6, der geänderte Wert hexists(name, key) key gibt an, ob es eine Zuordnung mit dem Schlüssel namens key in namehash
True hdel(name, *keys) key ist die Zuordnung zum Löschen des Schlüssels mit dem Namen key in namehash
True hlen( name) Erhalten Sie die Anzahl der Zuordnungen aus dem Hash mit dem Schlüsselnamen
6 hkeys(name) Erhalten Sie alle Zuordnungsschlüsselnamen aus dem Hash mit dem Schlüsselnamen
[b'cake', b'book', b'banana', b'pear'] hvals(name) Alle Zuordnungsschlüsselwerte abrufen ​aus dem Hash mit dem Schlüsselnamen
[b'5', b'6', b'2', b'6' ] hgetall(name) Holen Sie sich alle zugeordneten Schlüssel-Wert-Paare aus dem Hash mit dem Schlüsselnamen
{b'cake': b'5', b'book ': b'6', b'orange' : b'7', b'pear': b'6'}

注意点:

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'))

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

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zur Installation und Verwendung des Redis-Moduls in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen