NoSQL数据库Redis和MongoDB

redis简介

一些特点:

  • Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。
  • Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis支持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。
  • Redis支持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并自动调整配置)。
  • Redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
  • Redis基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了Redis客户端支持。

redis的应用场景

  • 高速缓存:将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。

  • 排行榜:很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。

  • 商品秒杀/投票点赞:Redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的update操作。

  • 分布式锁:利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。

  • 消息队列:消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性,这些我们都会在后面的项目中为大家展示。

  • Redis有着非常丰富的数据类型,也有很多的命令来操作这些数据

在python中使用redis

pip3 install redis

1>>> import redis 2>>> client = redis.Redis(host='1.2.3.4', port=6379, password='1qaz2wsx') 3>>> client.set('username', 'admin') 4True 5>>> client.hset('student', 'name', 'hao') 61 7>>> client.hset('student', 'age', 38) 81 9>>> client.keys('*') 10[b'username', b'student'] 11>>> client.get('username') 12b'admin' 13>>> client.hgetall('student') 14{b'name': b'hao', b'age': b'38'}

MongoDB简介

数据持久化的首选方案目前大多都是关系型数据库,例如:mysql、SqlServer、postgresql等,如果要存储海量的低价值数据,文档数据库也是不错的选择,MongoDB就是其中的佼佼者

MongoDB是2009年问世的一个面向文档的数据库管理系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。虽然在划分类别的时候后,MongoDB被认为是NoSQL的产品,但是它更像一个介于关系数据库和非关系数据库之间的产品,在非关系数据库中它功能最丰富,最像关系数据库。
MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象,但是MongoDB对JSON进行了二进制处理(能够更快的定位key和value),因此其文档的存储格式称为BSON。

MongoDB和关系型数据库很像

操作MongoDB

1mongo --host 172.18.61.250 2MongoDB shell version v3.6.5 3connecting to: mongodb://172.18.61.250:27017/

可以看到不用密码

  • 1.查看、创建和删除数据库

    // 显示所有数据库 show dbs admin 0.000GB config 0.000GB local 0.000GB // 创建并切换到school数据库 use school switched to db school // 删除当前数据库 db.dropDatabase() { "ok" : 1 }

  • 2.创建、删除和查看集合

    // 创建并切换到school数据库 use school switched to db school // 创建colleges集合 db.createCollection('colleges') { "ok" : 1 } // 创建students集合 db.createCollection('students') { "ok" : 1 } // 查看所有集合 show collections colleges students // 删除colleges集合 db.colleges.drop() true

  • 3.文档的CRUD操作

    // 向students集合插入文档 db.students.insert({stuid: 1001, name: '骆昊', age: 38}) WriteResult({ "nInserted" : 1 }) // 向students集合插入文档 db.students.save({stuid: 1002, name: '王大锤', tel: '13012345678', gender: '男'}) WriteResult({ "nInserted" : 1 }) // 查看所有文档 db.students.find() { "_id" : ObjectId("5b13c72e006ad854460ee70b"), "stuid" : 1001, "name" : "骆昊", "age" : 38 } { "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "王大锤", "tel" : "13012345678", "gender" : "男" } // 更新stuid为1001的文档 db.students.update({stuid: 1001}, {'$set': {tel: '13566778899', gender: '男'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) // 插入或更新stuid为1003的文档 db.students.update({stuid: 1003}, {'$set': {name: '白元芳', tel: '13022223333', gender: '男'}}, upsert=true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5b13c92dd185894d7283efab") }) // 查询所有文档 db.students.find().pretty() { "_id" : ObjectId("5b13c72e006ad854460ee70b"), "stuid" : 1001, "name" : "骆昊", "age" : 38, "gender" : "男", "tel" : "13566778899" } { "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "王大锤", "tel" : "13012345678", "gender" : "男" } // 查询stuid大于1001的文档 db.students.find({stuid: {'$gt': 1001}}).pretty() { "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "王大锤", "tel" : "13012345678", "gender" : "男" } // 查询stuid大于1001的文档只显示name和tel字段 db.students.find({stuid: {'$gt': 1001}}, {_id: 0, name: 1, tel: 1}).pretty() { "name" : "王大锤", "tel" : "13012345678" } { "name" : "白元芳", "tel" : "13022223333" }

在python中使用MongoDB

pip3 install pymongo

1>>> from pymongo import MongoClient 2>>> client = MongoClient('mongodb://127.0.0.1:27017') 3>>> db = client.school 4>>> for student in db.students.find(): 5... print('学号:', student['stuid']) 6... print('姓名:', student['name']) 7... print('电话:', student['tel']) 8... 9学号: 1001.0 10姓名: 骆昊 11电话: 13566778899 12学号: 1002.0 13姓名: 王大锤 14电话: 13012345678 15学号: 1003.0 16姓名: 白元芳 17电话: 13022223333 18>>> db.students.find().count() 193 20>>> db.students.remove() 21{'n': 3, 'ok': 1.0} 22>>> db.students.find().count() 230 24>>> coll = db.students 25>>> from pymongo import ASCENDING 26>>> coll.create_index([('name', ASCENDING)], unique=True) 27'name_1' 28>>> coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True}) 29<pymongo.results.InsertOneResult object at 0x1050cc6c8> 30>>> coll.insert_many([{'stuid': int(1002), 'name': '王大锤', 'gender': False}, {'stuid': int(1003), 'name': '白元芳', 'gender': True}]) 31<pymongo.results.InsertManyResult object at 0x1050cc8c8> 32>>> for student in coll.find({'gender': True}): 33... print('学号:', student['stuid']) 34... print('姓名:', student['name']) 35... print('性别:', '男' if student['gender'] else '女') 36... 37学号: 1001 38姓名: 骆昊 39性别:40学号: 1003 41姓名: 白元芳 42性别:43>>>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Nginx + lua +[memcached,redis]

精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用