Redis

  • Redis介绍
  1. 开源的,使用C编写,基于内存且支持持久化
  2. 高性能的Key-Value的NoSQL数据库
  3. 支持数据类型丰富,字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets 等等
  4. 支持多种编程语言(C C++ Python Java PHP ... )
  5. 单进程单线程
  • 与其他数据库对比
  1. MySQL : 关系型数据库,表格,基于磁盘,慢
  2. MongoDB:键值对文档型数据库,值为类似JSON文档,数据结构相对单一
  3. Redis的诞生是为了解决硬盘IO带来的性能瓶颈

-应用场景

  1. 缓存
  2. 并发计数
  3. 排行榜
  4. 生产者消费者模型
  • redis版本
  1. 最新版本:5.0
  2. 常用版本:2.4、2.6、2.8、3.0(里程碑)、3.2、3.4、4.0(教学环境版本)、5.0

配置文件详解

  • 配置文件所在路径/etc/redis/redis.conf
  • 设置连接密码
  1. requirepass 密码
  2. 重启服务sudo /etc/init.d/redis-server restart
  3. 客户端连接
redis-cli -h 127.0.0.1 -p 6379 -a 123456
127.0.0.1:6379>ping
  • 通用命令
# 切换库(number的值在0-15之间,db0 ~ db15)
select number
# 查看键
keys 表达式  # keys *
# 数据类型
type key
# 键是否存在
exists key
# 删除键
del key
# 键重命名
rename key newkey
# 清除当前库中所有数据(慎用)
flushdb
# 清除所有库中所有数据(慎用)
flushall

python交互redis

  • 模块(redis)
sudo pip3 install redis
  • 使用流程
import redis
# 创建数据库连接对象
r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')
  • 代码示例
import redis

# 1 创建redis数据库连接对象
r = redis.Redis(password='123456')
# 2 使用,很多命令的返回值是字节串,需要用字符串
#  表示时,调用decode方法.
# 3.1 通用命令...
print(r.keys('*'))
print(r.exists('name'))
# 3.2 字符串类型的操作
r.set('uname', 'aid2102', 60)
print(r.get('uname').decode())
r.mset({'a': 100, 'b': 200, 'c': 300})
print(r.mget(['a', 'b', 'c']))
# 3.3 列表类型的操作
r.lpush('pylk1',100,200,300)
print(r.lrange('pylk1',0,-1))

list案例: 一个进程负责生产任务,一个进程负责消费任务

  • 进程1: 生产者,product.py
import redis
# 1 创建redis数据库连接对象
r = redis.Redis(password='123456')
# 2.向任务队列中添加任务,使用列表类型
# 任务格式: 任务类别_发送者_接收者_内容
task = 'sendMail_aid2102_mzg_helloworld'
r.lpush('lst:tasks',task)
  • 进程2: 消费者,consumer.py
import redis

r = redis.Redis(password='123456')

while True:
    task = r.brpop('lst:tasks',3)
    if task:
        print(task)
        # (b'lst:tasks', b'sendMail_aid2102_mzg_helloworld')
        # 处理任务
        task_data = task[1].decode()
        print(task_data)
        # sendMail_aid2102_mzg_helloworld
        lst_data = task_data.split('_')
        if lst_data[0] == 'sendMail':
            print('执行发送邮件的任务...')
    else:
        print('-no task!-')