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操作才执行
1.ex,过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成None
importredis
pool= redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r= redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3) #key是"food" value是"mutton" 将键值对存入redis缓存
print(r.get('food')) #mutton 取出键food对应的值
2.px,过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成None
importredis
pool= redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r= redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)print(r.get('food'))
3.nx,如果设置为True,则只有name不存在时,当前set操作才执行 (新建)
importredis
pool= redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r= redis.Redis(connection_pool=pool)print(r.set('fruit', 'watermelon', nx=True)) #True--不存在#如果键fruit不存在,那么输出是True;如果键fruit已经存在,输出是None
4.xx,如果设置为True,则只有name存在时,当前set操作才执行 (修改)
print((r.set('fruit', 'watermelon', xx=True))) #True--已经存在#如果键fruit已经存在,那么输出是True;如果键fruit不存在,输出是None
5.setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加)
print(r.setnx('fruit1', 'banana')) #fruit1不存在,输出为True
6.setex(name, value, time)
设置值
参数:
time,过期时间(数字秒 或 timedelta对象)
importredisimporttime
pool= redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r= redis.Redis(connection_pool=pool)
r.setex("fruit2", "orange", 5)
time.sleep(5)print(r.get('fruit2')) #5秒后,取值就从orange变成None
7.psetex(name, time_ms, value)
设置值
参数:
time_ms,过期时间(数字毫秒 或 timedelta对象)
r.psetex("fruit3", 5000, "apple")
time.sleep(5)print(r.get('fruit3')) #5000毫秒后,取值就从apple变成None
8.mset(*args, **kwargs)
批量设置值
如:
r.mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1", k2="v2") #这里k1 和k2 不能带引号 一次设置对个键值对
print(r.mget("k1", "k2")) #一次取出多个键对应的值
print(r.mget("k1"))
9.mget(keys, *args)
批量获取
如:
print(r.mget('k1', 'k2'))print(r.mget(['k1', 'k2']))print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2")) #将目前redis缓存中的键对应的值批量取出来
10.getset(name, value)
设置新值并获取原来的值
print(r.getset("food", "barbecue")) #设置的新值是barbecue 设置前的值是beef
11.getrange(key, start, end)
获取子序列(根据字节获取,非字符)
参数:
name,Redis 的 name
start,起始位置(字节)
end,结束位置(字节)
如: "君惜大大" ,0-3表示 "君"
r.set("cn_name", "君惜大大") #汉字
print(r.getrange("cn_name", 0, 2)) #取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("cn_name", 0, -1)) #取所有的字节 君惜大大 切片操作
r.set("en_name","junxi") #字母
print(r.getrange("en_name", 0, 2)) #取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("en_name", 0, -1)) #取所有的字节 junxi 切片操作
12.setrange(name, offset, value)
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
参数:
offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值
r.setrange("en_name", 1, "ccc")print(r.get("en_name")) #jccci 原始值是junxi 从索引号是1开始替换成ccc 变成 jccci
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 insource:
num=ord(i)print bin(num).replace('b','')
特别的,如果source是汉字"陈思维"怎么办?
答:对于utf-8,每一个汉字占 3 个字节,那么 "陈思维"则有 9个字节
对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
14.getbit(name, offset)
获取name对应的值的二进制表示中的某位的值 (0或1)
print(r.getbit("foo1", 0)) #0 foo1 对应的二进制 4个字节 32位 第0位是0还是1
15.bitcount(key, start=None, end=None)
获取name对应的值的二进制表示中 1 的个数
参数:
key,Redis的name
start 字节起始位置
end,字节结束位置
print(r.get("foo")) #goo1 01100111
print(r.bitcount("foo",0,1)) #11 表示前2个字节中,1出现的个数
16.bitop(operation, dest, *keys) 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值 参数: operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或) dest, 新的Redis的name *keys,要查找的Redis的name 如:
bitop("AND", 'new_name', 'n1', 'n2', 'n3')
获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中
r.set("foo","1") #0110001