Python3 数据库(MySQL/MongoDB/Redis)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rozol/article/details/81874154

Python3 数据库(MySQL/MongoDB/Redis)


本文由 Luzhuo 编写,转发请保留该信息.
原文: https://blog.csdn.net/Rozol/article/details/81874154


以下代码以Python3.6.1为例
Less is more!

MySQL

#!/usr/bin/env python
# coding=utf-8

'''
mysql属于关系型数据库, E-R关系模型
E-R模型:
    E(entry): 实体
    R(relationship): 关系
    一个实体为数据库中的一个表, 一个对象为数据库中的一行
    实体之间的关系:
        一对一
        一对多
        多对多
        自关联

mysql:
    linux:
        安装: sudo apt-get install mysql-server mysql-client
        启动: service mysql start
        停止: service mysql stop
        重启: service mysql restart
        远程连接配置: 
            sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
            # bind-address=127.0.0.1
    windows: 安装包安装(略)

字段类型: (注: 预留5个字段栏位, 以防产品经理的修改)
    数字:int(整数), decimal(浮点数)
    字符串:char(固定), varchar(可变), text(大文本)
    日期:datetime, data, time
    布尔:bit

约束:
    主键: primay key
    唯一: unique
    非空: not null
    默认: default
    外键: foreign key

命令:
    连接: mysql -uroot -p
    远程连接: mysql -hip192.168.0.1 -uroot -p
    版本: select version();

    数据库:
        创建: create database 数据库名 charset=utf8;
        删除: drop database 数据库名;
        切换: use 数据库名;
        查看: show databases;
        当前使用的库: select database();

    表:
        创建: create table 表名(列名与类型);
            create table person(
                id int auto_increment primary key,
                name varchar(10),
                isDelete bit default 0
            );
        查看: show tables;
        修改: alter table 表名 add|change|drop 列名 类型;
            alter table person add age int;
        删除: drop table 表名;
        表结构: desc 表名;
        修改表名: rename table 原表名 to 新表名;
        查看创建语句: show create table 表名;

    数据:
        查询:
            全列: select * from 表名;
            指定列: select 字段1,字段2,... from 表名;
                去重: select distinct 字段1,字段2,... from 表名;
            别名: select id as 别名 from 表名;
        添加: (主键用null值)
            全列:insert into 表名 values(...);
            缺省:insert into 表名(列1,...) values(值1,...);
            多条:insert into 表名 values(...),(...)...; 或 insert into 表名(列1,...) values(值1,...),(值1,...)...;
        修改: update 表名 set 列1=值1,... where 条件;
        删除: delete from 表名 where 条件;

    备份与恢复:
        Linux备份: cd /var/lib/mysql --> mysqldump –uroot –p 数据库名 > ~/Desktop/备份文件.sql
        Windows备份: mysqldump -uroot -p 数据库名 > C:\我的电脑\备份文件.sql
        恢复: 创建数据库 --> mysql -uroot –p 数据库名 < ~/Desktop/备份文件.sql

    条件where: (select * from 表名 where 条件;)
        比较运算符: = > < >= <= != 
            select * from person where id>3;
        逻辑运算符: and or not
            select * from person where id>3 and isDelete=false;
        模糊查询: like %(多个字符) _(一个字符)
            select * from person where name like 'a%';
        范围查询: in(.,.,.)(非连续范围) between ... and ...(连续范围)
            select * from person where id in(1,3,5);
            select * from person where id between 3 and 5;
        空判断: is null(为空) is not null(不为空)
            select * from person where isDelete is not null;
        优先级: () > not > 比较运算符 > 逻辑运算符

    聚合: (select 聚合(*) from 表名;)
        count(总数) max(最大值) min(最小值) sum(求和) avg(求权)
        select count(*) from person;
        select max(id) from person;

        字符串函数:
            ascii码: ascii('a');
            ascii码值对应的字符: char(97);
            拼接字符串: concat(12,34,'ab');
            包含字符个数: length('abc');
            截取字符串:
                substring('abc123',2,3); // '',start,count
                left('abc123',2) // '',count
                right('abc123',2) // '',count
            去除空格:
                trim('  bar   ');
                trim(leading 'x' FROM 'xxxbarxxx'); // both(两侧)、leading(左侧)、trailing(右侧)
                ltrim('  bar   ')
                rtrim('  bar   ')
            空格字符串: space(10);
            替换字符串: replace('abc123','123','def');
            大小写转换:
                lower('aBcD');
                upper('aBcD');
        数学函数:
            绝对值: abs(-32);
            m除以n的余数:
                mod(10,3);
                10%3;
            向上取整: ceiling(2.3);
            向下取整: floor(2.3);
            四舍五入: round(1.6);
            x的y次幂: pow(2,3);
            圆周率: PI();
            随机数rand() (0.0-1.0): rand();
            三角函数: sin(1);  cos(1);  cot(1);  tan(1); 等等
        日期时间函数: year(date); month(date); day(date); hour(time); minute(time); second(time)
            year('2018-5-20 0:44');
            time('2018-5-20 0:44');

            运算: year、month、day、hour、minute、second
                '2018-5-20 0:44'+interval 1 minute;
            格式化: 年%Y(4位) 年%y(2位) 月%m 日%d %H(24) 时%h(12) 分%i %s
                date_format('2018-5-20 0:44','%Y %m %d');
            当前日期: current_date();
            当前时间: current_time();
            当前日期时间: now();
        加密函数:
            加密: encode('value', 'key');
            解密: decode('value', 'key');
            md5: select md5('value');
            sha: select sha('value');
        系统信息函数:
            数据库名: database();
            用户名: user();
            版本: version();
        直接使用 如: select length('abc');

    分组: (select 字段1,字段2,聚合... from 表名 group by 字段1,字段2,...)
        select isDelete,count(*) from person group by isDelete;
        分组筛选: (select ... from 表名 group by ... having 条件)
            select isDelete,count(*) from person group by isDelete having isDelete=true;

    排序: (select * from 表名 order by 字段1 asc|desc,字段2 asc|desc, ...)
        select * from person order by id desc;

    分页: (select * from 表名 limit start,count)
        select * from person limit 1,3; // 0开始

    外键: (foreign key(本表字段) references 被关联的表名(被关联的字段))
        create table students( // 学生
            id int primary key auto_increment,
            name varchar(10)
        );
        create table subjects( // 科目
            id int primary key auto_increment,
            title varchar(10)
        );
        create table scores( // 成绩表含学生与科目信息
            id int primary key auto_increment,
            stuId int,
            subId int,
            score decimal(5,2),
            foreign key(stuId) references students(id),
            foreign key(subId) references subjects(id)
        );

        级联操作: restrict(限制:抛异常)(默认)
                 cascade(级联:主表删掉, 关联记录都被删除)
                 set null(外键设为空)
                 no action(什么都不做)
                 alter table scores add stuId foreign key(stuId) references students(id) on delete cascade;

        连接查询: (select ... from 表A inner join 表B on 表A.字段=表B.字段 ...) [表A表B位置可互换]
            inner join(表A与表B匹配的行) left join(表A与表B匹配的行 + 表A的行) right join(表A与表B匹配的行 + 表B的行)
                select name,title,score from scores
                inner join students on scores.stuId=students.id
                inner join subjects on scores.subId=subjects.id;

        子查询:
            select name,
             (select scores.score from scores inner join subjects on scores.subId=subjects.id where subId=subjects.id and subjects.title='english') as english
             from students;

        视图(对查询进行封装,解决多次使用复杂语句的繁琐问题):
            create view v_视图名字 as
            select name,title,score from scores
            inner join students on scores.stuId=students.id
            inner join subjects on scores.subId=subjects.id;

            查询视图: show tables;
            使用: select * from v_视图名字;
            修改: 
                alter view v_视图名字 as
                select name,title,score from scores
                ...
            删除等操作同理

        自关联(数据不多时使用,如:省市镇村表):
            create table areas( // 省
                id int primary key auto_increment,
                name varchar(10),
                pid int, // 上一级, 省(null), 市(省), 镇(区), 村(镇)
                foreign key(pid) references areas(id)
            );

            查询市:
                select sheng.id as sid, sheng.name as sname, shi.id as sid, shi.name as sname from areas as sheng
                inner join areas as shi on sheng.id=shi.pid
                where sheng.pid is null;

    综合:
        select distinct 字段,聚合
        from 表A inner join 表B on 表A.a=表B.a
        where 条件
        group by 字段 having 条件
        order by 字段 desc
        limit start,count

    事务(表engine必须是innodb / bdb):
        开启: begin;
        提交: commit;
        回滚: rollback;

    索引(提高数据访问性能(会降低增删改性能), 数据类型越小越好, 默认为主键):
        单列索引: 一个索引只包含一个列, 一个表可有多个单列索引
        组合索引: 一个索引包含多个列

        查看: show index from 表名;
        创建: create index 索引名 on 表名(字段名1, 字段名2(长度), ...); // 长度: 数字,bit等小数据类型无须指定,字符串要指定
        删除: drop index [索引名] on 表名

    工具:
        性能检测工具(5.0.37+):
            开启运行时间检测: set profiling=1;
            执行sql...
            查看执行时间s: show prifiles;
'''

import pymysql
def mysql_funcs():
    '''
    安装驱动: pip install pymysql
    '''

    # 连接
    # Connection对象
    conn = pymysql.connect(host='localhost', user='root', password='root', db='person', port=3306, charset='utf8')
    conn.close()  # 关闭
    conn.commit()  # 提交
    conn.rollback()  # 回滚
    cursor = conn.cursor()  # 获取Cursor对象

    # Cursor对象
    cursor = conn.cursor()
    cursor.close()  # 关闭
    count = cursor.execute('sql')  # 执行语句
    count = cursor.execute('sql %s' % ('params',))  # %s %d
    result_firstData = cursor.fetchone()  # 查询第一行数据, 返回元组
    result_nextData = cursor.next()  # 下一行数据
    result_allData = cursor.fetchall()  # 所有行数据
    cursor.scroll(1, mode='relative')  # 移动到指定行 +向下 -向上 mode:relative(相对), absolute(绝对,第一条0开始)

    count = cursor.rowcount  # 最近执行的sql的影响函数
    conn = cursor.connection  # 获取当前连接对象


def mysql_demo():
    conn = pymysql.connect(host='localhost', user='root', password='root', db='aaa', port=3306, charset='utf8')
    cursor = conn.cursor()

    try:
        # cursor.execute('select * from person;')
        cursor.execute('select %s from person where id>%d;' % ('name', 1,))
        result = cursor.fetchall()

        for row in result:
            print(row)

        conn.commit()
    except Exception as e:
        print(e)
        conn.rollback()
    finally:
        cursor.close()
        conn.close()


if __name__ == '__main__':
    mysql_demo()
    # mysql_funcs()

MongoDB

#!/usr/bin/env python
# coding=utf-8


'''
NoSQL: Not Only SQL, 非关系型数据库, 不维护关系(如:E-R)
优点:
    高扩展新
    分布式计算
    没有复杂的关系
缺点:
    没有标准化
    有限的查询功能

用户 -> 服务器 -> Redis -> Mysql


MongoDB: (https://www.mongodb.com)
    分布式 文件存储的 NoSQL数据库

    特点:
        支持不同结构的文档
        适合存储json格式数据
        对任何属性可以设置索引
        支持二进制数据和大型对象

    安装
        ## Windows安装
         - 创建目录
             - 软件目录: `C:\DevelopSoftware\mongo`
             - 数据库目录: `C:\DevelopSoftware\mongo\db`
         - 安装软件: 选Custom -> 去掉√ `Install MongoDB Compass`
         - 运行服务器
             - `C:\DevelopSoftware\mongo\bin\mongod --dbpath C:\DevelopSoftware\mongo\db`
         - 添加环境变量
             - Path: `C:\DevelopSoftware\mongo\bin`
         - 连接MongoDB
             - `mongo`

        ## Linux
         - 解压: `tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.6.4.tgz`
         - 移动: `mv -r mongodb-linux-x86_64-ubuntu1604-3.6.4/ /usr/local/mongodb`
         - Path变量: `export PATH=/usr/local/mongodb/bin:$PATH`
         - 运行服务器
             - 启动: `service mongod start`
             - 停止: `service mongod stop`
         - 连接MongoDB (数据库目录 /data/db)
             - `mongo`

        ## robomongo
         - GUI管理软件
         - https://robomongo.org

    语法:
        数据库:
            当期数据库: db
            所有(物理)数据库: show dbs
            切换数据库(无需创建直接用): use 数据库名
            默认数据库: test
            删除数据库: db.dropDatabase()
        集合:
            创建:
                db.createCollection("集合名")
                db.createCollection("sub", {capped : true, size : 10} ) // capped上限限制(默认不限制false), size上限大小(字节, 超过上限则覆盖)
            查看:
                show collections
            删除:
                db.集合名.drop()
        数据:
            插入:
                db.集合名.insert({name:'nm', gender:1})

                数据类型:
                    Object_ID: 文档ID, 自动维护, 字段为_id (默认: 12字节16进制, 时间错(4)+机器ID(3)+服务进程id(2)+增量值(3))
                    String: 字符串, 必须是UTF-8
                    Boolean: 一个布尔值,true或false
                    Integer: 整数
                    Double: 浮点值
                    Arrays: 数组或列表,多个值存到一个键
                    Object: 嵌入文档
                    Null: Null值
                    Timestamp:时间戳
                    Date:存储UNIX日期时间

            查询: 
                所有:
                    db.集合名.find()
                    db.集合名.find({name:'nm'})
                一条:
                    db.集合名.findOne()
                    db.集合名.findOne({name:'nm'})
                字段: db.集合名.find({},{字段名:1,...})
                    db.集合名.find({},{name:1,gender:1})

                函数:
                    限制数量:
                        db.集合名.find().limit(2)
                    跳过数量:
                        db.集合名.find().skip(2)
                    排序: 1升序, -1降序
                        db.集合名.find().sort({name:1, gender:-1})
                    统计个数:
                        db.集合名.find({gender:1}).count()
                        db.集合名.count({gender:{$gte:2}})
                    消除重复: db.集合名.distinct('去重字段',{条件})
                        db.集合名.distinct('gender',{name:/^n/})
                    聚合: db.集合名称.aggregate([{管道:{表达式}}])  // 表达式参考例句

                        管道:
                            $group:分组,用于统计
                                db.集合名.aggregate([{$group:{_id:'$gender', counter:{$sum:1}}}])
                                db.集合名.aggregate([{$group:{_id:'null', counter:{$sum:1}}}])  // _id:null 整个文档分为一组
                                db.集合名.aggregate([{$group:{_id:'$name', counter:{$max:'$gender'}}}])
                                db.集合名.aggregate([{$group:{_id:'$name', counter:{$push:'$$ROOT'}}}])  // $$ROOT 整个文档

                            $match:匹配数据
                                db.集合名.aggregate([{$match:{gender:{$gte:2}}}])

                            $project:修改文档结构
                                db.集合名.aggregate([{$project:{_id:0,name:1}}])

                            $sort:排序
                                db.集合名.aggregate([{$sort:{gender:1}}])

                            $limit:限制数量
                                db.集合名.aggregate([{$limit:2}])

                            $skip:跳过
                                db.集合名.aggregate([{$skip:1}])

                            $unwind:数组字段进行拆分
                                // db.集合名.insert({name:'array',num:['1','3','5']})
                                db.集合名.aggregate([{$unwind:'$num'}])
                                db.集合名.aggregate([{$unwind:{path:'$num',preserveNullAndEmptyArrays:true}}]) // 即使没有该值也获取

                            组合使用:
                                db.集合名.aggregate([{$match:{gender:{$gte:2}}},{$group:{_id:'$gender',counter:{$sum:1}}}])  // 组合

                        表达式: 表达式:'$列名'
                            $sum:总和, $sum:1表示计数(count)
                            $avg:平均值
                            $min:最小值
                            $max:最大值
                            $push:放到数组中
                            $first:第一个文档
                            $last:最后一个文档

                    组合:
                        db.集合名.find().skip(2).limit(3).sort({name:1})

                运算符:
                    比较运算符:
                        ==  默认
                        <   $lt
                        <=  $lte
                        >   $gt
                        >=  $gte
                        ≠   $ne
                        db.集合名.find({gender:{$gte:2}})

                    逻辑运算符:
                        与   默认
                        或   $or
                        db.集合名.find({$or:[{gender:1},{gender:2}]})
                        db.集合名.find({$or:[{gender:1},{gender:2}],name:'nm'}) // 与或一起用

                    范围运算符:
                        范围内 $in
                        范围外 $nin
                        db.集合名.find({gender:{$in:[2,3]}})

                    支持正则表达式:
                        // 或 $regex 编写正则

                        db.集合名.find({name:/m$/})
                        db.集合名.find({name:{$regex:'m$'}})

                    自定义查询:
                        $where 函数

                        db.集合名.find({$where:function(){return this.gender>=2}})

            修改: db.集合名.update(<query>,<update>,{multi: <boolean>}) // query条件, update更新, multi默认为false, 只更新一条, ture需要与$set配合使用
                db.集合名.update({name:'nm'},{name:'nmc'}) // 替换整个文档
                db.集合名.update({name:'nm'},{$set:{name:'anb'}}) // 只替换指定属性
                db.集合名.update({name:'nmc'},{$set:{name:'nmb'}},{multi:true}) // 替换所有指定属性
            保存(存在修改, 不存在添加):
                db.集合名.save({_id:'20180523',name:'nm',gender:1})
            删除: db.集合名.remove(<query>, {justOne:<boolean>}) // justOne默认false,删除多条
                db.集合名.remove({name:'aaa'},{justOne:true})
                db.集合名.remove({})  // 删除全部

        索引: ensureIndex({属性:1})  // 1升序 -1降序
            创建普通索引
                db.temp.ensureIndex({name:1})
            创建唯一索引
                db.temp.ensureIndex({name:1},{unique:true})
            创建联合索引
                db.temp.ensureIndex({name:1,age:1})
            查看索引:
                db.temp.getIndexes()
            删除索引:
                db.temp.dropIndex('name_1')
                db.temp.dropIndexes()  // 删除除 _id_ 索引外的所有索引

        性能分析: explain()
            db.temp.find({name:'test100000'}).explain('executionStats')

        超级管理员: root(超级权限) / read(某数据库读权限) / readWrite(某数据库读写权限)
            use admin
            db.createUser({user:'admin', pwd:'123', roles:[{role:'root', db:'admin'}]})
            db.createUser({user:'guest', pwd:'123', roles:[{role:'read', db:'aaa'}]})

            查看用户:
                show users

            删除:
                db.dropUser("guest")

            修改配置(启用验证):
                Linux: 打开 /etc/mongod.conf
                    security:
                        authorization: enabled

                Windows: 使用 --auth 启动
                    C:\DevelopSoftware\mongo\bin\mongod --dbpath C:\DevelopSoftware\mongo\db -–auth

            连接:
                方式一:
                    mongo -u guest -p 123 --authenticationDatabase admin

                方式二:
                    mongo
                    use admin
                    db.auth("admin","123")

            副本集:
                - 1. 创建两个数据库目录 db1 db2
                - 2. (两终端)启动mongo (replSet副本集名字相同)
                    mongod --bind_ip 192.168.1.104 --port 27017 --dbpath ~/Desktop/db1 --replSet rs0
                    mongod --bind_ip 192.168.1.104 --port 27018 --dbpath ~/Desktop/db2 --replSet rs0

                    (Windows: mongod --bind_ip 192.168.1.104 --port 27017 --dbpath C:\DevelopSoftware\mongo\db --replSet rs0)

                - 3. 连接mongo(两终端)
                    mongo --host 192.168.1.104 --port 27017
                    mongo --host 192.168.1.104 --port 27018
                - 4. 设置主服务(27017)
                    - 初始化:
                        rs.initiate()

                        操作:
                            查看状态: rs.status()
                            添加副本: rs.add('192.168.1.104:27018')
                            删除副本: rs.remove('192.168.1.104:27018')
                - 5. 设置副本服务(27018)
                    rs.slaveOk()
                - 6. 测试: 在主服务添加数据, 在副本服务查询数据

                - 7. 主从切换:
                    1. 关闭主服务(27017)
                    2. 副本服务(27018) 自动变成 主服务(27018)
                    3. 开启服务(27017) 自动变成 普通服务(27017)
                    4. 设置副本服务(27017)
                        rs.slaveOk()

            备份:
                备份:
                    mongodump -h 192.168.1.104:27017 -d aaa -o ~/Desktop/aaa.bak
                    mongodump -u root -p 123 --authenticationDatabase admin -d aaa -o ~/Desktop/back

                    (windows: mongodump -h 192.168.1.104:27017 -d aaa -o C:\DevelopSoftware\mongo\back)

                恢复:
                    mongorestore -h 192.168.1.104:27017 -d aaa --dir ~/Desktop/back/aaa
                    mongorestore -u root -p 123 --authenticationDatabase admin -d aaa --dir ~/Desktop/back/aaa

                    (windows: mongorestore -h 192.168.1.104:27017 -d aaa --dir C:\DevelopSoftware\mongo\back\aaa)

    与Python连接: (pymongo=3.6.1)
        安装库: pip install pymongo

'''


import pymongo
def mongodb_demo():
    # 建立连接
    client = pymongo.MongoClient("192.168.1.104", 27017)
    client = pymongo.MongoClient("mongodb://192.168.1.104:27017")
    client = pymongo.MongoClient("mongodb://root:123@localhost:27017/temp")  # mongodb://账户:密码@主机:端口/数据库

    # 获取数据库对象 database
    db = client.aaa

    # 连接对象 collection
    # insert_one insert_many update_one update_many delete_one delete_many find_one find
    temp = db.temp  # 获取temp表的集合

    t_id = temp.insert_one({"name": "name1", "age": 123}).inserted_id
    temp.update_one({"name": "name1"}, {"$set": {"name": "name2"}})
    temp.remove({"name": "name2"})
    t = temp.find_one({"name": "nm"})
    t_cursor = temp.find({"name": "nm"})
    t_cursor = temp.find({"name": "nm"}).sort("_id", pymongo.DESCENDING)
    t_cursor = temp.find({"name": {"$regex": '^test'}}).sort([("_id", pymongo.DESCENDING), ("age", pymongo.ASCENDING)]).limit(10)
    t_cursor = temp.find({"name": "nm"}).sort("_id", pymongo.DESCENDING).limit(10)
    print(temp.count())
    for t in t_cursor:
        print(t)


if __name__ == '__main__':
    mongodb_demo()

Redis

#!/usr/bin/env python
# coding=utf-8

'''
redis: key-value存储

安装与配置:
    下载:
        https://redis.io
    安装:
        见官网
    redis管理软件:
        redis-desktop-manager-0.9.2.806.exe
    运行redis服务: (windows10)
        cd到指定目录, 运行命令 `redis-server.exe  redis.windows.conf --maxmemory 200m`
    redis客户端使用: (windows10)
        打开 redis-cli.exe 输入命令
        输入 ping, 返回 PONG, 表示服务启动成功

    Linux停止与启动:
        启动: sudo service redis start
            或者: sudo redis-server /etc/redis/redis.conf
        停止: sudo service redis stop
            或者: sudo kill -9 redis的进程id
        重启: sudo service redis restart
        查看redis进程: ps ajx|grep redis


    配置: redis.windows.conf
        // bind 127.0.0.1  # 绑定地址: 如果开启, 远程将无法访问
        port 6379  # 端口, 默认6379
        daemonize no  # 是否以守护进程运行: yes守护进程运行, 终端不阻塞; no非守护进程运行, 终端被阻塞
        databases 16  # 数据库数, 0-15
        save 900 1  # 备份时间, 如900s内进行1次写操作, 就进行一次物理写操作
        dbfilename dump.rdb  # 数据文件
        dir ./  # 数据文件存储路径

数据操作:
    key-value:
        key: 字符串
        value:
            字符串string
                最大存储512MB数据
                二进制安全的, 可为任何数据 (数字,图片,序列化对象)
            哈希hash
            列表list
            无序集合set
            有序集合zset

    数据操作命令:
        见网站: http://redis.cn/commands.html

        常用操作命令:
            键操作命令:
                查找键(支持正则): KEYS pattern
                    keys name*
                键是否存在: EXISTS key [key ...] (存在1, 不存在0)
                    exists name
                键对应的value的类型:TYPE key
                    type name
                删除键+值:DEL key [key ...]
                    del num
                设置过期时间(秒): EXPIRE key seconds
                    expire name2 1
                查看有效时间(秒): TTL key (剩余时间, -1永久, -2已过有效期或不存在)
                    ttl name3

            值操作命令:
                字符串string: (基本类型)
                    添加:
                        添加键值: set key value
                            set name luzhuo.me
                        添加键值 + 过期时间(秒): SETEX key seconds value
                            setex name1 1 luzhuo.me
                        添加多个键值: MSET key value [key value ...]
                            mset name2 luzhuo2 name3 luzhuo3

                    获取:
                        根据键获取值: GET key // 不存在此键则返回nil
                            get name
                        根据多个键获取多个值: MGET key [key ...]
                            mget name namem2 name3

                    运算: 值必须为数字字符串
                        值+1: INCR key
                            incr num
                        值-1: DECR key
                            decr num
                        值+整数: INCRBY key increment
                            incrby num 100
                        值-整数: DECRBY key decrement
                            decrby num 100

                    其他:
                        追加值: APPEND key value
                            append num abc
                        获取值长度: STRLEN key
                            strlen num

                hash对象:
                    添加:
                        添加单个属性: HSET key field value (key键, field属性, value属性值)
                            hset name10 website luzhuo.me
                        添加多个属性: HMSET key field value [field value ...]
                            hmset name11 f1 v1 f2 v2

                    获取:
                        获取一个属性值: HGET key field
                            hget name10 website
                        获取多个属性值: HMGET key field [field ...]
                            hmget name11 f1 f2
                        获取所有属性和值: HGETALL key
                            hgetall name11
                        获取所有属性的键: HKEYS key
                            hkeys name11
                        获取所有属性的值: HVALS key
                            hvals name11
                        获取属性个数: HLEN key
                            hlen name11

                    其他:
                        判断属性是否存在: HEXISTS key field
                            hexists name11 website
                        删除属性+值: HDEL key field [field ...]
                            hdel name11 f1
                        返回属性值的长度: HSTRLEN key field
                            hstrlen name11 f2

                list: 按照插入顺序排序
                    添加:
                        头部插入元素: LPUSH key value [value ...]
                            lpush nameList luzhuo.me
                        尾部插入元素: RPUSH key value [value ...]
                            rpush nameList luzhuo
                        (无效)在元素之前|后插入: LINSERT key BEFORE|AFTER pivot value
                            linsert nameList after luzhuo.me me
                        设置索引的元素值: LSET key index value (+正数, -倒数, 0为第一个元素, -1为最后一个元素)
                            lset nameList 0 setValue
                    获取:
                        弹出key的第一个元素: LPOP key
                            lpop nameList
                        弹出key的最后一个元素: RPOP key
                            rpop nameList
                        获取key列表里指定范围的元素: LRANGE key start stop (0开始, -倒数, -1最后一个元素)
                            lrange nameList 0 -1

                    其它:
                        修剪列表:LTRIM key start stop (直接修剪原列表)
                            ltrim nameList 0 -1
                        key的list长度: LLEN key
                            llen nameList
                        key里索引对应的元素: LINDEX key index
                            lindex nameList 2

                set: (无序集合, 元素具有唯一性, 不重复)
                    添加:
                        添加元素: SADD key member [member ...]
                            sadd nameSet luzhuo

                    获取:
                        key集合所有的元素: SMEMBERS key
                            smembers nameSet
                        集合元素个数: SCARD key
                            scard nameSet

                    其它:
                        求多个集合的交集: SINTER key [key ...]
                            sinter nameSet name1
                        求某集合与其它集合的差集: SDIFF key [key ...]
                            sdiff nameSet name1
                        求多个集合的合集: SUNION key [key ...]
                            sunion nameSet name1
                        判断元素是否在集合中: SISMEMBER key member
                            sismember nameSet luzhuo.me

                zset: (有序集合, 元素具有唯一性, 不重复, 每个元素按关联的score(权重, double类型)从小到大排序)
                    添加:
                        添加: ZADD key score member [score member ...]
                            zadd nameZset 1 luzhuo.me 2 luzhuo 3 me

                    获取:
                        指定范围内的元素: ZRANGE key start stop
                            zrange nameZset 0 100
                        元素个数: ZCARD key
                            zcard nameZset
                        score在min和max范围内的元素: ZCOUNT key min max
                            zcount nameZset 0 100
                        获取元素的score值: ZSCORE key member
                            zscore nameZset luzhuo

发布订阅: (无需主动去获取消息, 只需要订阅频道, 这个频道的内容就会被推送过来)
    消息格式:
        消息类型 | 频道 | 内容

        消息类型: 
            subscribe: 订阅成功
                第二部分是频道, 第三部分是订阅频道的数量
            unsubscribe: 取消订阅成功
                第二部分是频道, 第三部分是订阅的频道的数量
            message: 其它终端发布消息
                第二部分是来源频道的名称, 第三部分是消息的内容

        订阅命令:
            订阅: SUBSCRIBE 频道名称 [频道名称 ...]
                subscribe luzhuo.me
            取消订阅: UNSUBSCRIBE 频道名称 [频道名称 ...] (无参数, 取消全部)
                unsubscribe luzhuo.me
            发布消息: PUBLISH 频道 消息正文 (再开一个客户端进行发消息)
                publish luzhuo.me "这是一则新消息"

主从配置: (主从可以 多对多: n*master:n*slave)
    步骤:
        1*.配置主服务器:
            bind 192.168.1.100

        2*.配置从服务器:
            bind 192.168.1.101
            slaveof 192.168.1.100 6379

        3.主服务器上添加数据:
            set luzhuo.me "this is a new message."

        4.从服务器上获取数据:
            get luzhuo.me

'''


import redis

def redis_demo():
    '''
    安装包:
        pip install redis
    '''

    # 连接
    try:
        r = redis.StrictRedis(host='localhost', port=6379)
    except Exception as e:
        print(e)

    # 方式一: 执行一条命令
    # 添加获取数据
    r.set('luzhuo.me', 'luzhuo')
    value = r.get('luzhuo.me')
    print(value)  # b'luzhuo'

    # 方式二: 执行多条命令
    # 管道 (缓冲多条命令)
    pipe = r.pipeline()
    pipe.set('luzhuo', 'me')
    pipe.get('luzhuo')
    pipe_value = pipe.execute()
    print(pipe_value)  # [True, b'me']


if __name__ == '__main__':
    redis_demo()

猜你喜欢

转载自blog.csdn.net/Rozol/article/details/81874154