python-操作redis

本文详细介绍了如何使用Python的redis库连接和操作Redis,包括连接池的使用、基本命令如设置、获取、删除键值对,以及连接池、字符串操作、位操作、哈希、集合、有序集合等高级特性的使用方法,同时讲解了Redis的原子性和管道(pipeline)操作。
摘要由CSDN通过智能技术生成

1、redis连接

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,

并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

import redis 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

r = redis.Redis(host='192.168.19.130', port=6379) host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379

r.set('foo', 'Bar') key是"foo" value是"bar" 将键值对存入redis缓存

print r.get('foo') Bar 取出键foo对应的值

2、连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。

默认,每个Redis实例都会维护一个自己的连接池。

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

import redis 通过python操作redis缓存

pool = redis.ConnectionPool(host='192.168.19.130', port=6379) host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379

r = redis.Redis(connection_pool=pool)

r.set('foo', 'Bar') key是"foo" value是"bar" 将键值对存入redis缓存

print r.get('foo') Bar 取出键foo对应的值


3、redis基本命令_string

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

在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,当前set操作才执行

import redis 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

pool = redis.ConnectionPool(host='192.168.19.130', port=6379)

host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379

r = redis.Redis(connection_pool=pool) 创建实例

1 ex,过期时间(秒) 这里过期时间是3秒,3秒后p,键foo的值就变成None
r.set('foo', 'Bar',ex=3) key是"foo" value是"bar" 将键值对存入redis缓存
print r.get('foo') Bar 取出键foo对应的值

2 px,过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成None
r.set('foo', 'Bar',px=3) key是"foo" value是"bar" 将键值对存入redis缓存
print r.get('foo') Bar 取出键foo对应的值

3 nx,如果设置为True,则只有name不存在时,当前set操作才执行 (新建)
print(r.set('foo', 'Bar',nx=True)) None--已经存在
如果键foo已经存在,那么输出是True;如果键foo不存在,输出是None

4 xx,如果设置为True,则只有name存在时,当前set操作才执行 (修改)
print(r.set('foo1', 'Bar',xx=True)) True--已经存在
如果键foo已经存在,那么输出是None;如果键foo不存在,输出是True

5 setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加)
print(r.setnx("foo2","bar")) False--已经存在的话,无法执行

6 setex(name, value, time)
设置值
参数:
time,过期时间(数字秒 或 timedelta对象)
r.setex("foo","bar",5)
print r.get('foo') 5秒后,取值就从bar变成None

7 psetex(name, time_ms, value)
设置值
参数:
time_ms,过期时间(数字毫秒 或 timedelta对象)
r.psetex("foo",5000,"bar")
print r.get('foo') 5000毫秒后,取值就从bar变成None

8 mset(*args, **kwargs)
批量设置值
如:
mset(k1='v1', k2='v2')

mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1",k2="v2") 这里k1 和k2 不能带引号 一次设置对个键值对
print r.mget("k1","k2") ['v1', 'v2'] 一次取出多个键对应的值
print r.mget("k1") ['v1']

9 mget(keys, *args)
批量获取
如:
mget('ylr', 'wupeiqi')

r.mget(['ylr', 'wupeiqi'])
print r.mget("foo","foo1","foo2","k1","k2") [None, 'Bar', 'bar', 'v1', 'v2']
将目前redis缓存中的键对应的值批量取出来

10 getset(name, value)
设置新值并获取原来的值
print(r.getset("foo1","bar_NEW")) Bar
设置的新值是"bar_NEW" 设置前的值是Bar

11 getrange(key, start, end)
获取子序列(根据字节获取,非字符)
参数:
name,Redis 的 name
start,起始位置(字节)
end,结束位置(字节)
如: "武沛齐" ,0-3表示 "武"
r.set("foo1","武沛齐") 汉字
print(r.getrange("foo1",0,2)) 取索引号是0-2 前3位的字节 武 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("foo1",0,-1)) 取所有的字节 武沛齐 切片操作

r.set("foo1","bar_new") 字母
print(r.getrange("foo1",0,2)) 取索引号是0-2 前3位的字节 bar 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("foo1",0,-1)) 取所有的字节 bar_new 切片操作

12 setrange(name, offset, value)
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
参数:
offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值
r.setrange("foo1",1,"aaa")
print(r.get("foo1")) baaanew 原始值是bar_new 从索引号是1开始替换成aaa 变成 baaanew
bar_new

13 setbit(name, offset, value)
对name对应值的二进制表示的位进行操作
参数:
name,redis的name
offset,位的索引(将值变换成二进制后再进行索引)
value,值只能是 1 或 0

注:如果在Redis中有一个对应: n1 = "foo",
那么字符串foo的二进制表示为:01100110 01101111 01101111
所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
那么最终二进制则变成 01100111 01101111 01101111,即:"goo"

扩展,转换二进制表示:
source = "陈思维"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')
特别的,如果source是汉字 "陈思维"怎么办?
答:对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节
对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
-------------------------- ----------------------------- -----------------------------
陈思维

13 应用场景 :统计uv
注:如果在Redis中有一个对应: n1 = "foo",
那么字符串foo的二进制表示为:01100110 01101111 01101111
所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
r.set("foo","foo1") foo1的二进制表示为:01100110 01101111 01101111 00110001
这里f对应的ascii值是102 折算二进制是 01100110 (64+32+4+2)
这里o对应的ascii值是111 折算二进制是 01101111 (64+32+8+4+2+1)
这里数字1对应的ascii值是49 折算二进制是 00110001 (32+16+1)
r.setbit("foo",7,1) 将第7位设置为1,
print(r.get("foo")) goo1
那么最终二进制则变成 01100111 01101111 01101111 00000001
print(ord("f")) 102 将字符f的ascii对应的值打印出来
print(ord("o")) 111 将字符o的ascii对应的值打印出来
print(chr(103)) g 将ascii数字103对应的字符打印出来
print(ord("1")) 49 将数字1的ascii对应的值打印出来

扩展,转换二进制表示:
source = "陈思维"
source = "foo1"
for i in source:
num = ord(i)
print(num) 打印每个字母字符或者汉字字符对应的ascii码值 f-102-0b100111-01100111
print(bin(num)) 打印每个10进制ascii码值转换成二进制的值 0b1100110(0b表示二进制)
print bin(num).replace('b','') 将二进制0b1100110替换成01100110

特别的,如果source是汉字 "陈思维"怎么办࿱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值