MongoDB

安装MongoDB与部分操作看这里
在robot 3T中的直接操作
一些必要的解释:
数据有三种显示模式: 树状、表格(更直观)、文本(便于复制)
1.插入json数据:
db.getCollection('1').insertOne({“name”: "杨宗元"})
#json必须使用双引号
2.更新
db.getCollection('1').updateMany({'name': '杨宗元'},{'$set':{'address': 'suzhou'})
#name用来标定谁更新, {'$set':{'address': 'suzhou'}代表更新及其内容
#数字的更新用$inc
3.删除数据
db.getCollection('1').deleteMany({"age": {'$gte': 25})
#返回值中acknowledge为True代表删除成功;deletedCount代表删除的个数
4.数据去重
db.getCollection('1').distinct("age")
#去除age相同的
3.查询
db.getCollection('1').find({"age": {'$gte': 25})#重要
#具体也可以看上面的链接
4.不显示或只显示(返回)
db.getCollection('1').find({"name": 0) #不显示name这个键
db.getCollection('1').find({"name": 1) #只显示name这个键
#注意0、1不能一起混用
5.统计个数
db.getCollection('1').find({"age": {'$gte': 25}).count()#由于find,所以是显示+个数统计
db.getCollection('1').find({"age": {'$gte': 25}).limit(4)#限制显示个数,此处为4。
6.排序
db.getCollection('1').find({"age": {'$gte': 25}).sored({'age': -1})按年龄降序
在python中操作MongoDB
命令与上面接近,具体参照上面的链接。对collection有操作,这个数据库才会创建,也就是说不存在空白数据库。创建和调用是同一个命令。many和one的区别是,many是用来操作包含字典的集合
几个需要注意的地方
mongodb自动将none转为null,将True或者False转为true或者false
redis
内存的读写速度远大于硬盘,高效的做法是将硬盘里需要的数据导出给变量放在内存中,操作变量完成后存放到数据库。
不同进程共享变量,过程繁琐。而程序变量虽然速度快但局限性大。数据库的速度能够做到频繁读写也不影响性能就完美了。
说明:windows版本下redis不稳定,不是官方的。建议使用linux
命令行中的操作
1.字符串(虽然叫字符串但不止字符串,也可以是数字等)
字符串适合小量级的记录存储,简单的映射关系会大量消耗内存。不要盲目使用keys * ,会对Redis性能产生短暂影响可能卡死
1)是redis的基础数据结构之一,由key和value组成。
2)key相当于python变量名,value相当于变量值
3)key可以数字、英文、下划线
4)value任意,
首先开启
1)导入字符串:set a b ,其中a为key,b为value。 **补充set key value ex=120 这个可以在120秒后过期而被删除。ttl key,查询是否过期,返回None则表示以备删除,返回-1表示此key未设置ex,返回其他数代表剩余的时间
2)查询已有key : keys * (有空格) 所以的key,不止字符串的
3)读取value: get a ,其中 a为对应的键。如果输入key不存在则返回nil
4)修改字符串分为:1、替换掉之前的,直接1)的方法(set a b NX,可以防止被替换,而是无则建立,有则不操作)
2.在value尾加字符串,则append a c
3.当有空格时需要用双引号括住整个value,如 set a “b c”,否则会报错
5)value值也可以是数字,对数字的操作:1、incr a, 数字加1, incrby a n,数字加n
2、decr, 数字减1, decrby a n,数字减n
6)strlen,查看字符串长度(value个数)
2.列表,分左(l)右®,不要轻易显示全部列表,应先查看长度再决定
redis是单线程单进程的,所以即使很多访问也会让他们排队,确保不会漏过或者重复操作数据,牛逼在于即使排队,速度还是很快(比如遍历打电话)
以右为例:
rpush key value1 value2,可以依次推入多个value,结果为value1 value2(因为从右推入,且value1推入时在value2前面)
rpush key “a1 a2”, 带空格时需要加双引号
rpop key ,从右弹出第一个数据,数据同时被删除
#以下就不分左右了(l代表list)
llen key ,查看长度(value的个数)
lset key 2 4,替换,将第3位的value换为4
ltrim key -20 -1 只保留最右边的20条数据
lrange key 0 6 ,索引到第1到7
lrange key 0 0 ,仅索引第1
支持“负索引” lrange key 0 -1,显示所有。如lrange key 0 -2,从第1到倒数2(包括)。如lrange key -1 -1,仅显示最后一个数。
3.集合set,没有顺序,不可重复。
1)数据去重;2)利用交并差集
sadd key value, 在key中添加value,不存在时添加返回1,存在再添加返回0(也不会添加成功)
scard key, 查询key中value的数量
spop key n, 随机抓取n个数,并在key中删除(抓取1时,n不用写)
smembers key, 获取全部value(不删除)。元素过多时慎重使用
sismember key value, 查询value在不在key中,存在返回1,不存在返回0
srem key value, 删除特定元素
#交并集
sinter key1 key2, 返回交集的value
sunion key1 key2 ,返回并集的value
sdiff key1 key2, 返回key1-key2,也就是差集
在python中的操作
1.字符串
首先
import redis
client = redis.Redis()#后面都是基于client
基本操作相同
client.keys()#key * #返回为byte结构的列表,可以遍历后使用decode()
client.set('key', 'value')# set a b
client.get('key')
…………
#不同
client.incr('key', n)#incrby key n
…………
2.列表(与命令行基本一致)
client.lpush('example_list', 'python')#在key为example_list的列表中从左往右添加‘python’
#添加的数据量很大的情况下
datas = ['a', 'aca', 'bn']
client.lpush('example_list', *datas)
client.llen('example_list')#显示长度
client.lrange('example_list', 0, -1)#返回为byte结构的列表
client.lpop('example_list').decode()#弹出左边第一个数转化为可认识的,并在列表中删除
3.集合(与命令行基本一致)
client.sadd('example_set', 'python')
datas = ['a', 'aca', 'bn']
client.sadd('example_list', *datas)
#诸如spop、smembers等value显示时均以byte数据结构
案例点睛(聊天室):
1.判断用户名是否重复:集合,创建user的key,value为不同的用户名
2.聊天信息:列表,创建chat_list的key,value为聊天信息
3.限制刷屏(同一用户短时间发表相同的信息):利用key会过期的性质,以用户名_内容为key并设置过期时间,过期前不能发言(用ttl判断时间)