Redis相关学习心得

**node

Redis

**
NoSQL,即Not Only SQL ,一种开源的非关系型数据库。数据都存在内存中,能够支持数据的持久化。支持简单的key-value模式。
支持的类型包括:

redis

  1. string字符串
    redis内部存储默认就是一个字符串,被redisObject引用.
  2. list链表
    简单的字符串列表,按照插入顺序进行排序,从头部和或者尾部添加
  3. set集合
    set集合是String类型的无序集合,集合成员惟一,不能出现重复的数据,经过哈希表实现的,因此添加,删除,查找的时间复杂度都为O(1)。
  4. zset有序集合
    有序的set集合,每一个元素会关联一个double类型的分数,根据分数成员从小到大排序,不容许成员重复,添加,删除,查找的时间复杂度都为O(1)。
  5. hash哈希类型
    命令:hget,hset
    适合存储对象

Redis使用单线程+多路IO复用的技术数据库

  1. 多路复用:阻塞IO(串行),非阻塞IO,IO多路复用服务器

  2. IO复用包括:select,poll,epollapp

redis事务是一个单独的隔离操做,事务中的全部命令都会序列化,按顺序的执行,事务在执行的过程当中,不会被其余客户端的命令和请求打断
操做事务的三个指令:
性能

  1. Multi 开始事务
  2. Exec 执行事务
  3. discard 中断事务

悲观锁和乐观锁

悲观锁: 悲观锁每次去拿数据的时候都认为别人会修改,因此每次拿数据的时候都会上锁,这样想拿到这个数据的人就会block直到它拿到锁,传统的关系型数据库就是这种锁机制。好比行锁,表锁,读锁,写锁都是在操做以前先上锁。lua

乐观锁:很乐观,每次拿数据的时候都认为别人不会修改数据,因此不会上锁,可是在更新数据的时候会判断在此期间有没有更新过数据,会使用版本号的机制,乐观锁适合用于多读的应用类型,这样能够提升吞吐量。redis就是利用这种check-and-set机制来实现事务的。spa

redis事务的三个特性

单独隔离操做:事务中的全部命令都会序列化,按顺序的执行。事务执行过程当中不会被其余客户端发来的请求打断
没有隔离级别的概念:队列中的命令在没有提交以前都不会被实际的执行
不保证原子性:redis中同一个事务中有一条命令执行失败的话,其余的命令仍然会执行,没有回滚

线程

持久化方式

Radis提供的2个不一样形式的持久化方式
RDB:RedisDataBase 会将数据写入到一个临时文件中,等持久化过程结束了,再用这个临时文件替换上次持久化好的文件。整个过程当中,主进程是不进行任何IO操做的,确保了极高的性能若是须要大规模数据的恢复,对数据恢复的完整性不敏感,容许丢失数据,RDB比AOF更加高效,RDB的缺点是最后一次持久化的数据可能丢失。
RDB持久化,知足RDB的保存策略,正常关闭redis,不然最后一次的数据会丢失。手动保存 命令save 只管保存,其余无论,所有阻塞 save vs bgsave
当Redis没法写入磁盘时,直接关闭Redis的写操做: stop-writes-on-bgsave-error yes
RDB保存时要进行压缩: rdbcompression yes
RDB数据的备份:将*.rdb文件拷贝;
RDB数据的恢复:关闭Redis ,把备份的文件拷到redis工做目录下,启动redis,数据会自动加载
RDB优势:节省磁盘空间,由于rdb存储的是数据结果。恢复速度快
RDB缺点:redis在fork时使用了 写时拷贝技术 ,数据庞大的话比较消耗性能。备份周期性,意外关闭会丢失最后一次的数据以及快照。
AOF:以日志的形式记录每个写操做,记录Redis执行过的写指令,(读操做不记录),只容许追加文件,不能够写文件。redis启动时会经过aof的文件从新构建数据,即从新将全部的指令执行一次来完成数据的恢复。
默认不开启,须要在配置文件中手动开启。 appendonly no ( 默认 )
保存路径在redis的工做空间下,跟rdb保持一致。
AOF 和RDB同时开启的话,AOF记录数据的的优先级大于RDB。
aof文件中写数据都是以 *$ 开头 ,执行了flush的话 能够将aof文件中的flush删除,便可恢复数据。
AOF始终同步,每次Redis写入都会当即记入日志文件中













日志

Rewrite :AOF采用的是文件追加的方式,避免文件过大,AOF增长了重写机制,当AOF的大小超过所设定的阈值时,Redis会启动AOF文件的内容压缩,只保留能够恢复的最小指令集,使用命令 bgrewriteaof 。若是保存了屡次key1的值,只会保留最后一次key1的值。
AOF如何实现重写: AOF文件过大时,会fork出一条新的进程来说文件重写,先写进临时文件中而后rename,最后覆盖,会遍历新进程中的每一条set语句。重写的aof文件并无读取旧的aof文件,而是将数据库内容用命令的方式从新写了一个aof文件
AOF重写的条件和时机: 重写能够节省大量的磁盘空间,减小恢复的时间。可是重写有必定的负担,要设定redis知足必定的条件才能进行重写。redis载入完毕时,redis会记录此时aof的大小,而且设置为base_size ,若是Redis的aof当前大小>=base_size+base_size8100%且当前大小>=64mb时重写。默认状况下。
AOF优势:备份机制更加稳健,丢失数据的几率更低。日志文件可读性高,能够处理误操做。
AOF缺点:比起RDB占用的磁盘空间更多,每次读写都同步的话,性能有必定的压力。日志文件存在个别BUG,形成不能恢复。



Redis主从复制

master/slave 一主多从 ,一写多读
读写分离,性能扩展 ,容灾快速恢复。
主要减少读 写的压力,并不能减少内存的压力,由于须要同步数据,主从都是一样的数据量。
Master 以写为主
Slave 以读为主
配置从服务器,不配置主服务器
拷贝多个redis.conf文(默认配置),而后使用include 包含默认配置,添加其余不一样的配置(include /?/?/redis.conf) 路径文件
开启 daemonize yes (后台启动)
指定端口号port
Log文件的名字
dbfilename 和 Appendonly 都要换名字或者关掉。 由于不能让多台服务器产生的rdb,aof文件重名。
打印主从复制的相关信息命令: info replication
成为某个实例的从服务器: slaveof











一主二仆:从服务器切入后,主服务器和从服务器的数据永远保持一致,无论从服务器何时加入。从服务器不能写数据(set)。
主服务器shutdown后,从服务器会等待主服务器上线。

主从复制的原理:
每次从服务器联通后,都会给主机发送sync的指令,主机会马上进行存盘操做而且发送rdb文件给从服务器,从服务器接受rdb文件后进行全盘加载,以后每次主服务器写操做时都会马上发送给从服务器,从服务器会执行相同的指令。

薪火相传
上一个从服务器能够是下一个从服务器的主服务器,这个slave从服务器一样能够接受其余slave从服务器的链接和同步请求,有效减轻主服务器的写压力,去中心化下降风险。
slaveof no one (此命令是不作任何一台主服务器的从服务器) 在主服务器宕机以后,能够用此命令将当前的从服务器提高为主服务器,就能够进行写的操做了。

哨兵模式

sentinel
监控主机是否故障,若是故障会根据投票数自动将从服务器转换为主服务器。
sentinel.conf 文件 配置内容
sentinel monitor mymaster 127.0.0.1 6379 1
哨兵 1:表明 至少有一个哨兵认为服务器宕机,那么服务器就是宕机了
启动哨兵命令 : redis-sentinel sentinel.conf




故障恢复

主服务器shutdown后,会在其全部的从服务器中挑选一个从服务器做为新的主服务器,新的主服务器出来后,sentinel会向原主服务器发送slaveof 新主服务器的命令 ,复制新master主服务器。当旧的主服务器从新上线时,sentinel会向其发送slaveof命令,让它成新主服务器的从服务器。
选择的条件依次为:
1.优先级靠前的,优先级在redis-conf 中改 slave-priority 100 ,值越小优先级越高
2.偏移量最大的,偏移量是指 从原主服务器获取数据最多的
3.runid最小的从服务器,每一个redis实例启动后都会随机生成一个40位的runid



Redis 集群

Redis集群实现了对Redis的水平扩容,启动N个Redis节点,将整个数据库分布存储到这N个节点中,每一个节点存储总数据的1/N。
Redis集群经过分区来提供必定程度的可用性,即便集群中的一部分节点失效或者没法通信,集群也能够继续处理命令请求

1.制做n个实例集群的相关操做

  • 制做n个实例

  • 拷贝多个redis.conf 文件 而后include

  • 开启 daemonize yes 后台启动

  • 改端口,log文件名字,rbd,aof文件的名字

2.redis cluster 配置修改

  • cluster-enabled yes 打开集群模式

  • cluster-config-file nodes-6379.conf 设定节点配置文件名

  • cluster-node-timeout 15000 设定节点失联的时间,超过该时间(ms),集群自动进行主从切换

一个集群中至少要有三个主节点
选项 --replicas 1 表示 咱们但愿为及群众的每一个主节点建立一个从节点
分配原则尽可能保证每一个主数据库运行在不一样的ip地址,每一个从库和主库不在同一个ip地址

slots 插槽(hash slot)
不在一个slot下的键值,是不能够用mget,mset等来进行多键操做的,能够用{ } 来定义组的概念,从而使key中{ } 的内容键值对放到同一个slot中去

集群好处:
实现了扩容
分摊了压力
无中心配置相对简单


集群的缺点: 多键操做不被支持 多键的Redis事务不被支持,lua脚本不被支持 旧项目要迁移至redis cluster 迁移难度大,复杂度大。

相关文章
相关标签/搜索