天天看点

redis与mongodb的快速入门MongoDBredis

MongoDB

redis与mongodb的快速入门MongoDBredis

安装MongoDB与部分操作看这里

在robot 3T中的直接操作

一些必要的解释:

redis与mongodb的快速入门MongoDBredis

数据有三种显示模式: 树状、表格(更直观)、文本(便于复制)

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是用来操作包含字典的集合

redis与mongodb的快速入门MongoDBredis

几个需要注意的地方

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任意,

首先开启

redis与mongodb的快速入门MongoDBredis

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判断时间)