NoSQL、Redis说明

一、NoSQL的四大分类

1.KV键值对Redis、Tair、memecache
2.文档型数据库(bson格式 和json一样)
 MongoDB
    MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档
 MongoDB是一个介于关系型数据库和非关系型数据库中 中间产品,是非关系型数据库中功能最丰富最想关系型数据库的	
3.列存储数据库
* Hbase
* 分布式文件系统
4.图关系数据库    他不是存图形,放的是关系,比如朋友圈社交网络,广告推荐!Beo4j,InfoGrd5.

四者的对比
在这里插入图片描述
Redis
1.redis是什么
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2.redis能干嘛
① 内存存储、持久化,内存中是断电即失、所以持久化很重要(rdb、aof)
②效率高,可用于高速缓存
③发布订阅系统
④地图信息分析
⑤计时器、计数器(浏览量)
3.特性
①多样的数据类型
②持久化
③集群
④事务
二、redis-benchmark性能测试
1.redis性能测试工具可选参数如下所示:
在这里插入图片描述
2.测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
在这里插入图片描述
三、Redis基础知识
1.redis有16个数据库
切换数据库:selelct 3
查看当前数据库有多少数据:DBSIZE
清除当前数据库:flushdb
清空全部数据库:FLUSHALL
2.Redis是单线程的
Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现就使用单线程了。2.1Redis为什么单线程还这么快?
* 误区1:高性能的服务器一定是多线程的?
* 误区2:多线程(CPU上下文会切换)一定比单线程效率高?

CPU>内存>硬盘速度    核心:redis是将所有的数据全部放在内存中的,所以使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:好事的操作 ),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存情况下,这就是最佳方案。四、RedisKey的基本命令    判断某个key是否存在:EXISTS name    移除:move name    设置过期时间: EXPIRE name 10    查看当前key剩余过期时间:ttl name    查看当前key的类型: type name五大数据类型1.String类型    追加字符串:APPEND key1 "hello"    查看字符串长度:STRLEN key1    自增1:incr key1    减1:decr key1    累加设定值:INCRBY key1 9    累减设定值:DECRBY key1 9    截取字符串:GETRANGE key1 0 3   #截取字符串[0,3]    替换指定位置开始的字符串:SETRANGE key1 1 xx    设置key2值为hello,30s后过期:setex key2  30 "hello"    批量设置值:mset k1 v1 k2 v2    获取多个值:mget k1 k2    设置一个user:1 对象 值为json字符来保存一个对象:        set user:1{name:zhangsan,age:3}    使用场景:
* 计数器
* 统计多单位的数量
* 粉丝数
* 对象缓存存储

2.List类型在redis中可以把list完成堆、栈、队列、阻塞队列所有的list命令都是以L开头的 将一个或多个值插入到列表头部(左):LPUSH one 取出列表中指定位置的值:LRANGE list 0 1 从尾部插入一个或多个值(右):RPUSH right 移除list中的值:Lpop list #移除第一个元素 Rpop list #移除最后一个元素 通过下标获得某个值:lindex list 1 返回列表的长度:Llen list 移除指定的值:lrem list 1 one #1代表移除几个 通过下标截取指定长度:ltrim mylist 1 2 #list已经被改变,只剩下截取的元素。 移除列表的最后一个元素,将他移动到新的列表中:rpoplpush mylist mylist2 在列表中元素之前添加一个元素:LINSERT mylist before/after world new3.set类型 添加一个值:sadd myset “hello” 查看指定set的所有值:SNENEERS myset 判断某一个值是否在se集合中:SISMEMBER myset hello 获得set集合中的内容元素个数:scard myset 移除一个值:srem myset hello 随机抽选一个元素:SRABDNERS myset 随机抽选两个元素:SRABDNERS myset 2 随机删除一些set集合中的元素:spop myset 移动元素到另一个set集合:smove myset myset2 “hello” 两个集合的差集:SDIFF key1 key2 两个集合的交集:SINER key1 key2 并集:SUNION key1 key24.Zset类型 添加元素:zadd myset 1 one 添加多个值:zadd 五、redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中会按照顺序执行,一次性、顺序性、排他性执行一系列的命令①Redis事务没有隔离级别的概念②所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会被执行③redis单条命令是保存原子性的,但是事务不保证原子性事务操作: #开启事务(multi) #命令入队(…) #执行事务(exec) #取消事务(discard)异常: #编译型异常,代码有问题,事务中所有命令都不会被执行 #运行时异常,如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常监控: 悲观锁:什么时候都会出问题,无论做什么都会加锁 乐观锁:认为什么时候都不会出问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据redis监视测试 监视对象(加锁):watch 取消监控(解锁):unwatch测试多线程修改值,使用watch可以当做redis的乐观锁操作六、Redis集群 redis有三种集群模式:主从模式、Sentinel模式(哨兵模式)、Cluster模式1.主从模式 主从模式是三种模式汇总最简单的,数据库分为两类:主数据库(master)和从数据库(slave) 特点:
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave智能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master

工作机制:当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后再后台保存快照(EDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的命令都会同步发送给slave,保证主从数据一致性。    缺点:master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。2.哨兵模式    主从模式的弊端是不具备高可用性,当master挂掉以后,redis将不能再对外提供写入操作,因此sentinel应运而生。    特点:
* sentinel模式是建立在主从模式的基础上,如果只有一个redis节点,sentinel就没有任何意义
* 当master挂掉以后,sentinel会在slave中选择一个作为master,并修改他们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
* sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
* 多sentinel配置的时候,sentinel之间也会自动监控
* 当主从模式设置密码时,sentinel也会同步将配置信息修改到配置文件中
* 一个sentinel或sentinel集群可以管理多个主从redis,多个sentinel也可以监控同一个redis
* sentinel最好不要和redis部署在同一台机器,不然redis的服务器挂了以后,sentinel也挂了

工作机制:
* 

每个sentinel以每秒一次的频率向它所知的master,slave以及其他sentinel实例发送一个PING命令
*
如果一个实例距离最后一次有效回复PING命令的时间超过down-after-millisenconds选项所指定的值,则这个实例会被sentinel标记为主观下线。
*
如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
*
在有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态,则master会被标记为可观下线
*
在一般情况下,每个sentinel会以每10秒一次的频率向它已知的所有master,slave发送INFO命令
*
当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送INFO命令的频率会从10秒一次改为1秒一次
*
若没有足够数量的sentinel同意master已经下线,master的可观下线状态就会被移除;若master重新向sentinel的PING命令返回有效回复,master的主观下线状态就会被移除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值