redis 是一个数据库,数据存在内存,每秒钟支持10w次的读写。
但不同于MySQL,redis 是非关系型数据库。
关于关系型和非关系型数据库,关系型即我们常见的,数据库包含表、字段,通过 sql 查询;而非关系型数据库,没有 sql 语句,没有表,常见的有:redis、mongodb、memcache
1⃣️ 初步认识和简单应用
a. 简单应用
前面说了,redis 是非关系型数据库,这类数据库的有点是数据读取非常快,它存储的方式是 key=value 。以下为简单应用。
1 import redis 2 red = ('111.2.1.2','password***') 3 r = redis.Redis(host = red[0],password=red[1],db=3,decode_responses=True) #db可以是0-16的任意数值;decode_responses=True这句话加上之后,取出的数值是字符串,原本是bytes 4 5 name = input('name:').strip() 6 password = input('password:').strip() 7 r.set('name',name) #前一个‘name’就是value 8 r.set('password',password) #插入 9 r.delete('name') #删除 10 11 print(r.get(name).decode()) #.decode在此处不必加了
以上也可以用 r.set(name,password) 来存储,这样用户名和密码可以对应起来。
b. 多层路径(文件夹)
1 r.set('aaa_a:lucy':'123') 2 r.set('aaa_a:tom':'1234455') #这种情况下会有一个文件夹,多个冒号的话多个文件夹
2⃣️ 设置失效时间等方法
a. 设置失效时间:r.set() 中的第三个参数,输入的数字代表秒数,一定秒数之后 key 就会消失
b. 清除当前数据库:r.flushdb()
c. 清除所有数据库:r.flushall()
d. 模糊查询:print(r.keys('j*') #相当于sql语句的 like,会输出所有 ‘j’ 开头的 key
e. 检查某个key是否存在:print(r.exists('jiaolf')) #存在返回1,不存在返回0
3⃣️ 关键字的类型
包含:string、hash、list等,主要写下 hash 类型。总的来说,hash 类型相当于二维的字典。
1 import redis 2 r = redis.Redis(host='127.0.0.1',password='sdaf',db=1,decode_responses=True) 3 r.hset('cnz_user','xiaohei','123456') 4 r.hset('cnz_user','xiaobai','111111') 5 r.hdel('cnz_user','xiaohuang') #删除小key 6 print(r.hget('cnz_user','xiaobai')) 7 print(r.hgetall('cnz_user')) #获取小字典 8 d = {'xiaohei':'123','xixi':'12345'} 9 r.hmset('cnz_user',d) #批量set数据 10 print(r.type('jiaolf')) #获取类型
上面说设置失效时间时,第三个参数是失效时间,因为 hash 类型的有三个参数,所以,针对失效时间,还有一个通用的方法。 r.expire('cnz_user',60)
这种方法对 string 类型的也同样适用。
搞个练习?
redis 迁移,从 a 迁移到 b。(思路:从 a 获取所有的 key,然后通过 key 取到 value,set 到 b,需要通过判断类型来有针对性的使用方法)
1 import redis,hashlib 2 red = ('118.24.3.40','*******') 3 a = redis.Redis(host=red[0],password=red[1],db = 3, 4 decode_responses=True) # 取出的数值是字符串,原本是bytes 5 b = redis.Redis(host=red[0],password=red[1],db = 4, 6 decode_responses=True) 7 8 for k in a.keys(): 9 if a.type(k) == 'string': 10 value = a.get(k) 11 b.set(k,value) 12 elif a.type(k) == 'hash': 13 d = a.hgetall(k) 14 b.hset(k,d) 15 else: 16 print('其他类型不支持‘)
⚠ 错的点:① 获取类型的时候,需要用 a.type();② hash 类型的数据,用 .hgetall() 获取到小字典