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

青灯夜游
Freigeben: 2021-08-02 10:09:21
nach vorne
3064 Leute haben es durchsucht

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
Nach dem Login kopieren

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'))
Nach dem Login kopieren

Verwenden Sie den Verbindungspool: test_redis.py

from redis import ConnectionPool
POOL=ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)
Nach dem Login kopieren
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'))
Nach dem Login kopieren

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 existiertredis('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 entsprichtredis.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 istredis.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 amountredis.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 -amountredis.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 Namensredis.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
MethodeFunktionBeispielBeispielergebnis
exists(name)Beurteilen, ob ein Schlüssel vorhanden ist dis.exists('name' ) True
Einen Schlüssel löschenredis.delete('name')1
Bestimmen Sie den Schlüsseltypredis.type('name' ) b'string'
Alle Schlüssel abrufen, die den Regeln entsprechenredis.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)
Nach dem Login kopieren

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ückredis.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 gemeldetredis.lset('list', 1 , 5)True
Löschen Sie die Liste der Zählschlüssel. Das Element, dessen Medianwert value istredis.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 Listeredis.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'])
MethodeFunktionBeispielBeispielergebnis
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 Reihenfolgeredis.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 istredis.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 Betragredis. 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 Enderedis.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 nameredis.zcard('grade')
zremrangebyrank(name, min, max)Löschen Sie die im angegebenen Intervall im Zset eingestuften Elemente mit dem Schlüssel nameredis.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})Truehincrby(name, key, amount=1)
6, der geänderte Werthexists(name, key)key gibt an, ob es eine Zuordnung mit dem Schlüssel namens key in namehash
Truehdel(name, *keys)key ist die Zuordnung zum Löschen des Schlüssels mit dem Namen key in namehash
Truehlen( name)Erhalten Sie die Anzahl der Zuordnungen aus dem Hash mit dem Schlüsselnamen
6hkeys(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时,表示数据已经通过分片获取完毕
Nach dem Login kopieren

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
Nach dem Login kopieren

管道

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()
Nach dem Login kopieren

Django中使用redis

方式一:

utils文件夹下,建立redis_pool.py

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

视图函数中使用:

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('获取成功')
Nach dem Login kopieren

方式二:

安装django-redis模块

pip3 install django-redis
Nach dem Login kopieren

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",
        }
    }
}
Nach dem Login kopieren

视图函数:

from django_redis import get_redis_connection
conn = get_redis_connection('default')
print(conn.hgetall('xxx'))
Nach dem Login kopieren

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

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!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage