python 操作redis redis类

 

1.redis类

redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

2.样例

连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型

import redis 
# 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 
r = redis.Redis(host='localhost', port=6379, decode_responses=True) 
# host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379 
r.set('name', 'junxi') 
# key是"foo" value是"bar" 将键值对存入redis缓存 
print(r['name']) 
print(r.get('name')) 
# 取出键name对应的值 
print(type(r.get('name')))

3.redis连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。

可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池

连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作

import redis 
# 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) 
# host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379 
r = redis.Redis(connection_pool=pool) 
r.set('gender', 'male') 
# key是"gender" value是"male" 将键值对存入redis缓存 
print(r.get('gender')) 
# gender 取出键male对应的值

总结:我们每一个redis步骤是需要建立新的连接的,在创建实例时,是没有真正去连接redis的,例如事例中,真正的连接redis部分在set等命令中,这样会造成频繁操作redis连接会降低性能,而使用connection pool 会在原有基础上获取可用连接,这样就不用去创建新的连接,当然如果没有连接,他仍然会创建新的连接,但相比每次都创建一个redis连接,然后又销毁,肯定性能上优异了不少。

4.基本命令(string):

set(name, value, ex=None, px=None, nx=False, xx=False)

参数:

ex,过期时间(秒)

px,过期时间(毫秒)

nx,如果设置为True,则只有name不存在时,当前set操作才执行

xx,如果设置为True,则只有name存在时,当前set操作才执行



setnx(name, value)

setex(name, value, time)

psetex(name, time_ms, value) 设置值

mset(*args, **kwargs) 批量设置值

mget(keys, *args) 批量获取

getset(name, value) 设置新值并获取原来的值

getrange(key, start, end) 获取子序列(根据字节获取,非字符)

setrange(name, offset, value) 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)

setbit(name, offset, value) 对name对应值的二进制表示的位进行操作

getbit(name, offset)

bitop(operation, dest, *keys)

strlen(name) 返回name对应值的字节长度(一个汉字3个字节)

incr(self, name, amount=1) 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。同incrby

incrbyfloat(self, name, amount=1.0) 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

decr(self, name, amount=1) 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

append(key, value) 在redis name对应的值后面追加内容

5.基本命令 hash

hset(name, key, value) 没有就增加,有就修改

hsetnx(name, key, value) 只是添加新值

hmset(name, mapping) 批量增加

hget(name,key) 取出对应的value

hmget(name, keys, *args)

hgetall(name) 取出所有键值对

hlen(name) 获取name对应的hash中键值对的个数

hkeys(name) 获取所有的keys

hvals(name) 获取所有的值

hexists(name, key) 判断key是否存在

hdel(name,*keys) 将name对应的hash中指定key的键值对删除

hincrby(name, key, amount=1) 自增自减整数(将key对应的value--整数 自增1或者2,或者别的整数 负数就是自减)

hincrbyfloat(name, key, amount=1.0) 自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者别的浮点数 负数就是自减)

hscan(name, cursor=0, match=None, count=None) 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而防止内存被撑爆

hscan_iter(name, match=None, count=None) 利用yield封装hscan创建生成器,实现分批去redis中获取数据

6.基本命令 list

lpush(name,values)

在name对应的list中添加元素,每个新的元素都添加到列表的最左边

rpush(name,values)

lpushx(name,value) 往已经有的name的列表的左边添加元素,没有的话无法创建

rpushx(name,value)

linsert(name, where, refvalue, value)) 新增(固定索引号位置插入元素)

name,redis的name

where,BEFORE或AFTER

refvalue,标杆值,即:在它前后插入数据

value,要插入的数据

r.lset(name, index, value) 修改(指定索引号进行修改)

r.lrem(name, value, num)

lpop(name) 删除并返回

rpop(name)

ltrim(name, start, end) 删除索引之外的值

lindex(name, index) 取值(根据索引号取值)

rpoplpush(src, dst) 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边

brpoplpush(src, dst, timeout=0) 移动 元素从一个列表移动到另外一个列表 可以设置超时

blpop(keys, timeout) 一次移除多个列表

7.基本命令 set

sadd(name,values)

scard(name) 获取元素个数 类似于len

smembers(name) 获取集合中所有的成员

sscan(name, cursor=0, match=None, count=None) 获取集合中所有的成员--元组形式

sscan_iter(name, match=None, count=None) 获取集合中所有的成员--迭代器的方式,避免内存消耗太大

sdiff(keys, *args) 差集

sdiffstore(dest, keys, *args) 差集--差集存在一个新的集合中

sinter(keys, *args) 交集

sinterstore(dest, keys, *args) 交集--交集存在一个新的集合中

sunion(keys, *args) 并集

sunionstore(dest,keys, *args) 并集--并集存在一个新的集合

sismember(name, value) 判断是否是集合的成员 类似in

smove(src, dst, value) 将某个成员从一个集合中移动到另外一个集合

spop(name) 删除--随机删除并且返回被删除值

srem(name, values) 删除--指定值删除

8.基本命令 有序set

对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序

zadd(name, *args, **kwargs) 在name对应的有序集合中添加元素

zcard(name) 获取有序集合元素个数 类似于len

r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

按照索引范围获取name对应的有序集合的元素

参数:

name,redis的name

start,有序集合索引起始位置(非分数)

end,有序集合索引结束位置(非分数)

desc,排序规则,默认按照分数从小到大排序

withscores,是否获取元素的分数,默认只获取元素的值

score_cast_func,对分数进行数据转换的函数

zrevrange(name, start, end, withscores=False, score_cast_func=float) 从大到小排序(同zrange,集合是从大到小排序的)

zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float) 按照分数范围获取name对应的有序集合的元素

zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float) 按照分数范围获取有序集合的元素并排序(默认从大到小排序)

zscan(name, cursor=0, match=None, count=None, score_cast_func=float) 获取所有元素--默认按照分数顺序排序

zscan_iter(name, match=None, count=None,score_cast_func=float) 获取所有元素--迭代器

zcount(name, min, max) 获取name对应的有序集合中分数 在 [min,max] 之间的个数

zincrby(name, value, amount) 自增name对应的有序集合的 name 对应的分数

zrank(name, value) 获取某个值在 name对应的有序集合中的索引(从 0 开始)

zrevrank(name, value),从大到小排序

zrem(name, values) 删除--指定值删除

zremrangebyrank(name, min, max) 删除--根据排行范围删除,按照索引号来删除

zremrangebyscore(name, min, max) 删除--根据分数范围删除

zscore(name, value) 获取值对应的分数

9.其他操作

delete(*names) 根据删除redis中的任意数据类型(string、hash、list、set、有序set)

exists(name) 检测redis的name是否存在,存在就是True,False 不存在

keys(pattern='') 模糊匹配

expire(name ,time) 设置超时时间

rename(src, dst) 对redis的name重命名

randomkey() 随机获取name

type(name) 获取类型

scan(cursor=0, match=None, count=None) 查看所有元素

scan_iter(match=None, count=None) 查看所有元素--迭代器

10.其他

管道(pipeline)

redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,

如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。

 

 

import redis

import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

r = redis.Redis(connection_pool=pool)

# pipe = r.pipeline(transaction=False) 
# 默认的情况下,管道里执行的命令可以保证执行的原子性,执行pipe = r.pipeline(transaction=False)可以禁用这一特性。

# pipe = r.pipeline(transaction=True)

pipe = r.pipeline() # 创建一个管道

pipe.set('name', 'jack')

pipe.set('role', 'sb')

pipe.sadd('faz', 'baz')

pipe.incr('num') # 如果num不存在则vaule为1,如果存在,则value自增1 pipe.execute() print(r.get("name")) 
print(r.get("role")) 
print(r.get("num"))





pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute() 
print(r.get("name")) 
print(r.get("role")) 
print(r.get("num"))

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值