Maison > base de données > Redis > le corps du texte

Une brève discussion sur la façon d'installer et d'utiliser le module redis en Python

青灯夜游
Libérer: 2021-08-02 10:09:21
avant
2993 Les gens l'ont consulté

Cet article vous présentera comment installer et utiliser le module redis en Python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Une brève discussion sur la façon d'installer et d'utiliser le module redis en Python

[Recommandations associées : Tutoriel vidéo Redis]

Installation et utilisation

Installer

Installer le module redis

pip3 install redis
Copier après la connexion

Connexion normale

redis-py fournit deux classes Redis et StrictRedis pour l'implémentation des commandes Redis , StrictRedis est utilisé pour implémenter la plupart des commandes officielles et utiliser la syntaxe et les commandes officielles. Redis est une sous-classe de StrictRedis et est utilisé pour la compatibilité descendante avec les anciennes versions de 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'))
Copier après la connexion

Connection Pool

. redis-py utilise le pool de connexions pour gérer toutes les connexions à un serveur Redis, évitant ainsi la surcharge liée à l'établissement et à la libération des connexions à chaque fois. Par défaut, chaque instance Redis gère son propre pool de connexions. Vous pouvez directement créer un pool de connexions puis l'utiliser comme paramètre Redis, afin que plusieurs instances Redis puissent partager un pool de connexions

Pool de connexions : redis_pool.py

from redis import ConnectionPool
POOL=ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)
Copier après la connexion

Utiliser le pool de connexions : test_redis. py

import redis
from redis_pool import POOl
conn = redis.Redis(connection_pool=POOl)
conn.set('name', 'LinWOW')
print(conn.get('name'))
Copier après la connexion

construit une URL pour se connecter à la base de données. Il existe trois modes :

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 连接
Copier après la connexion

Opération Python Redis

Opération de chaîne

方法作用示例示例结果
set(name, value, ex=None, px=None, nx=False, xx=False)ex,过期时间(s);px,过期时间(ms);nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果;xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值效果和setex,setnx一致
set(name, value)给name赋值为valueredis.set(‘name’, ‘Bob’)True
get(name)返回数据库中key为name的string的valueredis.get(‘name’)b’Bob’
getset(name, value)给数据库中key为name的string赋予值value并返回上次的valueredis.getset(‘name’, ‘Mike’)b’Bob’
mget(keys, *args)返回多个key对应的valueredis.mget([‘name’, ‘nickname’])[b’Mike’, b’Miker’]
setnx(name, value)如果key不存在才设置valueredis.setnx(‘newname’, ‘James’)第一次运行True,第二次False
setex(name, time, value)设置可以对应的值为string类型的value,并指定此键值对应的有效期redis.setex(‘name’, 1, ‘James’)True
setrange(name, offset, value)设置指定key的value值的子字符串redis.set(‘name’, ‘Hello’) redis.setrange(‘name’, 6, ‘World’)11,修改后的字符串长度
mset(mapping)批量赋值redis.mset({‘name1’: ‘Durant’, ‘name2’: ‘James’})True
msetnx(mapping)key均不存在时才批量赋值redis.msetnx({‘name3’: ‘Smith’, ‘name4’: ‘Curry’})True
incr(name, amount=1)key为name的value增值操作,默认1,key不存在则被创建并设为amountredis.incr(‘age’, 1)1,即修改后的值
decr(name, amount=1)key为name的value减值操作,默认1,key不存在则被创建并设置为-amountredis.decr(‘age’, 1)-1,即修改后的值
append(key, value)key为name的string的值附加valueredis.append(‘nickname’, ‘OK’)13,即修改后的字符串长度
substr(name, start, end=-1)返回key为name的string的value的子串redis.substr(‘name’, 1, 4)b’ello’
getrange(key, start, end)获取key的value值从start到end的子字符串redis.getrange(‘name’, 1, 4)b’ello’
<🎜>Opération de chaîne<🎜>
import redis
conn=redis.Redis(host=&#39;127.0.0.1&#39;,port=6379)
# conn.lpush(&#39;test&#39;,*[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(&#39;test&#39;,0,100))
for item in scan_list(&#39;test&#39;,5):
    print(&#39;---&#39;)
    print(item)
Copier après la connexion
Copier après la connexion
<🎜> construit une URL pour se connecter à la base de données. 🎜> <🎜><🎜>

Opération clé

方法作用示例示例结果
exists(name)判断一个key是否存在redis.exists(‘name’)True
delete(name)删除一个keyredis.delete(‘name’)1
type(name)判断key类型redis.type(‘name’)b’string’
keys(pattern)获取所有符合规则的keyredis.keys(‘n*’)[b’name’]
randomkey()获取随机的一个keyrandomkey()b’name’
rename(src, dst)将key重命名redis.rename(‘name’, ‘nickname’)True
dbsize()获取当前数据库中key的数目dbsize()100
expire(name, time)设定key的过期时间,单位秒redis.expire(‘name’, 2)True
ttl(name)获取key的过期时间,单位秒,-1为永久不过期redis.ttl(‘name’)-1
move(name, db)将key移动到其他数据库move(‘name’, 2)True
flushdb()删除当前选择数据库中的所有keyflushdb()True
flushall()删除所有数据库中的所有keyflushall()True

Opération liste

方法作用示例示例结果
rpush(name, *values)在key为name的list尾添加值为value的元素,可以传多个redis.rpush(‘list’, 1, 2, 3)3,list大小
lpush(name, *values)在key为name的list头添加值为value的元素,可以传多个redis.lpush(‘list’, 0)4,list大小
llen(name)返回key为name的list的长度redis.llen(‘list’)4
lrange(name, start, end)返回key为name的list中start至end之间的元素redis.lrange(‘list’, 1, 3)[b’3’, b’2’, b’1’]
ltrim(name, start, end)截取key为name的list,保留索引为start到end的内容ltrim(‘list’, 1, 3)True
lindex(name, index)返回key为name的list中index位置的元素redis.lindex(‘list’, 1)b’2’
lset(name, index, value)给key为name的list中index位置的元素赋值,越界则报错redis.lset(‘list’, 1, 5)True
lrem(name, count, value)删除count个key的list中值为value的元素redis.lrem(‘list’, 2, 3)1,即删除的个数
lpop(name)返回并删除key为name的list中的首元素redis.lpop(‘list’)b’5’
rpop(name)返回并删除key为name的list中的尾元素redis.rpop(‘list’)b’2’
blpop(keys, timeout=0)返回并删除名称为在keys中的list中的首元素,如果list为空,则会一直阻塞等待redis.blpop(‘list’)[b’5’]
brpop(keys, timeout=0)返回并删除key为name的list中的尾元素,如果list为空,则会一直阻塞等待redis.brpop(‘list’)[b’2’]
rpoplpush(src, dst)返回并删除名称为src的list的尾元素,并将该元素添加到名称为dst的list的头部redis.rpoplpush(‘list’, ‘list2’)b’2’

应用场景:

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=&#39;127.0.0.1&#39;,port=6379)
# conn.lpush(&#39;test&#39;,*[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(&#39;test&#39;,0,100))
for item in scan_list(&#39;test&#39;,5):
    print(&#39;---&#39;)
    print(item)
Copier après la connexion
Copier après la connexion

Set操作

方法作用示例示例结果
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’)

Opération d'ensemble trié

方法作用示例示例结果
zadd(name, args, *kwargs)向key为name的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序redis.zadd(‘grade’, 100, ‘Bob’, 98, ‘Mike’)2,即添加的元素个数
zrem(name, *values)删除key为name的zset中的元素redis.zrem(‘grade’, ‘Mike’)1,即删除的元素个数
zincrby(name, value, amount=1)如果在key为name的zset中已经存在元素value,则该元素的score增加amount,否则向该集合中添加该元素,其score的值为amountredis.zincrby(‘grade’, ‘Bob’, -2)98.0,即修改后的值
zrank(name, value)返回key为name的zset中元素的排名(按score从小到大排序)即下标redis.zrank(‘grade’, ‘Amy’)1
zrevrank(name, value)返回key为name的zset中元素的倒数排名(按score从大到小排序)即下标redis.zrevrank(‘grade’, ‘Amy’)2
zrevrange(name, start, end, withscores=False)返回key为name的zset(按score从大到小排序)中的index从start到end的所有元素redis.zrevrange(‘grade’, 0, 3)[b’Bob’, b’Mike’, b’Amy’, b’James’]
zrangebyscore(name, min, max, start=None, num=None, withscores=False)返回key为name的zset中score在给定区间的元素redis.zrangebyscore(‘grade’, 80, 95)[b’Amy’, b’James’]
zcount(name, min, max)返回key为name的zset中score在给定区间的数量redis.zcount(‘grade’, 80, 95)2
zcard(name)返回key为name的zset的元素个数redis.zcard(‘grade’)3
zremrangebyrank(name, min, max)删除key为name的zset中排名在给定区间的元素redis.zremrangebyrank(‘grade’, 0, 0)1,即删除的元素个数
zremrangebyscore(name, min, max)删除key为name的zset中score在给定区间的元素redis.zremrangebyscore(‘grade’, 80, 90)1,即删除的元素个数

Opération de hachage

方法作用示例示例结果
hset(name, key, value)向key为name的hash中添加映射hset(‘price’, ‘cake’, 5)1,即添加的映射个数
hsetnx(name, key, value)向key为name的hash中添加映射,如果映射键名不存在hsetnx(‘price’, ‘book’, 6)1,即添加的映射个数
hget(name, key)返回key为name的hash中field对应的valueredis.hget(‘price’, ‘cake’)5
hmget(name, keys, *args)返回key为name的hash中各个键对应的valueredis.hmget(‘price’, [‘apple’, ‘orange’])[b’3’, b’7’]
hmset(name, mapping)向key为name的hash中批量添加映射redis.hmset(‘price’, {‘banana’: 2, ‘pear’: 6})True
hincrby(name, key, amount=1)将key为name的hash中映射的value增加amountredis.hincrby(‘price’, ‘apple’, 3)6,修改后的值
hexists(name, key)key为namehash中是否存在键名为key的映射redis.hexists(‘price’, ‘banana’)True
hdel(name, *keys)key为namehash中删除键名为key的映射redis.hdel(‘price’, ‘banana’)True
hlen(name)从key为name的hash中获取映射个数redis.hlen(‘price’)6
hkeys(name)从key为name的hash中获取所有映射键名redis.hkeys(‘price’)[b’cake’, b’book’, b’banana’, b’pear’]
hvals(name)从key为name的hash中获取所有映射键值redis.hvals(‘price’)[b’5’, b’6’, b’2’, b’6’]
hgetall(name)从key为name的hash中获取所有映射键值对redis.hgetall(‘price’){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(&#39;xx&#39;, cursor=0, match=None, count=None)
    第二次:cursor2, data1 = r.hscan(&#39;xx&#39;, cursor=cursor1, match=None, count=None)
    ...
    直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
Copier après la connexion

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

参数:
    match,匹配指定key,默认None 表示所有的key
    count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
如:    for item in r.hscan_iter(&#39;xx&#39;):
        print item
Copier après la connexion

管道

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

import redis
pool = redis.ConnectionPool(host=&#39;10.211.55.4&#39;, port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set(&#39;name&#39;, &#39;linwow&#39;)
pipe.set(&#39;age&#39;, &#39;18&#39;)
pipe.execute()
Copier après la connexion

Django中使用redis

方式一:

utils文件夹下,建立redis_pool.py

import redis
POOL = redis.ConnectionPool(host=&#39;127.0.0.1&#39;, port=6379,password=&#39;1234&#39;,max_connections=1000)
Copier après la connexion

视图函数中使用:

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

def index(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.hset(&#39;liwow&#39;,&#39;age&#39;,18)
    return HttpResponse(&#39;设置成功&#39;)
    
def order(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.hget(&#39;kkk&#39;,&#39;age&#39;)
    return HttpResponse(&#39;获取成功&#39;)
Copier après la connexion

方式二:

安装django-redis模块

pip3 install django-redis
Copier après la connexion

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",
        }
    }
}
Copier après la connexion

视图函数:

from django_redis import get_redis_connection
conn = get_redis_connection(&#39;default&#39;)
print(conn.hgetall(&#39;xxx&#39;))
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!