python操作redis,看这篇就够了
前言
对于后端来说,使用Redis的频率很高,我们会用redis配合MySQL做缓存用,也会用redis实现简单的消息队列。对于初学者来说,需要知道Redis如何使用,然后才是深入了解Redis的原理和注意点。这篇就来总结一下在Python中如何使用Redis吧。
redis的连接
Redis的连接通常有2种方式,可分为普通连接和连接池的连接方式。
- 普通连接
import redis
red = redis.Redis(host='{host}', port={port}, password={pwd}, db = {db})
- 连接池方式
import redis
pool = redis.ConnectionPool(host='{host}', port={port}, password={pwd}, db = {db})
r = redis.Redis(connection_pool=pool)
redis的操作
Redis有多种丰富的数据类型,以满足我们不同场景的使用。主要有string、hash、list、set、sortedset等,下面介绍下常用的操作。
通用操作
- exists(key) 查看key是否存在
- expire(key, second) 对key设置过期时间
- del(key) 删除key
1. string
字符串的使用比较简单,一个key对应一个value。
string写入数据
写入单个数据用get()
方法,批量写数据用mset()
方法。
set写单个数据
用法为:set(key, value, ex=None, px=None, nx=False, xx=False)
- ex:过期时间(秒)
- ps:过期时间(毫秒),一般用ex即可
- nx:设置为True时,只有key不存在才会写入。
- xx:设置为True时,只有key存在才会写入。
set默认不检查库中的key是否存在,如果key存在,不加nx参数的话会覆盖数据。
示例:
red.set('name', 'YaoMing')
# 设置一个小时后过期
red.set('name', 'YaoMing', ex=3600)
mset批量写数据
用法:mset(*args, **kwargs)
使用时多使用字典的形式传值
示例:
str_dic = {
"name": "YaoMing",
"name1": "Yi"
}
red.mset(str_dict)
string获取数据
和写入类似,有获取单个get()
和批量获取mget()
方法。直接看例子:
# 获取单个数据
val = red.get("name")
# 批量获取
vals = red.mget(['name', 'name1'])
2. hash
hash也是高频使用的数据类型,使用上除了读写,还有键值对个数获取hlen()
、键获取hkeys()
、值获取hvals()
等用法。
hash写入
和string写入类型,也有单个键值对写入和批量写入。
用法:hset(name, key, value)
hmset(name, mapping)
看例子:
# 单个写入(res返回的是写入成功的个数)
res = red.hset('nba', 'name', 'Curry')
# 批量写入(res返回的是bool类型)
res1 = red.hmset('nba', {'name': 'Curry', 'age': 34})
hash读取
读取有多种用法,分别是:
- hget(name, key) 获取指定key的value
- hmget(name, keys, *args) 获取多个键值对的value
- hgetall(name) 获取哈希的所有键值对
- hlen(name) 获取哈希中键值对的个数
- hkeys(name) 获取哈希中所有的键
- hvals(name) 获取哈希中所有的值
操作例子:
# 获取name的value
val = red.hget('nba', 'name')
# 获取多个键的value
vals = red.hmget('nba', ['name', 'age'])
# 获取nba的所有键值对
val = red.hgetall('nba')
# 获取键值对个数
len = red.hlen('nba')
# 获取所有键
keys = red.hkeys('nba')
# 获取所有值
vals = red.hvals('nba')
hash其他操作
除了上述常规操作,hash还有如检查键是否存在hexists()
、对自增key加减hincrby()
等操作。
- hexists(name, key) 判断是否有key
- hdel(name, *keys) 删除键值对
- hincrby(name, key, amount=1) 对自增key加减
# 判断nba中是否有name键
res = red.hexists('nba', 'name')
# 删除age键值对
res = red.hdel('nba', 'age')
# 对age键加1(如果要减就传负数)
res = red.hincrby('nba', 'age', 1)
3. List
list通常用作简单的队列,支持左边和右边操作列表。
- lpush/rpush(name, *values) 从列表左边/右边添加值。
- lpushx/rpushx(name, value) 只有键存在时,从左边/右边添加
- llen(name) 返回列表长度
- lindex(name, index) 通过索引获取值
- lrange(name, start, end) 获取区间内的值
- lpop/rpop(name) 删除左边/右边第一个值
- lrem(name, value, num=0) 删除列表中范围之外的所有值
- lpop/rpop(keys) 从列表左边/右边删除一个值并返回到客户端
- rpoplpush(name, name1) 从一个列表最右边删除一个值并将值添加到另一列表的最左边
操作都比较常规,主要说说rpoplpush。因pop后列表就没有该值了,为确保值被客户端成功消费,可以将pop出来的值插入到另一个列表中,这样可降低pop的值未消费成功的概率。
res = res.rpoplpush('alist', 'blist')
4. set
顾名思义,set中的元素不能重复,通常我们会用来过滤数据。
- sadd(name, *values) 插入元素
- scard(name) 获取元素个数
- smembers(name) 获取所有元素
- srem(name, *values) 删除一个或多个元素
- sdiff(keys, *args) 返回在集合a中但不在其他集合的元素
- sunion(keys, *args) 返回一个集合与其他集合的并集
- sunionstore(name, keys, *args) 返回一个集合与其他集合的并集,并存到另一集合中
set很多时候会用来过滤和聚合操作,比如sunion操作就可以取2个集合的并集。
res = red.sunion('aset', 'bset')
5. zset
zset和set的区别就是zset是有序的,解决了set无序的问题。我们可以对集合的元素设置权重score,这样在使用时就能直接对权重过滤,达到类似list取下标的操作。
- zadd(name, *args, **kwargs) 添加元素
- zcard(name) 返回集合中的元素个数
- zcount(name, min, max)返回score范围的元素个数
- zscore(name, value) 返回元素的分数
- zrange(name, start, end, desc, withscores) 返回集合内的数据,可设置分数和排序
- zremrangebyrank(name, min, max) 删除分数范围内的元素
# 返回score 3-10之间的元素
res = red.zrange('zset1', 3, 10)
小结
本篇总结了Python对redis的一些基本操作,我们在使用redis时,需熟悉各个数据类型的运用场景及使用方法,这样才能更好的将redis利用起来。
- 点赞
- 收藏
- 关注作者
评论(0)