共计 10054 个字符,预计需要花费 26 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章给大家分享的是有关浅谈 Python 安装并使用 redis 模块的方法的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
安装和使用
安装
安装 redis 模块
pip3 install redis
普通连接
redis-py 提供两个类 Redis 和 StrictRedis 用于实现 Redis 的命令,StrictRedis 用于实现大部分官方的命令,并使用官方的语法和命令,Redis 是 StrictRedis 的子类,用于向后兼容旧版本的 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))
连接池
redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。默认,每个 Redis 实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池
连接池:redis_pool.py
from redis import ConnectionPool
POOL=ConnectionPool(host= 127.0.0.1 ,port=6379,max_connections=100)
使用连接池:test_redis.py
import redis
from redis_pool import POOl
conn = redis.Redis(connection_pool=POOl)
conn.set(name , LinWOW)
print(conn.get( name))
构造 url 方式连接到数据库,有以下三种模式:
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 连接
Python 操作 RedisString 操作方法作用示例示例结果 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’)Trueget(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,第二次 Falsesetex(name, time, value)设置可以对应的值为 string 类型的 value,并指定此键值对应的有效期 redis.setex(‘name’, 1,‘James’)Truesetrange(name, offset, value)设置指定 key 的 value 值的子字符串 redis.set(‘name’,‘Hello’) redis.setrange(‘name’, 6,‘World’)11,修改后的字符串长度 mset(mapping)批量赋值 redis.mset({‘name1’:‘Durant’,‘name2’:‘James’})Truemsetnx(mapping)key 均不存在时才批量赋值 redis.msetnx({‘name3’:‘Smith’,‘name4’:‘Curry’})Trueincr(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’Key 操作方法作用示例示例结果 exists(name)判断一个 key 是否存在 redis.exists(‘name’)Truedelete(name)删除一个 keyredis.delete(‘name’)1type(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’)Truedbsize()获取当前数据库中 key 的数目 dbsize()100expire(name, time)设定 key 的过期时间,单位秒 redis.expire(‘name’, 2)Truettl(name)获取 key 的过期时间,单位秒,- 1 为永久不过期 redis.ttl(‘name’)-1move(name, db)将 key 移动到其他数据库 move(‘name’, 2)Trueflushdb()删除当前选择数据库中的所有 keyflushdb()Trueflushall()删除所有数据库中的所有 keyflushall()TrueList 操作方法作用示例示例结果 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’)4lrange(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)Truelindex(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)Truelrem(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= 127.0.0.1 ,port=6379)
# conn.lpush(test ,*[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( test ,0,100))
for item in scan_list(test ,5):
print(---)
print(item)
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’)Truescard(name)返回 key 为 name 的 set 的元素个数 redis.scard(‘tags’)3sismember(name, value)测试 member 是否是 key 为 name 的 set 的元素 redis.sismember(‘tags’,‘Book’)Truesinter(keys, *args)返回所有给定 key 的 set 的交集 redis.sinter([‘tags’,‘tags2’]){b’Coffee’}sinterstore(dest, keys, *args)求交集并将交集保存到 dest 的集合 redis.sinterstore(‘inttag’, [‘tags’,‘tags2’])1sunion(keys, *args)返回所有给定 key 的 set 的并集 redis.sunion([‘tags’,‘tags2’]){b’Coffee’, b’Book’, b’Pen’}sunionstore(dest, keys, *args)求并集并将并集保存到 dest 的集合 redis.sunionstore(‘inttag’, [‘tags’,‘tags2’])3sdiff(keys, *args)返回所有给定 key 的 set 的差集 redis.sdiff([‘tags’,‘tags2’]){b’Book’, b’Pen’}sdiffstore(dest, keys, *args)求差集并将差集保存到 dest 的集合 redis.sdiffstore(‘inttag’, [‘tags’,‘tags2’])3smembers(name)返回 key 为 name 的 set 的所有元素 redis.smembers(‘tags’){b’Pen’, b’Book’, b’Coffee’}srandmember(name)随机返回 key 为 name 的 set 的一个元素,但不删除元素 redis.srandmember(‘tags’)
Sorted Set 操作方法作用示例示例结果 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’)1zrevrank(name, value)返回 key 为 name 的 zset 中元素的倒数排名(按 score 从大到小排序)即下标 redis.zrevrank(‘grade’,‘Amy’)2zrevrange(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)2zcard(name)返回 key 为 name 的 zset 的元素个数 redis.zcard(‘grade’)3zremrangebyrank(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,即删除的元素个数 Hash 操作方法作用示例示例结果 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’)5hmget(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})Truehincrby(name, key, amount=1)将 key 为 name 的 hash 中映射的 value 增加 amountredis.hincrby(‘price’,‘apple’, 3)6,修改后的值 hexists(name, key)key 为 namehash 中是否存在键名为 key 的映射 redis.hexists(‘price’,‘banana’)Truehdel(name, *keys)key 为 namehash 中删除键名为 key 的映射 redis.hdel(‘price’,‘banana’)Truehlen(name)从 key 为 name 的 hash 中获取映射个数 redis.hlen(‘price’)6hkeys(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(xx , cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan(xx , cursor=cursor1, match=None, count=None)
...
直到返回值 cursor 的值为 0 时,表示数据已经通过分片获取完毕
hscan_iter(name, match=None, count=None):利用 yield 封装 hscan 创建生成器,实现分批去 redis 中获取数据
参数: match,匹配指定 key,默认 None 表示所有的 key
count,每次分片最少获取个数,默认 None 表示采用 Redis 的默认分片个数
如: for item in r.hscan_iter(xx):
print item
管道
redis-py 默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用 pipline 实现一次请求指定多个命令,并且默认情况下一次 pipline 是原子性操作。
import redis
pool = redis.ConnectionPool(host= 10.211.55.4 , port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set(name , linwow)
pipe.set(age , 18)
pipe.execute()
Django 中使用 redis
方式一:
utils 文件夹下,建立 redis_pool.py
import redis
POOL = redis.ConnectionPool(host= 127.0.0.1 , port=6379,password= 1234 ,max_connections=1000)
视图函数中使用:
import redis
from django.shortcuts import render,HttpResponse
from redis_pool import POOL
def index(request):
conn = redis.Redis(connection_pool=POOL)
conn.hset(liwow , age ,18)
return HttpResponse(设置成功)
def order(request):
conn = redis.Redis(connection_pool=POOL)
conn.hget(kkk , age)
return HttpResponse(获取成功)
方式二:
安装 django-redis 模块
pip3 install django-redis
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 ,
}
}
}
视图函数:
from django_redis import get_redis_connection
conn = get_redis_connection(default)
print(conn.hgetall( xxx))
python 主要应用领域有哪些
1、云计算,典型应用 OpenStack。2、WEB 前端开发,众多大型网站均为 Python 开发。3. 人工智能应用,基于大数据分析和深度学习而发展出来的人工智能本质上已经无法离开 python。4、系统运维工程项目,自动化运维的标配就是 python+Django/flask。5、金融理财分析,量化交易,金融分析。6、大数据分析。
感谢各位的阅读!关于“浅谈 Python 安装并使用 redis 模块的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
向 AI 问一下细节