【Python】redis 模块_Key-Value 数据库

发布时间 2023-06-01 11:11:24作者: Phoenixy

Redis

Redis是一个开源的基于内存也可持久化的Key-Value数据库,采用ANSI C语言编写。

  它拥有丰富的数据结构,拥有事务功能,保证命令的原子性。

  由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。

  但内存数据库通常要考虑机器的内存大小。

安装redis数据库

windows : https://github.com/MicrosoftArchive/redis/releases

Linux: 

安装redis库

pip install redis

 

启动redis服务

 

 

常用数据结构

  • String  字符串
  • List  列表
  • Hash  哈希
  • Set  集合
  • ZSet  有序集合
  • Bitmap  位图

 

普通连接

import redis

# 方法一
# conn = redis.StrictRedis(host='localhost', port=6379, db=0)

# 方法二
conn = r = redis.Redis(host='localhost', port=6379, decode_responses=True)  

# 设置值 <设置值,默认不存在就创建,存在就修改>
conn.set(key, value)

# 获取值
conn.get(key)

 

redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串

连接池连接

redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
c = redis.Redis(connection_pool=pool) 
c.set(
'key', 'value') # 设置 key对应的值
print(c.get('key')) # 取出键 key对应的值

 

 

常用方法

set方法  设置单个键值

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

 

参数:

  •   name:key名称
  •   value:value值
  •   ex:过期时间(秒),时间到了后redis会自动删除
  •   px:过期时间(毫秒),时间到了后redis会自动删除。ex、px二选一即可
  •   nx:如果设置为True,则只有name不存在时,当前set操作才执行
  •   xx:如果设置为True,则只有name存在时,当前set操作才执行

 

setnx(name, value) : 设置值,只有name不存在时,执行设置操作(添加)

setex(name, time, value): 设置值, time过期时间 单位s <超过时间取值变为None>

psetex(name, time_ms, value): 设置值, tims_ms 过期时间  单位ms <超过时间取值变为None>

 

get方法  获取单个值 

get(name)

参数:

  •   name:key名称

 

mset/mget方法 批量设置/获取多个键值

mset(*args, **kwargs)
mget(keys, *args)

 

示例

# 方法一:
conn.mset(k1="v1", k2="v2")     # 这里k1 和k2 不能带引号,一次设置多个键值对
print(conn.mget("k1", "k2"))    # 一次取出多个键对应的值

# 方法二
dic = {"k1":"v1", "k2":"v2"}
conn.mset(dic)
print(conn.mget(["k1", "k2"]))

 

 

getset 方法 设置新值并获取原来的值

getset(name, value)

 

参数:

  •  name: key名称
  •  value:新设置的值
  •  return: 旧值

 

getrange方法 获取子序列(根据字节获取,非字符)

getrange(key, start, end) 

 

参数:

  • name - Redis 的 name
  • start - 起始位置(字节)
  • end - 结束位置(字节)

 

setrange 方法 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)

setrange(name, offset, value)

 

参数:

  • offset - 字符串的索引,字节(一个汉字三个字节)
  • value - 要设置的值

 

strlen 方法 获取value的长度  

strlen(name)

 

 

 append 在key对应的值后面追加内容  <若所给的键不存在,则设置新值, 返回值为修改后的字符串的长度>

append(key, value)

 

 

 incr int类型的value自增(自减)

incr(self, name, amount=1)

 

 参数:

  • name - Redis的name
  • amount - 自增数(必须是整数)
  • 返回值为:修改后的值,int类型

 

incrbyfloat 浮点数类型的value自增

incrbyfloat(name, amount=1.0)

 

返回值为:浮点数类型float

 

 

示例代码

# -*- coding:utf-8 -*-
import os
import time

import redis
from loguru import logger as logs


class redis_tools:
    """
    Redis 链接工具
    常用方法:
    get(key) 获取
    delete(key) 删除key-value
    set(key, value) 添加
    getset(key, new_value) 获取原值并更新新值
    """

    def __init__(self):
        self.exe = os.popen("redis-server.exe")
        self.host = "localhost"
        self.port = "6379"
        # redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串
        self.conn = redis.StrictRedis(host=self.host, port=self.port, decode_responses=True)

    def __del__(self):
        self.conn.close()
        self.exe.close()

    def conn_redis(self):
        """
        普通连接(相对于连接池来说)
        StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类
        """

        if self.conn.get("No") is None:
            self.conn.set("No", "1")
        if self.conn.get("case") is None:
            self.conn.set("case", "1")

        return self.conn

    def conn_pool(self):
        """
        连接池
        :return:
        """
        pool = redis.ConnectionPool(host=self.host, port=self.port, decode_responses=True)
        self.conn = redis.Redis(connection_pool=pool)
        return self.conn


if __name__ == "__main__":
    """debug"""

    redis_conn = redis_tools().conn_redis()
    logs.debug(redis_conn.getset("case", int(redis_conn.get("case")) + 1))
    logs.debug(redis_conn.getset("No", int(redis_conn.get("No"))+1))
    # cpool = redis_tools().conn_pool()
    # logs.debug(cpool.getset("case", int(cpool.get("case")) + 1))

 

 

 

执行结果

 

 

参考地址:https://zhuanlan.zhihu.com/p/374381314