Redis_NoSQL入门学习笔记
Posted hesorchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis_NoSQL入门学习笔记相关的知识,希望对你有一定的参考价值。
目录
NoSQL简介
NoSQL = Not Only SQL ,意即“不仅仅是SQL”。泛指非关系型的数据库。这些类型的数据存储不需要固定的模式,无序多余操作就可以横向扩展。
特点:
-
易扩展:NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
-
大数据量高性能:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般mysql使用Query Calche,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL 的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
-
多样灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
NoSQL四种分类
- KV(键值)
- 列存储数据库
- 文档型数据库
- 图形数据库
分布式基础之CAP和BASE理论
集中式和分布式
1、集中式
集中式是指有一台或者多台计算机组成的中心节点,数据集中存储于这个中心节点中,并且整个系统的所有业务单元都集中部署在这个中心节点上,系统的所有功能均由集中处理。
2、分布式
分布式系统是一个硬件或者软件分布在不同的网络计算机上,彼此之间仅仅通过消费传递进行通信和协调的系统。
分布式系统设计理论CAP
ACID是数据库事务完整性的理论,CAP是分布式系统设计理论,BASE是CAP理论中AP方案的延伸。
CAP原理,即:
-
C:Consistency(强一致性)
在分布式系统中如果能够针对一个数据项的更新操作执行成功后,所有用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性。
-
A:Avaliability(可用性)
可用性指系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内(指用户的一个操作,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间,系统就认为不可用)返回结果(返回结果是可用性的另一个重要指标,要求系统在完成对用户请求处理后,返回一个正常的响应结果,失败或者成功,而不是一个困惑的结果)。
-
P:Partition tolerance(分区容忍性)
分布式系统在遇到任何网络分区故障的时候,仍然能够保证对外提供满足一致性或可用性的服务,除非整个网络环境发生了故障。
总结
在分布式环境中,我们会发现必须选择 P(分区容忍)要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。也就是说分区容错性是分布式系统的一个最基本要求。
在CAP理论中,不能同时满足一致性、分区容忍性、可用性,而分区又是分布式系统的基本要求,因此在架构设计的时候只能在AP或者CP中选择,也就是只能在一致性或者可用性之间取舍。
另外,CAP理论关注的粒度是数据,而不是系统,也即针对同一系统的不同数据,可能会分别采用AP和CP。
参考博客:1、分布式基础之CAP和BASE理论
BASE理论
BASE理论就是对CAP理论中的一致性和可用性权衡之后的结果,让分布式系统满足三个特性,即:
-
BA:Basically Available(基本可用)
基本可用的意思就是分布式系统如果出现不可预知的故障时,允许损失部分的可用性,但并不是整个系统都不可用,即保证系统核心服务可用即可;比如实际开发中,出现部分服务故障,我们可以让系统的响应时间适当变长,或者限流,降低消费,甚至是服务降级,让某个服务暂时无法提供服务 -
S:Soft State(软状态)
软状态就是指系统中的数据可以存在中间状态, 并该中间状态不会影响到系统的可用性;换个说法就是允许系统中部分结点的数据同步存在时延问题,但这个时延不会影响到系统的可用性 -
E:Eventual Consistency(最终一致性)
最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到数据一致的状态。既最终一致性的本质是需要系统保证数据的最终一致性,而不每时每刻的强一致性。但也要保证非一致窗口时期不会对系统数据造成危害
Redis
简介
Redis:REmote DIctionary Server(远程字典服务器),是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
常见命令
切换数据库
select 数据库编号
查看当前数据库key的数量
DBsize
列出当前数据库所有key
keys *
查看指定key的类型
type key
删除库中所有key
FLUSHDB
删除库中指定key
DEL key名
给key设置过期时间,如果key过期,会被删除。
EXPIRE key名 时间
time to live,查看key的剩余时间,如果已经过期,返回-2,如果没设置过期时间,返回-1
TTL key名
五大数据类型
一、string(字符串)
string是redis最基本的类型。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
一些常用命令:
SET name cy
GET name
SET a 1
INCR a # +1
INCRBY a step # +step
GETRANGE str L R # 取出str L-R的子串
SETEX str time value # 创建时即设置过期时间
MSET str1 v1 str2 v2 # 同时创建多个str
MGET str1 str2 # 同时获取多个str的值
SETNX a 1 # 如果不存在则创建
二、List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
他的底层是一个链表
一些常用命令:
LPUSH list名 v1 v2 v3 # 从左边依次插入,如果不存在列表,则创建
RPUSH list名 v1 v2 v3 # 从右边依次插入,如果不存在列表,则创建
LRANGE list名 L R # 查询指定范围内的值 若L=0 R=-1 则返回整个list
LPOP list名 # 删除并返回最左边的值
RPOP list名 # 删除并返回最右边的值
LINDEX list名 id # 返回下标为id的元素
LLEN list名 # 返回list长度
如果值全移除,对应的键就消失了。各操作的时间复杂度参考链表。
三、Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
一些常用命令:
SADD st 1 2 3 3 # 向集合内插入值,如果集合不存在,则创建
SMEMBERS key # 查看集合内的所有值
SCARD key # 查看集合元素个数
SREM key value # 删除集合内指定的值
SDIFF key1 key2 # 差集
SINTER key1 key2 # 交集
SUNION key1 key2 # 并集
四、Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
一些常用命令:
HSET hs1 k v # 向哈希内插入值,如果集合不存在,则创建
HMSET hs1 k1 v1 k2 v2 # 向哈希内插入多个值
HMGET hs1 k1 k2 k3 # 查看哈希内多个键对应的值
HGETALL hs1 # 查看哈希所有键值,返回形式为k1 v1 k2 v2 ...
HKEYS hs1 # 查看哈希内所有key
HVALS hs1 # 查看哈希内所有value
HLEN hs1 # 查看哈希内键值对的数量
五、zset(sorted set:有序集合)
zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
一些常用命令:
ZADD zst1 score1 v1 score2 v2 score3 v3 # 向zset插入值,若不存在,则创建
ZRANGE zst1 L R $ 按照从小到大返回第L到第R个值
持久化之RDB
RDB快照用官方的话来说:RDB持久化方案是按照指定时间间隔对你的数据集生成的时间点快照。它是Redis数据库中数据的内存快照,它是一个二进制文件(默认名称为:dump.rdb,可修改),存储了文件生成时Redis数据库中所有的数据内容。可用于Redis的数据备份、转移与恢复。
配置参数
RDB快照的触发方式及运行行为受配置参数的影响,打开配置文件redis.conf(windows版本在redis.windows.conf)查看“SNAPSHOTTING”章节,了解RDB快照的参数及作用。
-
save <seconds> <changes>
save参数是Redis触发自动备份的触发策略,seconds为统计时间(单位:秒), changes为在统计时间内发生写入的次数。save m n的意思是:m秒内有n条写入就触发一次快照,即备份一次。save参数可以配置多组,满足在不同条件的备份要求。如果需要关闭RDB的自动备份策略,可以使用save “”。以下为几种配置的说明:save 900 1:表示900秒(15分钟)内至少有1个key的值发生变化,则执行 save 300 10:表示300秒(5分钟)内至少有1个key的值发生变化,则执行 save 60 10000:表示60秒(1分钟)内至少有10000个key的值发生变化,则执行 save "": 该配置将会关闭RDB方式的持久化
-
dbfilename
:快照文件的名称,默认为dump.rdb。 -
dir
:快照文件保存目录,默认与当前配置文件在同一目录。 -
stop-writes-on-bgsave-error
:默认值为yes。如果为yes,当启用了RDB且最后一次后台保存数据失败,Redis将会停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了。 -
rdbcompression
:默认值yes。备份数据时是否使用LZF算法压缩字符串对象。默认是开启的,这样可以节约存储空间,但是在生成备份文件时消耗部分CPU。 -
rdbchecksum
:保存和加载rdb文件时是否使用CRC64校验,默认开启。启用此参数可以使rdb文件更加安全,提高稳定性,但是会有一定的性能(大约10%)损失。如果rdb文件创建时未使用校验和,那么校验和将被设置为0,以此告知Redis跳过校验。
持久化流程
在Redis内完成RDB持久化的方法有rdbSave和rdbSaveBackground两个函数方法(源码文件rdb.c中),先简单说下两者差别:
rdbSave:是同步执行的,方法调用后就会立刻启动持久化流程。由于Redis是单线程模型,持久化过程中会阻塞,Redis无法对外提供服务;
rdbSaveBackground:是后台(异步)执行的,该方法会fork出子进程,真正的持久化过程是在子进程中执行的,主进程会继续提供服务;
参考资料:https://segmentfault.com/a/1190000039208707
持久化之AOF
redis默认未开启AOF,开启方式:打开配置文件redis.conf
,修改参数:appendonly yes
AOF( append only file )持久化以独立日志的方式记录每次写命令,并在 Redis 重启时在重新执行 AOF 文件中的命令以达到恢复数据的目的。AOF 的主要作用是解决数据持久化的实时性。
如上图所示,AOF 持久化功能的实现可以分为命令追加( append )、文件写入( write )、文件同步( sync )、文件重写(rewrite)和重启加载(load)。其流程如下:
- 所有的写命令会追加到 AOF 缓冲中。
- AOF 缓冲区根据对应的策略向硬盘进行同步操作。
- 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
- 当 Redis 重启时,可以加载 AOF 文件进行数据恢复。
文件写入和同步
Redis 每次结束一个事件循环之前,它都会调用 flushAppendOnlyFile
函数,判断是否需要将 AOF 缓存区中的内容写入和同步到 AOF 文件中。
flushAppendOnlyFile
函数的行为由 redis.conf 配置中的 appendfsync 选项的值来决定。该选项有三个可选值,分别是 always
、everysec
和 no
:
-
always
:Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件,并且同步 AOF 文件,所以always
的效率是appendfsync
选项三个值当中最差的一个,但从安全性来说,也是最安全的。当发生故障停机时,AOF 持久化也只会丢失一个事件循环中所产生的命令数据。 -
everysec
:Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件中,并且每隔一秒就要在子线程中对 AOF 文件进行一次同步。从效率上看,该模式足够快。当发生故障停机时,只会丢失一秒钟的命令数据。 -
no
:Redis 在每一个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件。而 AOF 文件的同步由操作系统控制。这种模式下速度最快,但是同步的时间间隔较长,出现故障时可能会丢失较多数据。
AOF文件的重写
AOF是写日志文件,因此占用空间会越来越大,可以通过等价重写实现减小空间。
在redis.conf文件中,可以找到以下内容:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当满足文件大小大于auto-aof-rewrite-min-size
,并且当前文件大小比最近一次rewrite之后的文件大百分之auto-aof-rewrite-percentage
时,会自动触发rewrite。
注意:AOF实际的重写工作是针对数据库的当前值来进行的,程序既不读写、也不使用原有的 AOF 文件。
参考资料:AOF
事务
redis事务命令:
discard # 取消事务,放弃执行事务块内的所有命令。
exec # 执行所有事务块内的命令。
multi # 标记一个事务块的开始。
unwatch # 取消watch命令对所有key的监视。
watch key # 监视一个(或多个)key,如果在事务执行之前这个key被其他命令所改动,那么事务将会被打断。
五种情况:
-
正常执行
127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 1 QUEUED 127.0.0.1:6379> incrby a 3 QUEUED 127.0.0.1:6379> get a QUEUED 127.0.0.1:6379> exec 1) OK 2) (integer) 4 3) "4"
-
放弃事务:discard
127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 100 QUEUED 127.0.0.1:6379> discard OK
-
全体连坐:如果有编译错误,整个事务不会执行
127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 10 QUEUED 127.0.0.1:6379> ssset b 10 (error) ERR unknown command 'ssset' 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379>
-
冤头债主:如果有运行错误,只有错误的语句不执行
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name mike QUEUED 127.0.0.1:6379> incr name QUEUED 127.0.0.1:6379> set name2 john QUEUED 127.0.0.1:6379> exec 1) OK 2) (error) ERR value is not an integer or out of range 3) OK 127.0.0.1:6379> get name "mike" 127.0.0.1:6379> get name2 "john"
-
watch监控
127.0.0.1:6379> set balance 100 OK 127.0.0.1:6379> set debt 0 OK 127.0.0.1:6379> watch balance debt OK 【127.0.0.1:6379> set balance 199999】 【OK】 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby balance 10 QUEUED 127.0.0.1:6379> incrby debt 10 QUEUED 127.0.0.1:6379> exec 1) (integer) 90 2) (integer) 10
小结:
- watch指令类似于乐观锁。
- exec之后所有的监控锁都会被清除。
主从复制
建立主从关系:
slaveof 【masterip】 【masterport】
查看服务器角色:
info replication
结束与主机的连接:
slaveof no one
slave机只能读,不能写。
复制原理
Slave启动成功连接到master后会发送一个sync命令,Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
全量复制:在slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
首次连接到master使用全量复制,然后使用增量复制。但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
哨兵模式
哨兵顾名思义,就是来为Redis集群站哨的,一旦发现问题能做出相应的应对处理。其功能包括
- 监控master、slave是否正常运行
- 当master出现故障时,能自动将一个slave转换为master(大哥挂了,选一个小弟上位)
参考资料:一文掌握Redis主从复制、哨兵、Cluster三种集群模式
以上是关于Redis_NoSQL入门学习笔记的主要内容,如果未能解决你的问题,请参考以下文章