一,什么是NoSQL
NoSQL
NoSQL = Not Only SQL (不仅仅是SQL)
关系型数据库:表格,行,列
泛指非关系型数据库,随着web 2.0 互联网的诞生!传统的关系型数据库很难对付 web 2.0 时代 !
尤其是超大规模的高并发的社区!暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型 用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!不需要多月的操作就可以横向扩展的!Map<String,Object> 使用键值对来控制!
NoSQL 特点
解耦!
1,方便扩展(数据之间没有关系,很好扩展!)
2,大数据最高性能(Redis 一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)
3,数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)
4,传统 RDBMS 和 NoSQL
传统的 RDBMS 数据库
- 结构化组织
- SQL
- 数据和关系都存在单独的表中
- 操作操作,数据定义语言
- 严格的一致性
- 基础的事务
- .......
NoSQL
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库(社交关系)
- 最终一致性
- CAP定理和BASE (异地多活)初级架构师!
- 高性能,高可用,高可扩
- .........
了解:3V+3高 ??? 分布式文件系统 FastDFS
二,NoSQL的四大分类
1,键值对存储 2,列存储 3,文档存储 4,图形数据库
KV键值对:
- 新浪:Redis
- 美团:Redis + Tair
- 阿里,百度:Redis + memecache
文档型数据库(bson格式 和json一样):
- MongoDB(一般必须要掌握)
- 。MongoDB 是一个基于分布式文件存储的数据库,C++ 编写,主要用来处理大量的文档!
- 。MongoDB 是一个介于 关系型数据库和非关系型数据中中间的产品!MongoDB 是非关系型数据库中功能最丰富,最像关系型数据库的!
- ConthDB
列存储数据库:
- HBase
- 分布式文件系统
图关系数据库:
- 他不是存图形,放的是关系,比如:朋友圈社交网络,广告推荐!
- Neo4j , lnfoGrid;
了解非关系数据库
三,Redis 入门
概念
Redis 是什么?
Redis (Remote Dictionary Server),即远程字典服务!
是一个开 源的使用 ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。
Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库!
Redis 能干嘛?
1,内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
2,效率高,可以用于高速缓存
3,发布订阅系统
4,地图信息分析
5,计时器,计数器(浏览量!)
特性:
1,多样的数据类型 2,持久化 3,集群 4,事务 。。。。。
注意:Wdinow 在Github上下载(停更很久了!)
==Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习!==
测试链接
Window 操作
记住一句话,Window 下使用确实简单,但是Redis 推荐我们使用Linux去开发使用!
基础的使用
Redis 默认有16个数据库
Redis 是单线程的!
明白Redis 是很快的,官方表示,Redis是基于内存操作,CPU不是Redis 性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用单线程了!
Redis 为什么单线程还这么快?
核心:redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU 上下文会切换:耗时的操作!!!),对于内存系统来说,如果没用上下文切换就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
Redis 五大数据类型:
Redis -key
keys * #查看所有的key
set name liu # set key
EXISTS name #判断当前的key是否存在
move name 1 #移除当前key
EXPIRE name 10 #设置key的过期时间,单位是秒
ttl name #查看过期时间
type name #查看当前key的一个类型
String (字符串)
set key1 v1 #设置值
get key #获取值
keys * #获取所有的key
EXISTS key1 #判断某一个key是否存在
APPEND key "hello" #追加字符串,如果当前 key 不存在,就相当于setkey
STRLEN key1 #获取字符串的长度
i++ 操作
set views 0 # 初始化浏览量为0
incr views #自增 1
decr views #自减 1
INCRBY views 10 #设置自增数量
字符串范围 renge
set key 1"liu" #设置 key1 的值
GETRANGE key1 0 3 #截取字符串 【0,3】
GETRANGE key1 0 -1 #获取全部的字符串
替换 、
SETRANGE key2 1 xx #替换指定位置开始的字符串!
setex (set with expire) #设置过期时间
setnx (set not exist) #不存在 在设置
mset k1 k2 k3 k4 #同时设置多个值
mget k1 k2 k3 #同时获取多个值
msetnx k1 k2 k3 # msetnx 是一个原子性的操作,要么一起成功,要么一起失败!
String类似的使用场景:value 除了是我们的字符还可以是我们的数字!
- 计数器
- 统计多单位的数量 uid:1 是id
- 粉丝数
- 对象缓存存储!
List :(数据类型)
基本的数据类型,列表
在Redis 里面,我们可以把List玩成,栈,队列,阻塞队列!
所有的List命令都是以L开头的
LPUSH list xxx #将一个值或者多个值,插入到列表头部
LRANGE list 0 -1 # 获取list中值!也可以区分获取值
RPUSH list righr #将一个值或多个值,插入到列表位部 (右)
LPOP list # 移除list 的第一个元素
RPOP list #移除list的最后一个元素
Lindex list 1 #获取下班的第一个值
Lpush list xxx # 添加值
Lrem list 1 xxx #移除 这个 1 是移除几个 可以重复
Ltrim mylist 12 #通过下标截取指定的长度,这个list已经被改变了 ,截断了只剩下截取的元素!
Set (集合)
set 中的值是不能重读的
sadd myset "hello" # set 集合中添加
SMEMBERS myset # 查看指定set的所有值
SISMEMBER myset hello # 判断某一个值是不是在set集合中
scard myset #获取set集合中的内容元素个数!
srem myset hello # 移除set 集合中的指定元素
SRANDMEMBER myset #随机抽选出一个元素
spop myset #随机删除一些 set 集合中的元素!
Hash(哈希)
Map集合,key -<key-vlaue> 时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的 key-vlaue!
hset myhash field1 liu #set 一个具体 key -vlaue
hget myhash field1 #获取一个字段值
hmset myhash field1 hello field2 world #获取多个字段值
hgetall myhash #获取全部的数据
hdel myhash field # 删除hash指定 key字段!对应的vlaue值也就消失了!
hlen myhash #获取myhash表的字段数量
HEXISTS myhash field1 #判断hash中指定字段是否存在!
hkeys myhash #只获取所有field
hvals myhash #只获取所有value
Zset(有序集合)
zadd myset 1 noe #添加一个值
zadd myset 2 two 3 three #添加多个值
----- 排序如何实现 --------
zadd salary 2500 xiaohong #添加三个用户
ZRANGEBYSCORE salary -inf +inf #显示全部的用户 从小到大
ZRANGEBYSCORE salary -inf +inf withscores #显示全部的用户并且附带成绩
ZRANGEBYSCORE salary -inf 2500 withscores # 显示工资小于2500 员工的降序排序
zrem salary liu #移除有序集合中的指定元素
zcard salary #获取有序集合中的个数