Python操作redis
一:安装
pip install redis
二:连接使用
(1)特点:
(1):redis通过提供redis 以及StrictRedis两个类实现用于redis的操作
(2):StrictRedis用于实现大部分官方命令,并使用官方的语法和命令
(3):Redis是StrictRedis的子类,用于向前兼容redis.py
(2)使用案例:
import redis # 导入redis模块 redis_obj = redis.Redis(host='127.0.0.1',port=6379) # 创建redis连接 默认端口6379 redis_obj.set('name','SR') # 设置值 res = redis_obj.get('name') # 获取值 print(res) # b'SR' 二进制类型
PS:获取值属于byte类型 如果需要字符串需要进行转码
(3)连接池:
(1):connection pool来管理对一个redis server的所有连接
(2):避免每次释放 建立连接 消耗资源
(3):其通过每次预先创建连接 当有redis进行操作的时候 其直接使用以及预连接的redis服务
(4):操作结束之后 其不会释放redis连接 留作备用
(4)使用案例
import redis # 生成一个连接池子 redis_obj = redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=10) # 创建连接 res = redis.StrictRedis(connection_pool=redis_obj,decode_responses=True) # decode_responses=True 存入的数据是字符串 res.set('name', 'SR') print(res.get('name'))
三:String操作
set操作:
set(name, value, ex=None, px=None, nx=False, xx=False), 参数ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value) xx,如果设置为True,则只有name存在时,当前set操作才执行 setnx(name,value),则只有name不存在时,当前set操作才执行 setex(name, value, time),设置过期时间(秒) psetex(name, time_ms, value),设置过期时间(毫秒) r.mset(name1='zhangsan', name2='lisi'),批量设置 setrange(name,offset,value):用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。如果新值太长时,则向后添加 append(key, value):在redis_name对应的值后面追加内容 setbit(name, offset, value),对二进制表示位进行设置
r.set("name","zhangsan") r.setrange("name",1,"z") print(r.get("name")) #输出:zzangsan r.setrange("name",6,"zzzzzzz") print(r.get("name")) #输出:zzangszzzzzzz
get操作:
mget(keys,*args)
getset(name, new_value),在设置旧值的同时获取新值
getrange(key, start, end),获取设置值的子序列
getbit(name, offset), 获取name对应值的二进制中某位的值(0或1)
strlen(name),获取name对应的字节长度,一个汉字三个字节。
r.set("name","zhangsan") print(r.getrange("name",0,3))#输出:zhan
四:Hash操作
set操作
hset(name, key, value),name对应的hash中设置一个键值对,没有则创建,有则修改
r.hset('hkey', 'name', 'zhangsan')
hmset(name, mapping),在name对应的hash中批量设置键值对
dict = {"a1":"aa", "b1":"bb"} r.hmset('dict_name', dict)
hsetnx(name, key, value),只有当key不存在时,set操作才成立。
dict = {"a1":"aa", "b1":"bb"} r.hsetnx('dict_name', "a1", "bb") print r.hget('dict_name', "a1") # 输出结果:aa r.hsetnx('dict_name', "c1", "cc") print r.hget('dict_name', "c1") # 输出结果:cc
get操作:
hget(name, key)
r.hget('userinfo', 'name')
hmget(name, keys, *args),获取name对应的包含多个hash值的列表。
li = ["a1", "b1"] print r.hmget('dict_name', li) # 输出结果:['aa', 'bb'] print r.hmget('dict_name', "a1", "b1") # 输出结果:['aa', 'bb']
hgetall(name),获取name对应的hash的左右键值
print r.hgetall('dict_name') # 输出结果:{'a1': 'aa', 'b1': 'bb'}
hlen(name),获取name对应hash中的键的个数
hkeys(name),获取name对应hash中所有的键
hvals(name),获取name对应hash中的所有的值
-
print r.hlen('dict_name') # 输出结果:2
-
print r.hkeys('dict_name') # 输出结果:['a1', 'b1']
-
print r.hvals('dict_name') # 输出结果:['aa', 'bb']
hexists(name, key),检查name对应的hash中是否存在传入的key值
print r.hexists('dict_name', "a1") # 输出结果:True
hdel(name, *keys),删除制定的name对应的hash中传入的key对应的键值对
r.hdel("dic_name","a1")
五:List操作
设置操作:
lpush(name, values),在那么对应的list中添加元素,每个新元素都添加到列表的左侧
r.lpush('list_name', 2) r.lpush('list_name', 3, 4, 5) print r.lrange('list_name', 0, -1) # 输出:['5', '4', '3', '2']
rpush(name, values),在那么对应的list中添加元素,每个新元素都添加到列表的右侧
lpushx(name, value),只有name已经存在时,值添加到列表的左侧
rpushx(name, value),只有name已经存在时,值添加到列表的右侧
linsert(name, where, refvalue, value),在name对应的列表前或后插入一个新值
参数:
name:redis的name
where: BEFORE(前)或AFTER(后)
refvalue: 列表内的值
value: 要插入的数据
r.linsert('list_name', "BEFORE", 2, "ss") # 在列表内找到第一个元素2,在它前面插入ss print r.lrange('list_name', 0, -1) # 输出:['5', '4', '3', 'ss', '2']
获取操作:
lrange(name, start, end),获取name对应的start和end范围内的list,lrange(name,0,-1)表示获取全部
llen(name),获取name对应的list中元素的个数
lpop(name),移除name所对应的list中左侧所对应的第一个元素,并将其返回
rpop(name),移除name所对应的list中右侧所对应的第一个元素,并将其返回
ltrim(name, start, end),移除列表内没有在所给的索引之间的值
lindex(name, index),根据所给的索引位置获取对应位置的元素
lrem(name, value, rem),删除name所对应的list中的指定值
参数
name: redis的name
value: 要删除的值
num: num=0 删除列表中所有的指定值; num=2 从前到后,删除2个;num=-2 从后向前,删除2个
r.lrem('list_name', "ss", num=0) print r.lrange('list_name', 0, -1) # 输出:['bbb', '4', '3', '2']
lpop(name),移除name所对应的list中左侧所对应的第一个元素,并将其返回
rpop(name),移除name所对应的list中右侧所对应的第一个元素,并将其返回
ltrim(name, start, end),移除列表内没有在所给的索引之间的值
lindex(name, index),根据所给的索引位置获取对应位置的元素
六:Set操作
设置操作:
sadd(name, values):向制定的set中添加值
r.sadd("set_name", "aa") r.sadd("set_name", "aa", "bb") # 重复值设置不进去 print r.smembers("set_name") # 输出:set(['aa', 'bb'])
获取操作:
smembers(name),获取制定的set中的左右值
scard(name),获取name对应的集合中的元素个数
sismember(name, value),检查value是否是name对应的集合内的元素
srem(name, values),删除name对应的集合中的某些值
集合操作
diff(keys, *args),在第一个name对应的集合中且不在其他name对应的集合的元素集合
r.sadd("set_name", "aa", "bb") r.sadd("set_name1", "bb", "cc") r.sadd("set_name2", "bb", "cc", "dd") print r.sdiff("set_name", "set_name1", "set_name2") # 输出:set(['aa'])
sdiffstore(dest, keys, *args),相当于把sdiff获取的值加入到dest对应的集合中
sinter(keys, args),获取多个name对应集合的交集
r.sadd("set_name", "aa", "bb") r.sadd("set_name1", "bb", "cc") r.sadd("set_name2", "bb", "cc", "dd") print r.sinter("set_name", "set_name1", "set_name2") # 输出:set(['bb'])
sinterstore(dest, keys, *args),返回值放到dest集合中
sunion(keys, *args),获取多个集合的并集
r.sadd("set_name", "aa", "bb") r.sadd("set_name1", "bb", "cc") r.sadd("set_name2", "bb", "cc", "dd") print r.sunion("set_name", "set_name1", "set_name2") # 输出:set(['cc', 'aa', 'dd', 'bb'])
七:Zset操作
添加操作:
zadd(name, *args, **kwargs),向有序集合中添加参数
r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) # 同r.zadd('zset_name', b1=10, b2=5) print r.zrange("zset_name", 0, -1, desc=False, withscores=False, score_cast_func=float) # 输出:['a2', 'a3', 'a1']
zincrby(name, value, amount),自增有序集合内value对应的分数 ,amount为增加量,这个函数只会影响后面的score,但是删除这个函数后原来的score不变。
r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) r.zincrby("zset_name", "a3", amount=2) # 让a3的score增加2,影响下面的数据展示 print r.zrange("zset_name", 0, -1, desc=False, withscores=True, score_cast_func=float) # 输出:[('a2', 3.0), ('a1', 6.0), ('a3', 7.0)] r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) # r.zincrby("zset_name", "a3", amount=2) 取消操作后,结果不变 print r.zrange("zset_name", 0, -1, desc=False, withscores=True, score_cast_func=float) # 输出:[('a2', 3.0), ('a3', 5.0), ('a1', 6.0)]
获取操作:
zrange( name, start, end, desc=False, withscores=False, score_cast_func=float),按索引范围获取集合
参数
name redis的name
start 有序集合索引起始位置
end 有序集合索引结束位置
desc 排序规则,默认按照分数从小到大排序
withscores 是否获取元素的分数,默认只获取元素的值
score_cast_func 对分数进行数据转换的函数
zrem(name, values),删除值是values的成员
r.zrem("zset_name", "mongodb", "rabitmq", "redis")
zremrangebyrank(name, min, max),根据排行范围进行删除
zremrangebyscore(name, min, max),根据分数范围进行删除
zcard(name),获取元素的数量
zcount(name, min, max),获取有序集合中score在[min,max]之间的元素的个数
zscore(name, value),获取对应value的score
排序操作:
zrevrange(name, start, end, withscores=False, score_cast_func=float),从大到小排序
r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) print r.zrank("zset_name", "a1") # 从小到大,输出2 print r.zrevrank("zset_name", "a1") # 从大到小,输出0
zrank(name, value)、zrevrank(name, value),获取value在有序集合中的排序位置,从0开始
r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) print r.zrank("zset_name", "a1") # 从小到大,输出2 print r.zrevrank("zset_name", "a1") # 从大到小,输出0
集合操作:
zinterstore(dest, keys, aggregate=None),获取两个有序集合的交集并放入dest集合,如果遇到相同值不同分数,则按照aggregate进行操作,aggregate的值为: SUM MIN MAX 。
r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5) r.zadd("zset_name1", a1=2, b1=5, b2=7) r.zinterstore("zset_name2", ("zset_name", "zset_name1"), aggregate="MAX") print r.zscan("zset_name2") #输出:(0L, [('a1', 6.0)])
zunionstore(dest, keys, aggregate=None),并集,其他同交集。
九:其他操作
delete(*names),根据name删除任意redis数据类型 exists(name),检测name是否存在,返回True或False keys(pattern='*'),根据* ?等通配符匹配获取redis的name
print r.keys(pattern='*set*') # 输出:['set_name', 'zset_name', 'zset_name1', 'set_name2', 'zset_name2', 'set_name1']
expire(name, time),设置超时时间
rename(src, dst),重命名
move(name, db),将redis的某个值移动到指定的db下
randomkey(),随机获取一个redis的name(不删除)
type(name),指定name的redis数据类型