Python3 数据库(MySQL/MongoDB/Redis)
本文由 Luzhuo 编写,转发请保留该信息.
原文: https://blog.youkuaiyun.com/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()