redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1.1 redis数据类型
string 字符串,k -> "value" list 列表,k -> [11,11,22,33,44] set k -> {"k1":xxx} k -> [11, 22] k -> [(11,1),(13,2),]
1.2 安装配置
待补
1.3 操作模式
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
1.4 连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis pool = redis.ConnectionPool(host=‘192.168.101.11‘, port=6379) r = redis.Redis(connection_pool=pool) r.set(‘foo‘, ‘Bar‘) print(r.get(‘foo‘)) # b‘Bar‘
1.5 redis操作——string字符串
1.5.1 set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,岗前set操作才执行
格式:
set(name, value, ex=None, px=None, nx=False, xx=False)
1.5.2 get(name)
取值
1.5.3 setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加)
import redis r = redis.Redis(host=‘192.168.101.11‘, port=6379) r.set(‘k1‘,‘v1‘) r.setnx(‘k1‘, ‘v2‘) #设置已有name r.setnx(‘k2‘, ‘v2‘) #设置未有name print(r.get(‘k1‘)) print(r.get(‘k2‘)) # b‘v1‘ # k1值未变化,name存在时不操作 # b‘v2‘ # k2 name不存在,创建添加
1.5.4 setex(name, value, time)
参数:time,过期时间(数字秒 或 timedelta对象)
import redis import time r = redis.Redis(host=‘192.168.101.11‘, port=6379) r.setex(‘k1‘, ‘value‘, 5,) print(r.get(‘k1‘)) time.sleep(5) print(r.get(‘k1‘)) # b‘value‘ # 过期前输出 # None #过期后输出,空
1.5.5 psetex(name, time_ms, value)
参数:time_ms,过期时间(数字毫秒 或 timedelta对象)
import redis import time r = redis.Redis(host=‘192.168.101.11‘, port=6379) r.psetex(‘k2‘,10,‘v2‘) print(r.get(‘k2‘)) time.sleep(0.05) print(r.get(‘k2‘)) # b‘v2‘ # 过期前输出 # None #过期后输出,空
1.5.6 mset(*args, **kwargs)
# 批量设置值 r.mset(k1=‘v1‘, k2=‘v2‘, k3=‘v3‘) print(r.mget(‘k1‘, ‘k2‘, ‘k3‘, )) # 有序 # [b‘v1‘, b‘v2‘, b‘v3‘] r.mset({‘key1‘:‘value1‘, ‘key2‘:‘value2‘, ‘key3‘:‘value3‘, }) print(r.mget({‘k1‘, ‘k2‘, ‘k3‘, })) # 无序 # [b‘v2‘, b‘v1‘, b‘v3‘]
1.5.7 mget(keys, *args)
# 批量取值 r.mset(k1=‘v1‘, k2=‘v2‘, k3=‘v3‘) print(r.mget(‘k1‘, ‘k2‘, ‘k3‘, )) # 有序 # [b‘v1‘, b‘v2‘, b‘v3‘] r.mset({‘key1‘:‘value1‘, ‘key2‘:‘value2‘, ‘key3‘:‘value3‘, }) print(r.mget({‘k1‘, ‘k2‘, ‘k3‘, })) # 无序 # [b‘v2‘, b‘v1‘, b‘v3‘]
1.5.8 getset(name, value)
# getset(name, vlaue) 设置新值并获取原来的值 r.set(‘k1‘, ‘v1‘) # print(r.get(‘k1‘)) print(r.getset(‘k1‘, ‘value1‘)) print(r.get(‘k1‘))
1.5.9 getrange(key, start, end)
# 获取子序列(根据字节获取,非字符) # 参数: # name,Redis 的 name # start,起始位置(字节) # end,结束位置(字节) r.set(‘k1‘, ‘abcdefg‘) print(r.getrange(‘k1‘, 2, 4)) # b‘cde‘ r.set(‘k1‘, ‘大龙‘) print(r.getrange(‘k1‘, 3, 6)) # b‘\xe9\xbe\x99‘ print(str(r.getrange(‘k1‘, 3, 6),encoding=‘utf-8‘)) # 龙
1.5.10 setrange(name, offset, vallue)
# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加) # 参数: # offset,字符串的索引,字节(一个汉字三个字节) # value,要设置的值 r.set(‘name‘, ‘dalongge‘) r.setrange(‘name‘, 2, ‘hu‘) print(r.get(‘name‘)) # b‘dahungge‘ r.setrange(‘name‘, 4, ‘diiiiiiiiiii‘) print(r.get(‘name‘)) # 输出:b‘dahudiiiiiiiiiii‘ r.set(‘name‘, ‘大龙哥‘) r.setrange(‘name‘,3,‘虎‘) print(str(r.get(‘name‘), encoding=‘utf8‘)) # 大虎哥
1.5.11 setbit(name, offset, value)
# setbit(name, offset, value) # ‘‘‘ 对二进制表示位进行操作 name:redis的name offset,位的索引(将值对应的ASCII码变换成二进制后再进行索引) value,值只能是 1 或 0 ‘‘‘ source = "345" r.set(‘name‘,source) for i in source: print(i, ord(i), bin(ord(i))) #输出 值、ASCII码中对应的值、对应值转换的二进制 ‘‘‘ 输出: 3 51 0b110011 4 52 0b110100 5 53 0b110101‘‘‘ r.setbit(‘name‘, 6, 0) #把第7位改为0,也就是3对应的变成了0b110001 print(r.get(‘name‘)) #输出:145 # 扩展,转换二进制表示: source = "foo" r.set(‘name‘, source) for i in source: num = ord(i) print(i,bin(num).replace(‘b‘,‘‘)) # 输出 ‘‘‘ f 01100110 o 01101111 o 01101111 ‘‘‘ r.setbit(‘name‘, 6, 0) #把第7位改为0,也就是3对应的变成了01100100 print(r.get(‘name‘)) #输出: doo source = "大龙" r.set(‘name‘, source) for i in source: num = ord(i) print(i, bin(num).replace(‘b‘,‘‘)) # 特别的,如果source是汉字 "大龙"怎么办? # 答:对于utf-8,每一个汉字占 3 个字节,那么 "武沛齐" 则有 9个字节 # 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
1.5.12 getbit(name, offset)
# getbit(name, offset) # 获取name对应的值的二进制表示中的某位的值 (0或1) r.set(‘k1‘, "7") num = str(r.get(‘k1‘),encoding=‘utf-8‘) print(bin(ord(num))) # 输出二进制 0b110111 print(r.getbit(‘k1‘,2)) #输出第2位 print(r.getbit(‘k1‘,6)) #输出第6位 print(r.getbit(‘k1‘,5)) #输出第5位
1.5.13 bitcount(key, start=None, end=None)
r.set(‘k1‘, "7") num = str(r.get(‘k1‘),encoding=‘utf-8‘) print(bin(ord(num))) # 输出二进制 0b110111 print(r.bitcount(‘k1‘,0 ,1)) # 5
1.5.14 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 对应的值中
1.5.15 strlen(name)
# 返回name对应值的字节长度(一个汉字3个字节) r.set(‘k1‘, "大龙") print(r.strlen("k1")) # 6
1.5.16 incrbyfloat(self, name, amount=1.0)
# incrbyfloat(self, name, amount=1.0) # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 # # 参数: # name,Redis的name # amount,自增数(浮点型) r.set(‘k1‘, 2.0) r.incrbyfloat(‘k1‘, amount=1.1) print(r.get(‘k1‘)) # b‘3.1‘
1.5.17 decr(self, name, amount=1)
# 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。 # 参数: # name,Redis的name # amount,自减数(整数) r.set(‘k1‘, 2) r.decr(‘k1‘, amount = 1) print(r.get(‘k1‘)) # b‘1‘
1.5.18 append(key, value)
# append(key, value) # 在redis name对应的值后面追加内容 # 参数: # key, redis的name # value, 要追加的字符串 r.set(‘k1‘,‘v1‘) r.append(‘k1‘, ‘v2‘) print(r.get(‘k1‘)) # b‘v1v2‘