edición章la secciónyo们va aParagrande家introducción Python Comoquéoperación redis,redis Es un Key-Value base de datos,Value Admite string(cadena),list(lista),set(Colección),zset(tenerordenColección),hash(哈希Tipo)esperarTipo. -> En este capítulo presentaremos cómo operar redis con Python. Redis es una base de datos Key-Value; el Value admite tipos como string (cadena), list (lista), set (conjunto), zset (conjunto ordenado), hash (tipo hash), etc.

Para más contenido sobre redis, consulte nuestrotutorial de redis, tenga en cuenta que antes de estudiar este capítulo debe asegurarse de que su servicio redis esté instalado.

La interfaz de inicio de redis es la siguiente:

Iniciar redis -> Iniciar redis

$ ./redis-server
75858:C 25 Oct 11:43:34.329 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
75858:M 25 Oct 11:43:34.331 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                            
      _.-``    `.  `_.  ''-._           Redis 3.0.3 (255fcb1a/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'
` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'
   |     PID: 75858
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |                                  
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
      `-._    `-.__.-'    _.-'                                      
          `-._        _.-'                                          
              `-.__.-'
                                             

75858:M 25 Oct 11:43:34.337 # Server started, Redis version 3.0.3
75858:M 25 Oct 11:43:34.339 * DB loaded from disk: 0.002 seconds
75858:M 25 Oct 11:43:34.339 * The server is now ready to accept connections on port 6379

Se puede ver que el número de puerto predeterminado es6379。


Instalar el módulo redis

Para usar redis en Python, primero debe instalar el módulo redis:

sudo pip3 install redis
o 
sudo easy_install redis
o 
sudo python setup.py install

Dirección del código fuente:https://github.com/WoLpH/redis-py

Comprobar si la instalación fue exitosa:

>>> import redis
>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
'bar'

redis ProporcionadosunidadClase Redis y StrictRedis, StrictRedis se utiliza paraimplementagrandesección.oficial方decomando,Redis Sí StrictRedis de la subcadenaClase,se utiliza parahaciadespués兼usar旧versióncosto. -> redis proporciona dos clases: Redis y StrictRedis. StrictRedis se utiliza para implementar la mayoría de los comandos oficiales; Redis es una subclase de StrictRedis, utilizada para mantener compatibilidad con versiones anteriores.

Los resultados obtenidos de redis son bytes por defecto; podemos configurardecode_responses=Truecambiarlos a cadenas.

Ejemplo

import redis   # Importar el módulo redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'ejemplo')  # Establecer el valor correspondiente a 'name'
print(r['name'])
print(r.get('name'))  # 取出Tecla name correspondienteValor -> # Obtener el valor correspondiente a la clave 'name'
print(type(r.get('name')))  # Ver el tipo

El resultado de salida es:

ejemplo
ejemplo
<class 'str'>

Grupo de conexiones

redis-py utiliza un connection pool para gestionar todas las conexiones a un servidor redis, evitando la sobrecarga de establecer y liberar conexiones cada vez.

默认,CadaRedisEjemplosclientepuede维护unPropioconexióndepósito。puededirectoConectarconstruir立unconexióndepósito, entoncescomoParámetros Redis,estomuestraSolopuedeimplementamúltiples Redis Ejemploscomún享unconexióndepósito. -> Por defecto, cada instancia de Redis mantiene su propio grupo de conexiones. Se puede crear un grupo de conexiones directamente y luego pasarlo como parámetro a Redis, logrando así que múltiples instancias de Redis compartan un mismo grupo de conexiones.

Ejemplo

import redis    # Importar el módulo redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'ejemplo')  # Establecer el valor correspondiente a 'name'
print(r.get('name'))  # 取出Tecla name correspondienteValor -> # Obtener el valor correspondiente a la clave 'name'

redis comandos básicos String -> Comandos básicos de redis: String

set(name, value, ex=None, px=None, nx=False, xx=False)

Al establecer un valor en Redis, por defecto, si no existe se crea; si existe, se modifica.

Parámetros: -> Parámetros:

  • ex - tiempo de expiración (segundos)
  • px - tiempo de expiración (milisegundos)
  • nx - si se establece como True, la operación set actual solo se ejecuta cuando name no existe
  • xx - si se establece como True, la operación set solo se ejecuta cuando 'name' existe

1. ex - tiempo de expiración (segundos). Aquí el tiempo de expiración es 3 segundos; después de 3 segundos p, el valor de la clave 'food' se convierte en None.

Ejemplo

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3)    # La clave es 'food' y el valor es 'mutton'; almacenar el par clave-valor en la caché de redis
print(r.get('food'))  # mutton obtener el valor correspondiente a la clave 'food' -> # 'mutton' - obtener el valor correspondiente a la clave 'food'

2.px - tiempo de expiración (milisegundos). Aquí el tiempo de expiración es 3 milisegundos; después de 3 milisegundos, el valor de la clave 'foo' se convierte en None.

Ejemplo

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)
print(r.get('food'))

3.nx - Si se establece en True, la operación set solo se ejecuta cuando name no existe (crear nuevo)

Ejemplo

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.set('fruit', 'watermelon', nx=True))    # True -- no existe
# Si la clave 'fruit' no existe, entonces la salida es True; si la clave 'fruit' ya existe, la salida es None

4.xx - Si se establece como True, solo se ejecuta la operación set actual cuando 'name' existe (modificar)

Ejemplo

print((r.set('fruit', 'watermelon', xx=True)))   # True--ya existe -> # True -- ya existe
# Si la clave 'fruit' ya existe, la salida es True; si la clave 'fruit' no existe, la salida es None

5.setnx(name, value)

Establecer valor: solo se ejecuta la operación de establecer cuando 'name' no existe (agregar)

print(r.setnx('fruit1', 'banana'))  # fruit1不存在,输出为True

6.setex(name, time, value)

Establecer valor

Parámetros: -> Parámetros:

time - tiempo de expiración (segundos numéricos o objeto timedelta)

Ejemplo

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", 5, "orange")
time.sleep(5)
print(r.get('fruit2'))  # Después de 5 segundos, el valor pasa de 'orange' a None

7.psetex(name, time_ms, value)

Establecer valor

Parámetros: -> Parámetros:

time_ms - tiempo de expiración (milisegundos numéricos o objeto timedelta)

Ejemplo

r.psetex("fruit3", 5000, "apple")
time.sleep(5)
print(r.get('fruit3'))  # Después de 5000 milisegundos, el valor pasa de 'apple' a None

8.mset(*args, **kwargs)

Establecer valores en lote -> Establecer valores en lote

Por ejemplo: -> Por ejemplo:

Ejemplo

r.mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1", k2="v2") # Aquí k1 y k2 no deben llevar comillas; se establecen múltiples pares clave-valor de una vez.
print(r.mget("k1", "k2"))   # Obtener de una vez los valores correspondientes a múltiples claves
print(r.mget("k1"))

9.mget(keys, *args)

Obtener en lote

Por ejemplo: -> Por ejemplo:

Ejemplo

print(r.mget('k1', 'k2'))
print(r.mget(['k1', 'k2']))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # Obtener en lote los valores correspondientes a las claves actualmente en la caché de redis

10.getset(name, value)

Establecer un nuevo valor y obtener el valor anterior

print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

11.getrange(key, start, end)

Obtener subsecuencia (según bytes, no caracteres)

Parámetros: -> Parámetros:

  • name - el nombre en Redis
  • start - posición inicial (byte)
  • end - posición final (byte) -> end - posición final (byte)

Por ejemplo: "Junxi Dada", 0-3 representa "Jun"

Ejemplo

r.set("cn_name", "君惜大大" -> "君惜大大") # Caracteres chinos -> # Caracteres chinos
print(r.getrange("cn_name", 0, 2))   # Obtener los bytes con índices 0-2, los primeros 3 bytes: '君', operación de corte (un carácter chino ocupa 3 bytes, una letra ocupa 1 byte, cada byte tiene 8 bits)
print(r.getrange("cn_name", 0, -1))  # Obtener todos los bytes: '君惜grandegrande', operación de corte
r.set("en_name","junxi") # Letras -> # Letras
print(r.getrange("en_name", 0, 2))  Obtener los bytes de los índices 0-2, los primeros 3 bytes: 'jun', operación de corte (un carácter chino ocupa 3 bytes, una letra ocupa 1 byte, cada byte tiene 8 bits)
print(r.getrange("en_name", 0, -1)) # Obtener todos los bytes: 'junxi', operación de corte

12.setrange(name, offset, value)

Modificar el contenido de la cadena, reemplazar desde el índice de cadena especificado hacia adelante (si el nuevo valor es demasiado largo, se agrega al final)

Parámetros:

  • offset - Índice de la cadena, en bytes (un carácter chino ocupa tres bytes)
  • value - El valor a establecer

Ejemplo

r.setrange("en_name", 1, "ccc")
print(r.get("en_name"))    # jccci El valor original es junxi, a partir del índice 1 reemplazar con ccc, se convierte en jccci

13.setbit(name, offset, value)

Operar sobre los bits de la representación binaria del valor correspondiente a name

Parámetros:

  • name - El name de redis
  • offset - Índice del bit (indexar después de convertir el valor a binario)
  • value - El valor solo puede ser 1 o 0

Nota: Si en Redis hay una correspondencia: n1 = "foo",

entonces la representación binaria de la cadena foo es: 01100110 01101111 01101111

Por lo tanto, si se ejecuta setbit('n1', 7, 1), el séptimo bit se establecerá en 1,

entonces el binario final se convierte en 01100111 01101111 01101111, es decir: "goo"

Extensión, conversión de representación binaria:

Ejemplo

source = "Chen Siwei"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')

Especialmente, ¿qué pasa si source es el carácter chino "Chen Siwei"?

Respuesta: Para utf-8, cada carácter chino ocupa 3 bytes, entonces "Chen Siwei" tiene 9 bytes. Para caracteres chinos, el bucle for itera por bytes. Al iterar, convertir cada byte a número decimal, y luego el número decimal a binario. 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

14.getbit(name, offset)

Obtener el valor de un bit en la representación binaria del valor correspondiente a name (0 o 1)

print(r.getbit("foo1", 0)) # 0 foo1 对应的二进制 4个字节 32位 第0位是0还是1

15.bitcount(key, start=None, end=None)

Obtener el número de 1s en la representación binaria del valor correspondiente a name

Parámetros:

  • key - El name de Redis
  • start - Posición inicial en bytes
  • end - Posición final en bytes

Ejemplo

print(r.get("foo"))  # goo1 01100111
print(r.bitcount("foo",0,1))  # 11 indica el número de apariciones de 1 en los primeros 2 bytes

16.bitop(operation, dest, *keys)

Obtener múltiples valores, realizar operaciones de bits sobre los valores y guardar el resultado final en el valor correspondiente al nuevo name

Parámetros:

  • operation - AND (y), OR (o), NOT (no), XOR (o exclusivo)
  • dest - El nuevo name de Redis
  • *keys - Los name de Redis a buscar

Por ejemplo:

bitop("AND", 'new_name', 'n1', 'n2', 'n3')

Obtener los valores correspondientes a n1, n2, n3 en Redis, luego realizar operaciones de bits sobre todos los valores (calcular la unión) y guardar el resultado en el valor correspondiente a new_name

Ejemplo

r.set("foo","1")  # 0110001
r.set("foo1","2")  # 0110010
print(r.mget("foo","foo1"))  # ['goo1', 'baaanew']
print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000
print(r.mget("foo","foo1","new"))

source = "12"
for i in source:
num = ord(i)
print(num)  # Imprimir el valor ASCII correspondiente a cada carácter alfabético o carácter chino f-102-0b100111-01100111
print(bin(num))  # Imprimir cada valor ASCII decimal convertido a binario 0b1100110 (0b indica binario)
print bin(num).replace('b','')  # Reemplazar el binario 0b1100110 por 01100110

17.strlen(name)

Devuelve la longitud en bytes del valor correspondiente a name (un carácter chino son 3 bytes)

print(r.strlen("foo"))  # 4 'goo1'的长度是4

18.incr(self, name, amount=1)

Incrementa el valor correspondiente a name; si name no existe, se crea name=amount; de lo contrario, se incrementa.

Parámetros:

  • name - El name de Redis
  • amount - Número de incremento (debe ser un entero)

Nota: igual que incrby

Ejemplo

r.set("foo", 123)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
r.incr("foo", amount=1)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))

Escenario de aplicación: contador de clics de página

Supongamos que necesitamos registrar el número de clics para una serie de páginas. Por ejemplo, cada publicación de un foro debe registrar el número de clics, y el número de clics es mucho mayor que el número de respuestas. Si se utiliza una base de datos relacional para almacenar los clics, puede haber mucha contención de bloqueos a nivel de fila. Por lo tanto, usar el comando INCR de redis para incrementar el contador de clics es lo mejor.

Cuando el servidor redis se inicia, se puede leer el valor inicial del contador de clics desde la base de datos relacional (la página 12306 fue visitada 34634 veces)

r.set("visit:12306:totals", 34634)
print(r.get("visit:12306:totals"))

Cada vez que hay un clic en una página, basta con usar INCR para incrementar el contador de clics.

r.incr("visit:12306:totals")
r.incr("visit:12306:totals")

Al cargar la página, se puede obtener este valor directamente.

print(r.get("visit:12306:totals"))

19.incrbyfloat(self, name, amount=1.0)

Incrementa el valor correspondiente a name; si name no existe, crea name=amount; de lo contrario, incrementa.

Parámetros:

  • name - El name de Redis
  • amount - Número de incremento (tipo flotante)

Ejemplo

r.set("foo1", "123.0")
r.set("foo2", "221.0")
print(r.mget("foo1", "foo2"))
r.incrbyfloat("foo1", amount=2.0)
r.incrbyfloat("foo2", amount=3.0)
print(r.mget("foo1", "foo2"))

20.decr(self, name, amount=1)

Decrementa el valor correspondiente a name; si name no existe, crea name=amount; de lo contrario, decrementa.

Parámetros:

  • name - El name de Redis
  • amount - Número de decremento (entero)

Ejemplo

r.decr("foo4", amount=3) # Decrementar en 3
r.decr("foo1", amount=1) # Decrementar en 1
print(r.mget("foo1", "foo4"))

21.append(key, value)

Agregar contenido al final del valor correspondiente al name de redis

Parámetros:

  • key - El name de redis
  • value - La cadena a agregar

Ejemplo

r.append("name", "haha")    # Agregar la cadena haha al final del valor junxi correspondiente a name
print(r.mget("name"))

Comandos básicos de redis: hash

1. Agregar individual -- modificar (obtener individual) -- si no existe, se agrega; si existe, se modifica

hset(name, key, value)

Establecer un par clave-valor en el hash correspondiente a name (si no existe, se crea; de lo contrario, se modifica)

Parámetros:

  • name - El name de redis
  • key - La key en el hash correspondiente a name
  • value - El value en el hash correspondiente a name

Nota: hsetnx(name, key, value) crea la key si no existe actualmente en el hash correspondiente a name (equivalente a agregar)

Ejemplo

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # Obtener todas las keys del hash
print(r.hget("hash1", "k1"))    # Obtener individualmente el value correspondiente a la key del hash
print(r.hmget("hash1", "k1", "k2")) # Obtener múltiples values correspondientes a keys del hash
r.hsetnx("hash1", "k2", "v3") # Solo se puede crear nuevo
print(r.hget("hash1", "k2"))

2. Agregar en lote (obtener)

hmset(name, mapping)

Establecer pares clave-valor por lotes en el hash correspondiente a name

Parámetros:

  • name - El name de redis
  • mapping - Diccionario, por ejemplo: {'k1':'v1', 'k2': 'v2'}

Por ejemplo:

Ejemplo

r.hmset("hash2", {"k2": "v2", "k3": "v3"})
hget(name,key)

Obtener el value según la key en el hash correspondiente a name

hmget(name, keys, *args)

Obtener los values de múltiples keys en el hash correspondiente a name

Parámetros:

  • name - El name correspondiente a reids
  • keys - El conjunto de keys a obtener, por ejemplo: ['k1', 'k2', 'k3']
  • *args - Las keys a obtener, por ejemplo: k1,k2,k3

Por ejemplo:

Ejemplo

print(r.hget("hash2", "k2"))  # Obtener individualmente el value correspondiente a la key-k2 de "hash2"
print(r.hmget("hash2", "k2", "k3"))  # Obtener en lote los values correspondientes a las keys k2 k3 de "hash2" -- método 1
print(r.hmget("hash2", ["k2", "k3"]))  # Obtener en lote los values correspondientes a las keys k2 k3 de "hash2" -- método 2

3. Obtener todos los pares clave-valor

hgetall(name)

Obtener todos los pares clave-valor del hash correspondiente a name

print(r.hgetall("hash1"))

4. Obtener el formato de todos los pares clave-valor, longitud del hash

hlen(name)

Obtener el número de pares clave-valor en el hash correspondiente a name

print(r.hlen("hash1"))

5. Obtener todas las claves (similar a obtener todas las claves de un diccionario)

hkeys(name)

Obtener todas las keys del hash correspondiente a name

print(r.hkeys("hash1"))

6. Obtener todos los valores (similar a obtener todos los valores de un diccionario)

hvals(name)

Obtener todos los values del hash correspondiente a name

print(r.hvals("hash1"))

7. Verificar si un miembro existe (similar a 'in' en diccionarios)

hexists(name, key)

Verificar si la key pasada existe en el hash correspondiente a name

Ejemplo

print(r.hexists("hash1", "k4"))  # False no existe
print(r.hexists("hash1", "k1"))  # True existe

8. Eliminar pares clave-valor

hdel(name,*keys)

Eliminar el par clave-valor de la key especificada en el hash correspondiente a name

Ejemplo

print(r.hgetall("hash1"))
r.hset("hash1", "k2", "v222")   # Modificar la key existente k2
r.hset("hash1", "k11", "v1")   # Agregar nuevo par clave-valor k11
r.hdel("hash1", "k1")    # Eliminar un par clave-valor
print(r.hgetall("hash1"))

9. Auto-incremento y auto-decremento de enteros (el valor correspondiente a la clave - entero: incrementar en 1 o 2, u otro entero; si es negativo, es decremento)

hincrby(name, key, amount=1)

Incrementar el valor de la key especificada en el hash correspondiente a name; si no existe, crear key=amount

Parámetros:

  • name - El name en redis
  • key - La key correspondiente al hash
  • amount - número de incremento (entero)

Ejemplo

r.hset("hash1", "k3", 123)
r.hincrby("hash1", "k3", amount=-1)
print(r.hgetall("hash1"))
r.hincrby("hash1", "k4", amount=1)  # Si no existe, value es 1 por defecto
print(r.hgetall("hash1"))

10. Autoincremento y autodecremento de flotantes (el valor correspondiente a la clave —flotante— se incrementa en 1.0 o 2.0, u otro flotante; si es negativo, es decremento)

hincrbyfloat(name, key, amount=1.0)

Incrementa el valor de la key especificada en el hash correspondiente a name; si no existe, crea key=amount

Parámetros:

  • name - el name en redis
  • key - la key correspondiente al hash
  • amount, número de incremento (flotante)

Incrementa el valor de la key especificada en el hash correspondiente a name; si no existe, crea key=amount.

Ejemplo

r.hset("hash1", "k5", "1.0")
r.hincrbyfloat("hash1", "k5", amount=-1.0)    # Ya existe, decrementa -1.0
print(r.hgetall("hash1"))
r.hincrbyfloat("hash1", "k6", amount=-1.0)    # No existe, value inicial es -1.0, cada vez decrementa 1.0
print(r.hgetall("hash1"))

11. Obtener valor - lectura por fragmentos

hscan(name, cursor=0, match=None, count=None)

La obtención mediante iteración incremental es muy útil para datos grandes. hscan permite obtener los datos por fragmentos, no todos de una vez, evitando así que la memoria se desborde.

Parámetros:

  • name - el name en redis
  • cursor - cursor (obtener datos por lotes basados en el cursor)
  • match - coincide con la key especificada, None por defecto significa todas las keys
  • count - cantidad mínima a obtener en cada fragmento, None por defecto indica usar el número de fragmentos predeterminado de Redis

Por ejemplo:

第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
...

Cuando el valor de cursor devuelto sea 0, indica que los datos se han obtenido por fragmentos por completo

print(r.hscan("hash1"))

12, hscan_iter(name, match=None, count=None)

Usa yield para encapsular hscan y crear un generador, logrando obtener datos de redis por lotes

Parámetros:

  • match - coincide con la key especificada, None por defecto significa todas las keys
  • count - cantidad mínima a obtener en cada fragmento, None por defecto indica usar el número de fragmentos predeterminado de Redis

Por ejemplo:

Ejemplo

for item in r.hscan_iter('hash1'):
    print(item)
print(r.hscan_iter("hash1"))    # Dirección de memoria del generador

5. redis comandos básicos list -> 5. Comandos básicos de redis: list

1. Añadir (similar a append de list, pero aquí se añade desde la izquierda) -- si no existe, se crea

lpush(name,values)

Añade elementos a la lista correspondiente a name; cada nuevo elemento se añade al extremo izquierdo de la lista

Por ejemplo:

Ejemplo

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

r.lpush("list1", 11, 22, 33)
print(r.lrange('list1', 0, -1))

El orden guardado es: 33,22,11

Extensión:

r.rpush("list2", 11, 22, 33)  # 表示从右向左操作
print(r.llen("list2"))  # 列表长度
print(r.lrange("list2", 0, 3))  # 切片取出值,范围是索引号0-3

2. Añadir (añadir desde la derecha) -- si no existe, se crea

Ejemplo

r.rpush("list2", 44, 55, 66)    # En el lado derecho de la lista, añade secuencialmente 44,55,66
print(r.llen("list2"))  # Longitud de la lista
print(r.lrange("list2", 0, -1)) # Extrae valores por rebanada, el rango es el índice 0 a -1 (el último elemento)

3. Añadir elementos al lado izquierdo de la lista de un name existente; si no existe, no se puede crear

lpushx(name,value)

Añade elementos a la lista correspondiente a name; solo cuando name ya existe, el valor se añade al extremo izquierdo de la lista

Más:

Ejemplo

r.lpushx("list10", 10)   # Aquí list10 no existe
print(r.llen("list10"))  # 0
print(r.lrange("list10", 0, -1))  # []
r.lpushx("list2", 77)   # Aquí 'list2' ya existía antes, añade un elemento al extremo izquierdo de la lista; solo se puede añadir uno a la vez
print(r.llen("list2"))  # Longitud de la lista
print(r.lrange("list2", 0, -1)) # Extrae valores por rebanada, el rango es el índice 0 a -1 (el último elemento)

4. Añadir elementos al lado derecho de la lista de un name existente; si no existe, no se puede crear

Ejemplo

r.rpushx("list2", 99)   # Aquí 'foo_list1' ya existía antes, añade un elemento al extremo derecho de la lista; solo se puede añadir uno a la vez
print(r.llen("list2"))  # Longitud de la lista
print(r.lrange("list2", 0, -1)) # Extrae valores por rebanada, el rango es el índice 0 a -1 (el último elemento)

5. Insertar (insertar un elemento en una posición de índice fija)

linsert(name, where, refvalue, value))

Inserta un nuevo valor antes o después de un valor en la lista correspondiente a name

Parámetros:

  • name - el name en redis
  • where - BEFORE o AFTER
  • refvalue - valor de referencia, es decir, insertar datos antes o después de él
  • value - el dato a insertar

Ejemplo

r.linsert("list2", "before", "11", "00")   # Inserta el elemento '00' antes del primer elemento '11' que aparece por la izquierda en la lista
print(r.lrange("list2", 0, -1))   # Extrae valores por rebanada, el rango es el índice 0 al último elemento

6. Modificar (modificar según el índice especificado)

r.lset(name, index, value)

Reasigna el valor en una posición de índice de la lista correspondiente a name

Parámetros:

  • name - el name en redis
  • index - posición de índice de list
  • value - el valor a establecer

Ejemplo

r.lset("list2", 0, -11)    # Cambia el elemento con índice 0 a -11
print(r.lrange("list2", 0, -1))

7. Eliminar (eliminar según un valor especificado)

r.lrem(name, value, num)

Elimina el valor especificado en la lista correspondiente a name

Parámetros:

  • name - el name en redis
  • value - el valor a eliminar
  • num - num=0, elimina todos los valores especificados de la lista;
  • num=2 - de adelante hacia atrás, elimina 2; num=1, de adelante hacia atrás, elimina el primero desde la izquierda
  • num=-2 - de atrás hacia adelante, elimina 2

Ejemplo

r.lrem("list2", "11", 1)    # Elimina la primera aparición de '11' por la izquierda en la lista
print(r.lrange("list2", 0, -1))
r.lrem("list2", "99", -1)    # Elimina la primera aparición de '99' por la derecha en la lista
print(r.lrange("list2", 0, -1))
r.lrem("list2", "22", 0)    # Elimina todos los '22' de la lista
print(r.lrange("list2", 0, -1))

8. Eliminar y devolver

lpop(name)

Obtiene el primer elemento en el lado izquierdo de la lista correspondiente a name y lo elimina de la lista; el valor de retorno es el primer elemento

Más:

rpop(name) indica operar de derecha a izquierda

Ejemplo

r.lpop("list2")    # Elimina el elemento más a la izquierda de la lista y devuelve el elemento eliminado
print(r.lrange("list2", 0, -1))
r.rpop("list2")    # Elimina el elemento más a la derecha de la lista y devuelve el elemento eliminado
print(r.lrange("list2", 0, -1))

9. Eliminar valores fuera del índice

ltrim(name, start, end)

Elimina en la lista correspondiente a name los valores que no están entre los índices start-end

Parámetros:

  • name - el name en redis
  • start - posición inicial del índice
  • end - posición final del índice

Ejemplo

r.ltrim("list2", 0, 2)    # Elimina los elementos fuera del índice 0-2; conserva solo los elementos con índice 0-2
print(r.lrange("list2", 0, -1))

10. Obtener valor (obtener según el índice)

lindex(name, index)

Obtiene el elemento de la lista según el índice en la lista correspondiente a name

print(r.lindex("list2", 0))  # 取出索引号是0的值

11. Mover: mover un elemento de una lista a otra

rpoplpush(src, dst)

Toma el elemento más a la derecha de una lista y lo añade al extremo izquierdo de otra lista

Parámetros:

  • src - el name de la lista de la que se toman los datos
  • dst - el name de la lista a la que se añaden los datos
r.rpoplpush("list1", "list2")
print(r.lrange("list2", 0, -1))

12. Mover: mover un elemento de una lista a otra; se puede establecer un timeout

brpoplpush(src, dst, timeout=0)

Elimina un elemento del lado derecho de una lista y lo añade al lado izquierdo de otra lista

Parámetros:

  • src - el name correspondiente a la lista de la que se extrae y elimina el elemento
  • dst - el name correspondiente a la lista donde se insertará el elemento
  • timeout - cuando no hay datos en la lista correspondiente a src, tiempo de espera en bloqueo hasta que tenga datos (segundos); 0 significa bloqueo indefinido

Ejemplo

r.brpoplpush("list1", "list2", timeout=2)
print(r.lrange("list2", 0, -1))

13. Eliminar de múltiples listas a la vez

blpop(keys, timeout)

Ordena múltiples listas y hace pop de los elementos de las listas correspondientes de izquierda a derecha

Parámetros:

  • keys - conjunto de names de redis
  • timeout - tiempo de espera; cuando se han obtenido todos los elementos de todas las listas, tiempo de bloqueo esperando a que haya datos en las listas (segundos); 0 significa bloqueo indefinido

Más:

r.brpop(keys, timeout)Igual que blpop, ordena múltiples listas y elimina los elementos de cada lista de derecha a izquierda

Ejemplo

r.lpush("list10", 3, 4, 5)
r.lpush("list11", 3, 4, 5)
while True:
    r.blpop(["list10", "list11"], timeout=2)
    print(r.lrange("list10", 0, -1), r.lrange("list11", 0, -1))

14. Iteración incremental personalizada

Debido a que la biblioteca de redis no proporciona iteración incremental para los elementos de una lista, si se quieren recorrer todos los elementos de la lista correspondiente a name, entonces es necesario obtener todas las listas correspondientes a name.

Recorrer la lista

Pero si la lista es muy grande, es posible que en el primer paso se desborde el contenido del programa, por lo que es necesario personalizar una función de iteración incremental:

Ejemplo

def list_iter(name):
    """
Iteración incremental personalizada para listas de redis
:param name: el name en redis, es decir: iterar la lista correspondiente a name
:return: yield devuelve elementos de la lista
    """

    list_count = r.llen(name)
    for index in range(list_count):
        yield r.lindex(name, index)

# Uso
for item in list_iter('list2'): # Recorre esta lista
    print(item)

6. Comandos básicos de redis: set

1. Añadir

sadd(name,values)

name - añade elementos al conjunto correspondiente

Ejemplo

r.sadd("set1", 33, 44, 55, 66)  # Añade elementos al conjunto
print(r.scard("set1"))  # La longitud del conjunto es 4
print(r.smembers("set1"))   # Obtener todos los miembros del conjunto

2. Obtener el número de elementos, similar a len

scard(name)

Obtener el número de elementos del conjunto correspondiente a name

print(r.scard("set1"))  # 集合的长度是4

3. Obtener todos los miembros del conjunto

smembers(name)

Obtener todos los miembros del conjunto correspondiente a name

print(r.smembers("set1"))   # 获取集合中所有的成员

Obtener todos los miembros del conjunto -- en forma de tupla Obtener todos los miembros del conjunto -- en forma de tupla

sscan(name, cursor=0, match=None, count=None)

Ejemplo: Ejemplo:

print(r.sscan("set1"))

Obtener todos los miembros del conjunto -- mediante iterador

sscan_iter(name, match=None, count=None)

Similar a la operación de cadenas, se utiliza para obtener elementos por lotes de forma incremental, evitando un consumo excesivo de memoria.

for i in r.sscan_iter("set1"):
    print(i)

4. Diferencia de conjuntos

sdiff(keys, *args)

El conjunto de elementos que están en el conjunto correspondiente al primer name pero no en los conjuntos correspondientes a otros name.

Ejemplo

r.sadd("set2", 11, 22, 33)
print(r.smembers("set1"))   # Obtener todos los miembros del conjunto
print(r.smembers("set2"))
print(r.sdiff("set1", "set2"))   # En el conjunto set1 pero no en el conjunto set2 # En el conjunto set1 pero no en el conjunto set2
print(r.sdiff("set2", "set1"))   # En el conjunto set2 pero no en el conjunto set1 # En el conjunto set2 pero no en el conjunto set1

5.Maloconjunto--Maloconjuntoexisteun nuevoColecciónMedio 5. Diferencia de conjuntos -- guardar la diferencia en un nuevo conjunto

sdiffstore(dest, keys, *args)

Obtener los elementos que están en el conjunto correspondiente al primer name pero no en los conjuntos correspondientes a los otros name, y luego agregarlos al conjunto correspondiente a dest.

Ejemplo

r.sdiffstore("set3", "set1", "set2")    # En el conjunto set1 pero no en el conjunto set2 # En el conjunto set1 pero no en el conjunto set2
print(r.smembers("set3"))   # Obtener todos los miembros del conjunto 3 # Obtener todos los miembros del conjunto 3

6. Intersección 6. Intersección

sinter(keys, *args)

Obtener la intersección de los conjuntos correspondientes a más de un name

print(r.sinter("set1", "set2")) # 取2个集合的交集

7. Intersección -- guardar la intersección en un nuevo conjunto

sinterstore(dest, keys, *args)

Obtener la unión de los conjuntos correspondientes a más de un name y luego agregarla al conjunto correspondiente a dest.

print(r.sinterstore("set3", "set1", "set2")) # 取2个集合的交集
print(r.smembers("set3"))

Unión Unión

sunion(keys, *args)

Obtener la unión de los conjuntos correspondientes a múltiples name

print(r.sunion("set1", "set2")) # 取2个集合的并集

Unión -- la unión es un nuevo conjunto Unión -- guardar la unión en un nuevo conjunto

sunionstore(dest,keys, *args)

Obtener la unión de los conjuntos correspondientes a más de un name y guardar el resultado en el conjunto correspondiente a dest.

print(r.sunionstore("set3", "set1", "set2")) # 取2个集合的并集
print(r.smembers("set3"))

8. Verificar si es miembro del conjunto, similar a 'in'

sismember(name, value)

verificarvaluesiSínamecorrespondienteColecciónde costo员,ResultadoParaTrueyFalse Comprobar si value es miembro del conjunto correspondiente a name; el resultado es True o False.

print(r.sismember("set1", 33))  # 33是集合的成员
print(r.sismember("set1", 23))  # 23不是集合的成员

9. Mover 9. Mover

smove(src, dst, value)

Mover un miembro de un conjunto a otro conjunto.

r.smove("set1", "set2", 44)
print(r.smembers("set1"))
print(r.smembers("set2"))

10. Eliminar -- eliminar aleatoriamente y devolver el valor eliminado

spop(name)

Elimina un miembro del conjunto y lo devuelve. Nota: como el conjunto no está ordenado, la eliminación es aleatoria.

print(r.spop("set2"))   # 这个删除的值是随机删除的,集合是无序的
print(r.smembers("set2"))

11. Eliminar -- eliminar por valor específico

srem(name, values)

Eliminar ciertos valores en el conjunto correspondiente a name.

print(r.srem("set2", 11))   # 从集合中删除指定值 11
print(r.smembers("set2"))

7. Comandos básicos de redis: set ordenado

Operaciones de Set. Un conjunto Set es una lista que no permite duplicados y, en sí mismo, no está ordenado.

tenerordenColección,EnColeccióndeBase础arriba,Paracada元素排orden;元素de排ordenrequieresegúnOtro外unValorvenirpara comparar,lugarconrespecto aquetenerordenColección,cadaun元素tenerdosunidadvalor,es decir:valores ydividirnúmero,dividirbase专门usarvenir做排orden. Un conjunto ordenado, sobre la base del conjunto, ordena cada elemento; la clasificación de los elementos requiere comparar según otro valor, por lo que, para un conjunto ordenado, cada elemento tiene dos valores: valor y puntuación; la puntuación se utiliza específicamente para ordenar.

1. Agregar

zadd(name, *args, **kwargs)

Agregar elementos al conjunto ordenado correspondiente a name.

Por ejemplo:

Ejemplo

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

r.zadd("zset1", n1=11, n2=22)
r.zadd("zset2", 'm1', 22, 'm2', 44)
print(r.zcard("zset1")) # Longitud del conjunto
print(r.zcard("zset2")) # Longitud del conjunto
print(r.zrange("zset1", 0, -1))   # Obtener todos los elementos del conjunto ordenado
print(r.zrange("zset2", 0, -1, withscores=True))   # Obtener todos los elementos y puntuaciones del conjunto ordenado

2. Obtener el número de elementos del conjunto ordenado, similar a len

zcard(name)

Obtener el número de elementos del conjunto ordenado correspondiente a name

print(r.zcard("zset1")) # 集合长度

3. Obtener todos los elementos del conjunto ordenado

r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

Obtener los elementos del conjunto ordenado correspondiente a name según un rango de índices.

Parámetros:

  • name - el name de redis name - el name de redis
  • start - posición inicial del índice del conjunto ordenado (no puntuación)
  • end - posición final del índice del conjunto ordenado (no puntuación)
  • desc - regla de ordenación; por defecto se ordena por puntuación de menor a mayor desc - regla de ordenación; por defecto se ordena por puntuación de menor a mayor
  • withscores - si se obtienen las puntuaciones de los elementos; por defecto solo se obtienen los valores de los elementos
  • score_cast_func - función para transformar los datos de la puntuación

3-1 Ordenar de mayor a menor (igual que zrange, el conjunto está ordenado de mayor a menor) 3-1 Ordenar de mayor a menor (igual que zrange, el conjunto está ordenado de mayor a menor)

zrevrange(name, start, end, withscores=False, score_cast_func=float)

Ejemplos Ejemplo

print(r.zrevrange("zset1", 0, -1))    # 只获取元素,不显示分数
print(r.zrevrange("zset1", 0, -1, withscores=True)) # 获取有序集合中所有元素和分数,分数倒序

3-2 Obtener los elementos del conjunto ordenado correspondiente a name según un rango de puntuaciones

zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)

Ejemplos Ejemplo

Ejemplo

for i in range(1, 30):
   element = 'n' + str(i)
   r.zadd("zset3", element, i)
print(r.zrangebyscore("zset3", 15, 25)) # # Entre las puntuaciones de 15-25, obtener los elementos que cumplan la condición
print(r.zrangebyscore("zset3", 12, 22, withscores=True))    # Entre las puntuaciones de 12-22, obtener los elementos que cumplan la condición (con puntuación)

3-3 Obtener los elementos del conjunto ordenado según un rango de puntuaciones y ordenarlos (por defecto de mayor a menor)

zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)

Ejemplos Ejemplo

print(r.zrevrangebyscore("zset3", 22, 11, withscores=True)) # 在分数是22-11之间,取出符合条件的元素 按照
Puntuación en orden descendente

3-4 Obtener todos los elementos -- ordenados por puntuación por defecto

zscan(name, cursor=0, match=None, count=None, score_cast_func=float)

Ejemplos Ejemplo

print(r.zscan("zset3"))

3-5 Obtener todos los elementos -- iterador

zscan_iter(name, match=None, count=None,score_cast_func=float)

Ejemplos Ejemplo

for i in r.zscan_iter("zset3"): # 遍历迭代器
    print(i)

4.zcount(name, min, max)

Obtener el número de elementos del conjunto ordenado correspondiente a name cuyas puntuaciones están entre [min, max].

print(r.zrange("zset3", 0, -1, withscores=True))
print(r.zcount("zset3", 11, 22))

5. Incremento automático

zincrby(name, value, amount)

Incrementar automáticamente la puntuación correspondiente a name en el conjunto ordenado correspondiente a name.

r.zincrby("zset3", "n2", amount=2)    # 每次将n2的分数自增2
print(r.zrange("zset3", 0, -1, withscores=True))

6. Obtener el índice de un valor

zrank(name, value)

Obtener el índice de un valor en el conjunto ordenado correspondiente a name (comienza desde 0).

Más: Más:

zrevrank(name, value), ordenado de mayor a menor.

Ejemplo

print(r.zrank("zset3", "n1"))   # El índice de n1 es 0; aquí se sigue el orden de puntuación (de menor a mayor) # El índice de n1 es 0; aquí se sigue el orden de puntuación (de menor a mayor)
print(r.zrank("zset3", "n6"))   # El índice de n6 es 1

print(r.zrevrank("zset3", "n1"))    # El índice de n1 es 29; aquí se sigue el orden inverso de puntuación (de mayor a menor)

7. Eliminar -- eliminar por valor específico

zrem(name, values)

Eliminar los miembros cuyos valores son values en el conjunto ordenado correspondiente a name

r.zrem("zset3", "n3")   # 删除有序集合中的元素n3 删除单个
print(r.zrange("zset3", 0, -1))

8. Eliminar -- eliminar según el rango de clasificación, es decir, eliminar por número de índice

zremrangebyrank(name, min, max)

Eliminar según el rango de clasificación

r.zremrangebyrank("zset3", 0, 1)  # 删除有序集合中的索引号是0, 1的元素
print(r.zrange("zset3", 0, -1))

9. Eliminar -- eliminar según el rango de puntuación

zremrangebyscore(name, min, max)

Eliminar según el rango de puntuación

r.zremrangebyscore("zset3", 11, 22)   # 删除有序集合中的分数是11-22的元素
print(r.zrange("zset3", 0, -1))

10. Obtener la puntuación correspondiente a un valor

zscore(name, value)

Obtener la puntuación correspondiente a value en el conjunto ordenado correspondiente a name.

print(r.zscore("zset3", "n27"))   # 获取元素n27对应的分数27

8. Otras operaciones comunes

1. Eliminar 1. Eliminar

delete(*names)

Eliminar según el nombre cualquier tipo de datos en redis (string, hash, list, set, set ordenado)

r.delete("gender")  # 删除key为gender的键值对

2. Comprobar si el nombre existe

exists(name)

Verificar si el name de redis existe; si existe es True, si no existe es False.

print(r.exists("zset1"))

3. Coincidencia difusa

keys(pattern='')

Obtener el name de redis según el patrón.

Más: Más:

  • KEYS * coincide con todas las key de la base de datos.
  • KEYS h?llo coincide con hello, hallo y hxllo, etc.
  • KEYS hllo coincide con hllo y heeeeello, etc.
  • KEYS h[ae]llo coincide con hello y hallo, pero no con hillo.
print(r.keys("foo*"))

4. Establecer tiempo de espera

expire(name ,time)

Establecer un tiempo de espera para un name de redis.

r.lpush("list5", 11, 22)
r.expire("list5", time=3)
print(r.lrange("list5", 0, -1))
time.sleep(3)
print(r.lrange("list5", 0, -1))

5. Renombrar 5. Renombrar

rename(src, dst)

Renombrar el name de redis.

r.lpush("list5", 11, 22)
r.rename("list5", "list5-1")

6. Obtener un name aleatoriamente 6. Obtener un name aleatoriamente

randomkey()

Obtener aleatoriamente un nombre de redis (sin eliminarlo)

print(r.randomkey())

7. Obtener el tipo Obtener el tipo

type(name)

获取namecorrespondedel valorTipo Obtener el tipo del valor correspondiente a name.

print(r.type("set1"))
print(r.type("hash2"))

8. Ver todos los elementos

Ejemplo

scan(cursor=0, match=None, count=None)

print(r.hscan("hash2"))
print(r.sscan("set3"))
print(r.zscan("zset2"))
print(r.getrange("foo1", 0, -1))
print(r.lrange("list2", 0, -1))
print(r.smembers("set3"))
print(r.zrange("zset3", 0, -1))
print(r.hgetall("hash1"))

9. Ver todos los elementos -- iterador

Ejemplo

scan_iter(match=None, count=None)

for i in r.hscan_iter("hash1"):
    print(i)

for i in r.sscan_iter("set3"):
    print(i)

for i in r.zscan_iter("zset3"):
    print(i)

otros métodos -> Otros métodos

Ejemplo

print(r.get('name'))    # Consultar el valor de la key 'name'
r.delete("gender")  # Eliminar el par clave-valor cuya clave es gender # Eliminar el par clave-valor cuya key es 'gender'
print(r.keys()) # Consultar todas las keys
print(r.dbsize())   # Cuántos datos contiene actualmente redis
r.save()    # Ejecutar la operación 'checkpoint' y escribir los datos de vuelta al disco. Bloquea al guardar.
# r.flushdb() # Vaciar todos los datos en r

Tubería (pipeline)

redis默认EnejecutarcadavezsolicitudclientepuedeCreadorconstruir(conexióndepósito申solicitarconexión) ymientras su conexión(归还conexióndepósito)unavezconexiónoperación, si想quererEnunavezsolicitudMedio指elmúltiplescomando, entoncesse puede utilizarpiplineimplementaunavezsolicitud指elmúltiplescomando, y默认situaciónbajounavezpipline SíOriginal子性operaciones. De forma predeterminada, redis crea y cierra una conexión (solicita conexión del grupo de conexiones y la devuelve al grupo) en cada solicitud. Si se desea especificar múltiples comandos en una sola solicitud, se puede usar pipeline para lograrlo, y de forma predeterminada un pipeline es una operación atómica.

管道(pipeline)SíredisEnProporcionaúnicosolicitudMedio缓冲mucho条ServiciodispositivocomandodeBaseClasede la subcadenala clase.elloMedianteRestapocoServiciodispositivo-Clienteentre反复deTCPbase de datosPaquete,desdeYgrandegrandeproponerAltoyaejecutar批cantidadcomandodefunción. Pipeline es una subclase de la clase base que redis proporciona para almacenar en búfer múltiples comandos de servidor en una sola solicitud. Al reducir los paquetes TCP repetidos entre el servidor y el cliente, mejora enormemente la ejecución de comandos en lote.

Ejemplo

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

# pipe = r.pipeline(transaction=False) # 默认desituaciónbajo,管道dentroejecutardecomandopuedegarantíaejecutardeOriginal子性,ejecutarpipe = r.pipeline(transaction=False)puedeDeshabilitadoestounaCaracterísticas. # pipe = r.pipeline(transaction=False) # De forma predeterminada, los comandos ejecutados en el pipeline pueden garantizar la atomicidad; ejecutar pipe = r.pipeline(transaction=False) puede deshabilitar esta característica.
# pipe = r.pipeline(transaction=True)
pipe = r.pipeline() # Crear un pipeline

pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num')    # Si num no existe, value es 1; si existe, value se incrementa en 1.
pipe.execute()

print(r.get("name"))
print(r.get("role"))
print(r.get("num"))

Los comandos del pipeline se pueden escribir juntos, por ejemplo:

Ejemplo

pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()
print(r.get("name"))
print(r.get("role"))
print(r.get("num"))

Autor: 君惜丶

Enlace:https://www.jianshu.com/p/2639549bedc8