1.安装
pip install redis
2.连接

连接实例分为StrictRedis和Redis,StrictRedis的命令基本上与官方命令一致,Redis是StrictRedis的子类,使用命令兼顾版本即兼容性较好

from redis import Redis, ConnectionPool

redis_cli = Redis(host="localhost", port=6379, username="", password="", db=0, decode_responses=True)
redis_cli.set("name", "icy", 10)
print(redis_cli.get("name"))  # 也可以redis_cli["name"],但key不存在会报错
redis_cli.close()

上面的方法会单独管理自己的连接池,但是如果每次使用redis都连接释放,会造成性能瓶颈,所以我们可以使用连接池,让它自己管理释放问题

pool = ConnectionPool(host='127.0.0.1', port=6379, password='', decode_responses=True)
redis_cli = Redis(connection_pool=pool)
redis_cli.set("name", "icy")
print(redis_cli.get("name"))

ConnectionPool作用是,它会检查列表_available_connections是否有可用的连接,如果有就用,没有就创建一个连接,用完之后会调用release()把它丢进列表_in_use_connections等待下次调用

3.Key
redis_cli.keys()  # 返回所有key(列表),pattern参数可以模糊搜索
redis_cli.delete("name", "age", "count")  # 删除一个或多个key
redis_cli.exists("name")  # 查看key是否存在
redis_cli.expire("name", 5)  # 设置5秒后过期
redis_cli.rename("name", "name1")  # 重命名key,key不存在则报错
redis_cli.renamenx("name", "name1")  # 重命名key,key不存在则报错,如果"name1"不存在才成功
redis_cli.randomkey()  # 随机取出一个key
redis_cli.type("name")  # 查看key类型,如果不存在返回none(字符串)

4.String
redis_cli.set("name", "icy")

set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False, get=False, exat=None, pxat=None)
ex,过期时间(秒), 类似于setex(name, time, value)
px,过期时间(毫秒),类似于psetex(name, time_ms, value)
nx,为True时,当name不存在时才设置,类似于setnx(name, value)
xx,为True时,当name存在才设置

redis_cli.set("name", "icy")
redis_cli.setex("name", 10, "icy")  # 10秒后过期
redis_cli.psetex("name", 500, "icy")  # 500毫秒后过期
redis_cli.setnx("name", "icy")  # 如果key不存在就设置成功
redis_cli.append("name", "_good")  # 在key后面追加字符串,不存在则创建
redis_cli.get("name1")  # 取单个值,取不到返回None

redis_cli.mset({"name": "pan", "age": 18})  # 设置多个值,传入字典
redis_cli.mget("name", "age")  # 返回一个列表
redis_cli.mget(("name", "age"))  # 返回一个列表,参数也可以是一个可迭代对象
redis_cli.getset("name", "pan")  # 设置name为pan,并且返回之前的值

redis_cli.setrange("name", 2, "abcdefg")  # 从原字符串的第2个位置开始替换,原来是icy,替换后是icabcdefg
redis_cli.getrange("name", 1, 3)  # 取子串第1个位置到第3个位置,原来是abcdefg,取出来是cab(左闭右闭)
redis_cli.strlen("name")  # 返回长度,不存在返回0
redis_cli.incr("count", amount=10)  # 不存在则以10为初始值,若存在则自增10,不指定amount默认为1
redis_cli.decr("count", amount=11)  # 不存在则以11为初始值,若存在则自减10,不指定amount默认为1

redis_cli.delete("name1")  # 删除
5.Hash

hset(name,key,value,mapping,items)
name,即key
key,即field,
value,即value
mapping,字典,即插入多个key:value
items,列表套字典

redis_cli.hset("student", "name", "icy")  # 设置某个key的field和value,返回受影响行数
redis_cli.hset("student", mapping={"name": "icy", "age": 18, "gender": 1})  # 设置多个k/v,在redis4.0之前不可用
redis_cli.hset("student", items=["name", "icy", "age", 18, "gender", 1])  # 设置多个k/v,在redis4.0之前不可用
redis_cli.hmset("student", {"name": "icy", "age": 18, "gender": 1})  # 设置多个k/v,在redis4.0版本之后废弃

redis_cli.hget("student", "name")  # 取出key里的某个filed
redis_cli.hmget("student", ["name", "age"])  # 取出key里的多个filed,返回列表
redis_cli.hgetall("student")  # 返回key里所有k/v(返回一个字典)
redis_cli.hkeys("student")  # 取出所有key(返回列表)
redis_cli.hvals("student")  # 取出所有value(返回列表)
redis_cli.hexists("student", "height")  # 查看key里是否存在某个field
redis_cli.hincrby("student", "age", amount=2)  # 自增,若不存在则以amount为初始值,amount可以是负数
# 多次取值,避免撑爆内存,match过滤,count每次最大取出key的个数,当返回的cursor为0说明已取完
cursor1, data1 = redis_cli.hscan('student', cursor=0, match=None, count=None)
cursor2, data2 = redis_cli.hscan('student', cursor=cursor1, match=None, count=None)
redis_cli.hscan_iter("student", match=None, count=None)  # 取出所有key,但返回的是一个生成器
6.List
redis_cli.lpush("names", "pan", "chen", "liu")  # 从左边插入,即得到'liu'、'chen'、'pan',key不存在则创建
redis_cli.lpushx("names", "pan", "chen", "liu")  # 同上,但key不存在不会创建
redis_cli.rpush("names", "a", "b", 3)  # 从右边插入

redis_cli.lrange("names", 0, -1)  # 取出names的所有元素(左闭右闭),返回列表
redis_cli.llen("names")  # 返回元素个数
redis_cli.lindex("names", 1)  # 根据下标取值

redis_cli.rpush("names", "a", "b", "c", "d", "e")
redis_cli.linsert("names", "before", "c", "c0")  # 在c之前插入c0,也可以是after
redis_cli.lset("names", 2, "c00")  # 修改第2个元素为c00
redis_cli.lrem("names", count=2, value="c00")  # count为删除的个数,正数是从从前往后,负数是从后往前,0则删除所有
redis_cli.lpop("names")  # 删除并返回左边1个
redis_cli.rpop("names")  # 删除并返回右边1个
redis_cli.ltrim("names", 2, 3)  # 保留下标2到3之间的元素,两边的被删除
redis_cli.rpoplpush("names", "names2")  # 取出names的最右边的元素插入到names2的最左边
7.Set
redis_cli.sadd("names", "pan", "liu", "han", "song")  # 新增元素,返回新增个数,此处是3
redis_cli.sadd("names2", "pan", "liu", "li", "yuan")  # 新增元素,返回新增个数,此处是3

# 交集
redis_cli.sinter("names", "names2")  # 返回names和names2的交集,返回一个set
redis_cli.sinterstore("names3", "names", "names2")  # 把names和names2的交集存储到names3,返回一个已存储个数
# 并集
redis_cli.sunion("names", "names2")  # 返回names和names2的并集,返回一个set
redis_cli.sunionstore("names3", "names", "names2")  # 把names和names2的并集存储到names3,返回一个已存储个数
# 差集
redis_cli.sdiff("names", "names2")  # 返回在names且不在names2的元素,返回一个set
redis_cli.sdiff("names2", "names")  # 返回在names2且不在names的元素,返回一个set
redis_cli.sdiffstore("names3", "names", "names2")  # 把在names且不在names2中的元素存储到names3,返回已存储个数

redis_cli.scard("names")  # 获取元素个数
redis_cli.sismember("names", "pan")  # 查询某个元素是否存在
redis_cli.smembers("names")  # 返回所有元素,返回一个set
redis_cli.scan_iter("names")  # 返回所有元素,返回一个生成器

redis_cli.spop("names")  # 随机删除并返回一个元素
redis_cli.srem("names2", "li")  # 删除指定元素li,返回已删除个数
8.Zset
redis_cli.zadd("names", {"pan": 111, "liu": 2, "yun": 99})  # 新增元素,字典的key、value分别对应zset的value、score

redis_cli.zrange("names", 1, 3, desc=False, withscores=False)  # 取出下标从1到3的元素正序排序,不需要分数
redis_cli.zscan("names")  # 取出所有元素,返回列表
redis_cli.zscan_iter("names")  # 取出所有元素返回一个生成器
redis_cli.zcount("names", 50, 100)  # 返回分数在50到100之间的元素个数
redis_cli.zrank("names", "liu")  # 返回元素liu的下标(从小到大排序)
redis_cli.zscore("names", "pan")  # 返回元素pan对应的分数
redis_cli.zincrby("names", 2.0, "pan")  # 将pan的分数自增2

redis_cli.zrem("names", "liu")  # 删除单个元素
redis_cli.zremrangebyrank("names", 1, 3)  # 删除下标在1到3之间的元素
redis_cli.zremrangebyscore("names", 50, 100)  # 删除分数在50到100之间的元素
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐