NOSQL 介绍

什么是NOSQL:

        NOSQL指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,它具有非关系型、分布式、不提供ACID的数据库设计模式等特征。NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

哪些数据库是NOSQL:

   1.redis:

        (全称是:Remote Dictionary Server)是一个开源的Key-Value类型的高性能缓存数据库整              个数据库全部加载在内存中进行操作,支持数据的持久化,可以将内存中的数据保存在磁盘               中,重启的时候可以再次加载进行使用;支持多种数据类型。

        优点:由于是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作 ,支                       持丰富的数据类型,多个操作支持事务。

        缺点:Redis的数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此                           Redis适合的场景主要局限在较小数据量的高性能操作和运算;缓存和数据库双写一致                     性问题,如果不能保证缓存跟数据库的一致性就会导致请求获取到的数据不是最新的                       数据。

  2.mongodb:

                 MongoDB是一个基于文档型数据库,MongoDB中文档数据,使用JSON类似的结构作                    为数据格式,一条文档就是一条记录(含数据和数据结构),一条记录中包含若干个键                  值对键值对由两部分组成键(key)又叫字段,值可以是普通值,可以是字符型,整形                     等。

          优点:高性能 提供了json xml等可嵌入数据快熟处理功能,提供了文档的索引功能以提高查                       询速度

                     丰富的查询语言:为数据的聚合 结构文档  地理空间提供了丰富的查询功能

                     高可用性:提供了自动故障转移功能和数据冗余功能。

                     高水平的扩展能力:提供了多服务器集群数据分布式数据处理的能力

          缺点:不支持事务操作,占用空间过大,没有如MySQL那样成熟的维护工具

  3.memcache

                    Memcache是一个高性能的 分布式 的内存对象缓存系统,通过在 内存 里维护一个统               一的巨大的 hash表 ,它能够用来存储各种 格式 的数据,包括 图像 、 视频 、 文件 以及               数据库 检索的结果等。. 简单的说就是将数据调用到 内存 中,然后从内存中读取,从而                 大大提高读取速度。

        优点:内存存储,速度快,对于内存的要求高;就是采用可分布式扩展模式。

        缺点:不可持久化储存,存储数据有限制(大于1M自动分割)集群数据没有复制和同步机                         制。

练习:

   redis:

1、 string类型数据的命令操作:
	(1) 设置键值:
		127.0.0.1:6379> set key1 5
	(2) 读取键值:
		127.0.0.1:6379> get key1
		"5"
	(3) 数值类型自增1:
		127.0.0.1:6379> INCR key1
		(integer) 6
	(4) 数值类型自减1:
		127.0.0.1:6379> decr key1
		(integer) 5
	(5) 查看值的长度:
		127.0.0.1:6379> STRLEN key1
		(integer) 1
	2、 list类型数据的命令操作:
	(1)对列表city插入Shanghai Suzhou Hangzhou 元素
			127.0.0.1:6379> LPUSH city value Shanghai Suzhou Hangzhou
			(integer) 3
	(2)将列表city里的头部的元素移除
		127.0.0.1:6379> lpop city
		"Hangzhou"
	(3)将name列表的尾部元素移除到number列表的头部
			127.0.0.1:6379> lrange name 0 -1
			1) "wngwu"
			2) "lishi"
			3) "zhangshan"

			127.0.0.1:6379> lrange numder 0 -1
			1) "7"
			2) "5"
			3) "3"
			4) "1"
			
			
			127.0.0.1:6379> RPOPLPUSH name numder
			"zhangshan"
			127.0.0.1:6379> lrange numder 0 -1
			1) "zhangshan"
			2) "7"
			3) "5"
			4) "3"
			5) "1"
		
	(4) 对一个已存在的列表插入新元素
        127.0.0.1:6379> lrange name 0 -1
        1) "wngwu"
        2) "lishi"
        3) "rongqi"

	(5)查看list的值长度
        127.0.0.1:6379> llen name
        (integer) 3
        127.0.0.1:6379> llen numder
        (integer) 5

	3、 hash类型数据的命令操作:
	 (1) 设置一个hash表,order表里包括的键值信息有:id:1,customer_name:张三
		127.0.0.1:6379> HMSET order id 1 customer_name 张三
		OK
	(2) 创建一个hash表,表里的键值批量插入
        127.0.0.1:6379> hmset order id 2 customer_name lishi
	(3) 获取order对应的map的所有key
        127.0.0.1:6379> hgetall order
        1) "id"
        2) "1"
        3) "customer_name"
        4) "zhangshan"
	(4) 获取order对应的map的键值数量
	    127.0.0.1:6379> HVALS order
        1) "1"
        2) "zhangshan"
	(5) 获取order表里的id值
	    127.0.0.1:6379> hget order id "1“
	4、Keys相关的命令操作
	(1) 查看key是否存在
        127.0.0.1:6379> EXISTS KEY1
        (integer) 1

	(2) 查找满足pattern的keys
        127.0.0.1:6379> KEYS *pattern*
        (empty list or set)
	(3) 查看key的超时时间
        127.0.0.1:6379> TTL KEY1
        (integer) -1
        127.0.0.1:6379> PTTL KEY1
        (integer) -1
	(4) 遍历key
        127.0.0.1:6379> KEYS *
        1) "KEY"
        2) "numder"
        3) "order"
        4) "KEY2"
        5) "KEY1"
        6) "name"
        7) "key1"

   mongodb:

1. 创建一个数据库 名字grade 
> use grade;
switched to db grade
2. 数据库中创建一个集合名字 class
> db.createCollection("class") 
3. 集合中插入若干数据 文档格式如下
{name:'zhang',age;10,sex:'m',hobby:['a','b','c']}
hobby: draw  sing  dance  basketball football  pingpong  computer 


> db.class.insert(
... [
... {name:'zhang',age:11,sex:'m',hobby:['draw','sing']},
... {name:'shan',age:5,sex:'m',hobby:['draw','computer']},
... {name:'li',age:6,sex:'m',hobby:['football','pingpong','computer']},
... {name:'shi',age:7,sex:'m',hobby:['draw']},
... {name:'wang',age:8,sex:'m',hobby:['sing','pingpong']},
... {name:'hong',age:9,sex:'f',hobby:['computer','pingpong']},
... {name:'ming',age:4,sex:'f',hobby:['pingpong']},
... {name:'yi',age:3,sex:'f',hobby:['dance']},
... {name:'feng',age:2,sex:'m',hobby:['sing','computer']},
... ],
... 
... {ordered:true}
... 
... )
BulkWriteResult({
	"writeErrors" : [ ],

查找

查看班级所有人信息
db.class.find()
查看班级中年龄为8岁的学生信息
> db.class.find({"age": 8})
查看年龄大于10岁的学生信息
> db.class.find({"age":{$gt:10}})
查看年龄在 4---8岁之间的学生信息
>db.class.find({"age": {$gt: 4, $lt: 7}})
找到年龄为6岁且为男生的学生
> db.class.find({"age":6,"sex": "m"})
找到年龄小于7岁或者大于10岁的学生
> db.getCollection('grade_1_2').find({$or: [{"age": {$lt: 7}}, {"age": {$gt: 10}}]})
找到年龄是8岁或者11岁的学生
> db.class.find({"age": {$in: [8, 11]}})
找到兴趣爱好有两项的学生
> db.class.find({"hobby": {$size: 2}})
找到兴趣爱好有draw的学生
> db.class.find({"hobby": "draw"})
找到既喜欢画画又喜欢跳舞的学生
> db.class.find({"hobby": {$all: ["draw", "dance"]}})
统计爱好有三项的学生人数
> db.class.find({"hobby": {$size: 3}}).count()
找出本班年龄第二大的学生
> db.class.find({}).sort({"age": -1}).limit(1).skip(1)
查看学生的兴趣范围
> db.class.distinct('hobby')
将学生按年龄排序找到年龄最大的三个
> db.class.find({}).sort({"age": -1}).limit(3)
删除所有 年级大于12或者小于4岁的学生
>  db.class.remove({$or:[{"age":{$lt:4}},{"age":{$gt:12}}]})

增加、更新、删除、统计
1. 将小红的年龄变为8岁 兴趣爱好变为 跳舞 画画
> db.class.update({"name": "hong"}, {$set: {"age": 8, "hobby": ["dance", "draw"]}})
2. 追加小明兴趣爱好  唱歌
db.class.update({"name": "ming"}, {$push: {"hobby": "sing"}})
3. 小王兴趣爱好增加  吹牛 打篮球
db.class.update({"name": "wang"}, {$push: {"hobby": {$each: ["brag", "basketball"]}}})
4. 小李增加爱好,跑步和唱歌,但是不要和以前的重复
db.class.update({"name": "li"}, {$addToSet: {"hobby": {$each: ["sing", "basketball"]}}})
5. 该班所有同学年龄加1
> db.class.update({}, {$inc: {"age": 1}}, {multi: true})
6. 删除小明的sex属性
> db.class.update({"name": "ming"}, {$unset: {"sex": 1}})
7. 删除小李兴趣中的第一项
> db.class.update({"name": "li"}, {$pop: {"hobby": -1}})
8. 将小红兴趣中的画画爱好删除
> db.getCollection('class').update({"name": "hong"}, {$pull: {"hobby": "sing"}} )

增加分数域 score:{'chinese':88,'english':78,'math':98}
1. 按照性别分组统计每组人数
> db.class.aggregate({"$group":{"_id":"$sex",count:{"$sum":1}}})
{ "_id" : null, "count" : 1 }
{ "_id" : "f", "count" : 1 }
{ "_id" : "m", "count" : 4 }

2. 按照姓名分组,过滤出有重名的同学
> db.class.aggregate({"$group":{"_id":"$name",count:{"$sum":1}}},{$match:{count:{$gt:1}}})
3. 统计每名男生的语文成绩
> db.class.aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
4. 将女生按照英语分数降序排列
> db.class.aggregate([{$match:{sex:'f'}},{$sort:{'score.english':-1}}])

你可能感兴趣的:(nosql,数据库)