Redis的基本操作
Posted surpass_w
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的基本操作相关的知识,希望对你有一定的参考价值。
Redis的基本操作
redis普通连接与连接池
# 安装redis模块
pip install redis
# 普通连接
from redis import Redis
# 创建连接对象
conn = Redis(host=‘localhost‘, port=6379)
ret = conn.get(‘name‘)
python操作之连接池
# redis使用connection pool来管理对一个redis Server的所有连接,以避免每次建立,释放连接的开销。
import redis
POOL = redis.ConnectionPool(host=‘127.0.0.1‘,port=6379)
ret = redis.Redis(connection_pool=POOL)
ret.set(‘name‘,‘cherry‘)
print(ret.get(‘name‘))
# 单例的实现
# redis_pool.py
import redis
POOL = redis.ConnectionPool(host=‘127.0.0.1‘,port=6379,max_connections=100) # z造一个池子,最多创建100个连接
ret = redis.Redis(connection_pool=POOL) # 从连接池中取出一个连接
单例实现方式(模块导入)
redis_pool.py
import redis
POOL = redis.ConnectionPool(host=‘127.0.0.1‘,port=6379,max_connections=100) # z造一个池子,最多创建100个连接
这样就可以避免每执行一次,就创建一个连接池
# 使用方式(包导入)
from redis_pool import POOL
import redis
ret = redis.Redis(connection_pool=POOL) # 从连接池取出一个连接
?注意
如果是运行包内的文件,在该文件导入包内的文件时,注意不能用‘.’;
在外部使用可以带点
redis之字符串的操作
重点掌握
set操作
def set(self, name, value,ex=None, px=None, nx=False, xx=False, keepttl=False):
ex: 过期时间( 秒)
px: 过期时间(毫秒)
nx: 如果设置为True, 当name不存在的时候,set操作才会执行;如果存在,则不会执行。(新增操作)
xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值。(更新操作)
exp:
conn.set(‘perfect‘,‘surpass‘,ex=5) # 设置过期时间5秒
conn.set(‘sex‘,‘Female‘,nx=True) # key不存在创建,存在不做任何操作
conn.set(‘name‘,‘cherry1‘,xx=True) # key存在才更新新值,不存在不做任何操作
get操作
# 获取值
name = conn.get(‘name‘)
mset操作
# 批量设置值
mset(self, mapping)
conn.mset({‘name1‘:‘egon‘,‘name2‘:‘lqz‘})
mget操作
# 批量获取值
mget(self, keys, *args):
ret = conn.mget([‘name1‘,‘name2‘,‘name3‘]) # [b‘egon‘, b‘lqz‘, None]
incr操作
# 应用场景,统计某网站的访问数量,页面的访问量,接口的访问量
ret = conn.incr(‘num‘,amount=1) # 只要一执行,数字就加1
decr操作
# 应用场景,设计秒杀
ret = conn.decr(‘num‘,amount=1)
等于
ret = conn.incr(‘num‘,amount=1)
了解
setnx(name,value) ==> set(name,value,nx=True)
setex(name,value,time) ==> set(name,value,ex=5)
psetx(name,time_ms,value) # 毫秒
# 先获取值在设置值,将两次IO操作变为1次
ret = conn.getset(‘name1‘,‘egon_dsb‘) # ret 是获取到的值
# 根据key截取字符串
ret = conn.getrange(‘name1‘,0,0) # b‘e‘
# 修改字符串内容,从指定字符串索引开始向后替换
ret = conn.setrange(‘name1‘,2,‘8888‘) # 从第三个位置开始替换后面的字符串
# 获取name对应的值的二进制表示中的某位的值 (0或1)
ret = conn.getbit(‘name1‘,9) # 1
# append
在redis name对应的值后面追加内容
ret = conn.append(‘num‘,‘oo‘)
redis之hash操作
重点掌握
hset操作
hset(self, name, key=None, value=None, mapping=None)
ret = conn.hset(‘beast‘,‘name‘,‘huangliang‘)
ret = conn.hset(‘beast‘,‘name‘,‘lqz‘) # 直接覆盖
hget操作
hget(self, name, key)
ret = conn.hget(‘beast‘,‘name2‘) # b‘lqz‘
hmget操作
# 支持传多个key ,或者传一个keys的列表
def hmget(self, name, keys, *args):
"Returns a list of values ordered identically to ``keys``"
args = list_or_args(keys, args)
return self.execute_command(‘HMGET‘, name, *args)
ret = conn.hmget(‘beast‘,‘name‘,‘name2‘)
ret = conn.hmget(‘beast‘,[‘name‘,‘name2‘])
hmset操作
# 批量设置多个值
conn.mset({‘name1‘:‘egon‘,‘name2‘:‘lqz‘})
hincrby操作
# 应用场景 个人博客文章的访问量
conn.hmset(‘blog‘:{‘第一篇博客‘:‘55‘,‘第二篇博客‘:‘66‘})
ret = conn.hincrby(‘blog‘,‘第一篇博客‘) # 点击一次,自增一次
hscan_iter操作
# 利用yield封装hscan创建生成器,实现分批去redis中获取数据
# 参数:
# match,匹配指定key,默认None 表示所有的key
# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
ret = conn.hscan_iter(‘hash3‘)
print(ret)
for i in ret:
print(i)
了解
# 获取name对应的hash中所有的key的值
ret = conn.hkeys(‘hash3‘)
# 获取name对应的hash中所有的value的值
ret = conn.hvals(‘hash3‘)
# 检查name对应的hash是否存在当前传入的key
ret = conn.hexists(‘hash3‘,‘key4‘) # 存在作为True,不存在则为False
# 将name对应的hash中指定key的键值对删除
ret = conn.hdel(‘hash3‘,‘key2‘) #
# 获取name对应的hash中键值对的个数
ret=conn.hlen(‘hash3‘)
redis之list操作
重点掌握
lpush操作
# 在name对应的List中添加元素,每个新元素都添加到列表的最左边
ret = conn.lpush(‘list1‘,1,2,3,4,5)
"""
实现队列
先进先出
"""
rpush操作
# 在name对应的List中添加元素,每个新元素都添加到列表的最右边
ret = conn.rpush(‘list1‘,777,888)
"""
实现堆栈
后进先出
"""
blpop操作
消息队列(生产者消费者模型)
# block,阻塞操作,可以写一个超时时间
# 应用场景:分布式爬虫
ret=conn.blpop(‘list1‘,timeout=10)
print(ret)
其他
# lpushx(name,value) 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
lpushx(‘list1‘,888)
# rpushx(name,value) 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边
rpushx(‘list1‘,999)
# llen(name) 统计一下name对应list的总长度
ret = conn.llen(‘list1‘)
# 在name对应的列表的某一个值前或后插入一个新值
ret = conn.linsert(‘list1‘,‘before‘,‘3‘,‘88887‘) # 在‘3’前面插入一条数据
ret = conn.linsert(‘list1‘,‘after‘,‘3‘,‘18887‘) # 在‘3’后面插入一条数据
# 对name对应的list中的某一个索引位置重新赋值
ret = conn.lset(‘list1‘,‘0‘,‘1111‘)
# 在name对应的list中删除指定的值
def lrem(self, name, count, value):
"""
The count argument influences the operation in the following ways:
count > 0: Remove elements equal to value moving from head to tail.
count < 0: Remove elements equal to value moving from tail to head.
count = 0: Remove all elements equal to value.
"""
return self.execute_command(‘LREM‘, name, count, value)
ret=conn.lrem(‘list1‘,2,‘5‘) # 从前往后删除两个5 (+ 从前往后)
ret=conn.lrem(‘list1‘,-1,‘5‘) # 从后往前删除1个5 (- 从后往前)
ret=conn.lrem(‘list1‘,0,‘5‘) # 删除所有5 (0-all)
# 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
ret = conn.lpop(‘list1‘)
# 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素
ret = conn.rpop(‘list1‘)
# 在name对应的列表中根据索引获取列表元素
ret = conn.lindex(‘list1‘,‘0‘) #取出索引为0的位置的值
# 对name对应的list进行切片取值
ret = conn.lrange(‘list1‘,‘0‘,‘2‘) #[b‘4‘, b‘88887‘, b‘3‘]
# 在name对应的列表中移除没有在start-end索引之间的值
ret = conn.ltrim(‘list1‘,‘0‘,‘2‘)
自定义增量迭代
# yield的应用场景
# 自定制分批取列表的数据
# 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
Redis之管道
# 在redis中使用管道来实现事务
事务的一致性:要么都成功,要么都失败
import redis
from xxx import POOL
conn = redis.Redis(connection_pool=POOL)
# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True) #开启事务
pipe.multi()
pipe.set(‘name‘, ‘alex‘)
pipe.set(‘role‘, ‘sb‘)
pipe.execute()
单例模式封装
import redis
POOL = redis.ConnectionPool(host=‘10.211.55.4‘, port=6379)
Redis的其它使用
# 删除操作
conn.delete(‘list1‘)
ret=conn.delete(‘hash1‘)
# 判断name是否存在
ret=conn.exists(‘hash2‘)
#根据模型获取redis的name
ret=conn.keys(‘cache*‘) #查询以cache开头的所有key
#为某个redis的某个name设置超时时间
ret=conn.expire(‘hash2‘,2)
# 获取name对应值的类型
ret=conn.type(‘name3‘)
ret=conn.type(‘test‘)
ret=conn.type(‘test‘)
以上是关于Redis的基本操作的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程