此文章只是用来做笔记,期间拖了很久,多多见谅。
一.Redis简介
我们一说到redis就会想到kv键值对,Cache(缓存)和Persistence(持久化),那么这个数据库为什么这么受到喜爱,首先要知道NoSql和关系型数据库的区别。
(一)关系型数据库遵循ACID规则
1.A(Atomicity)原子性
原子性比较好理解,用数据库事务来说就是,此次事务要么都不做,要么全部做完,比方说A向B转50块,这里分为两步,1)A账户里扣除50块;2)B账户里加50块,这两步要么一起完成,要么就不成功,若第一步完成了,第二步失败,则A少了50块,而B没收到,这显然很不合理。
2.C(Consistency)一致性
一致性就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
3.I(Isolation)独立性
独立性是指并发的事务之间不会相互影响,若一个事务要访问另一个事务正在所修改的数据时,只要另一个事务未提交,你所访问的数据就不会受其影响。比如还是上面的例子,在转账没成功之前,B怎么查看自己的账户,都不会有新增的50块。
4.D(Durability)持久性
持久性是指事务一旦提交后,它所做的修改将会永久的保存在数据库上,即使宕机也不会丢失。
(二)Nosql数据库CAP规则
1.一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
2. 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
3.分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
同时这种数据库在分布式架构的时候必须做出取舍,在一致性和可用性之间取一个平衡,通常来说我们需要保证可用性取舍弃一致性,不是说不要一致性,只是相对来说没有其他两个那么重要,比方说我们在双11购物的时候只会关心我们自己的商品是否购买成功(这里主要是网站不瘫痪),而不会去关心货物的销售数值。
为解决数据库一致性引起的问题提出的解决方案是加入BASE,也就是基本可用(Basically Available),软状态(Soft state)和最终一致性(Eventually consistent),它的思想是通过让系统放松对某一时刻的数据一致性的要求来换取的系统整体伸缩性和性能上的改观。
同时我们还得知道分布式和集群的知识,简单来说,分布式是不同的多台服务器上面部署的不同的服务模块,他们之间通过RPC/RMI进行通信和调用,对外提供服务和组内协作;集群是不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一管理。
(三)Redis入门
Redis全称REmote DIctionary Server(远程字典服务器),是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
Redis优点:1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;2)Redis不仅支持key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;3)Redis支持数据的备份,即Master-Slave模式的数据备份.
(四)Redis安装
从以上两个网址都能获取到Redis安装包,推荐使用linux系统,下载之后解压,进入redis目录,然后make即可(这里make需要安装gcc,自行安装gcc,如centos yum install gcc,然后make distclean之后再重新make),再make install进行检查。
redis-benchmark:性能测试工具,测试电脑性能
redis-check-aof:修复有问题的aof文件
redis-check-dump:修复有问题的dump.rdb文件
redis-cli:客户端,操作入口
redis-sentinel:redis集群使用,哨兵模式由它开启
redis-server:redis服务器启动命令
redis.conf和sentinel.conf手动复制一份到此目录下,主要是方便操作。
然后redis-server redis.conf启动服务
不喜欢看见这个界面就修改redis.conf文件
vim redis.conf
:/GENERAL找到daemonize no改成yes
然后重新启动
redis-server redis.conf
ps -ef | grep redis 查看是否成功启动
redis-cli -p 6379
redis默认没有密码,若要设置密码,则需要
二、Redis持久化
说到Redis持久化就不得不说rdb和aop了。
(一)RDB
RDB就是在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
运行时Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
其中fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
(二)AOF
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作,经我测试文件首先redis数据库先受aof影响,若报错则可以启动redis-check-aof修复。
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件。Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
好处在于误差不会超过两秒,劣势是在于文件比rdb要大,AOF效率比RDB慢。