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之间的元素
更多推荐
【redis】使用python操作redis
发布评论