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中的所有的值

  1. print r.hlen('dict_name') # 输出结果:2
  2. print r.hkeys('dict_name') # 输出结果:['a1', 'b1']
  3. 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数据类型
原文地址:https://www.cnblogs.com/SR-Program/p/12422578.html