当前位置: 首页 > news >正文

[NOSQL] Redis介绍

Redis概述

Redis是Salvatore Sanfilippo在2009年为其初创公司LLOOGG开发的。眼下仍是独立项目。但VMWare赞劣了项目(作者是其雇员)。它採用C语言实现,因此性能非常好。

採用BSD许可证。使用键值存储。和Amazon Dynamo,Cassandra,Riak。Voldemort,Memcache相似。

支持丰富的数据类型。比方数组,链表。集合等,非常适合须要表达时间线的web服务。比如微博。

Redis支持的数据类型有:

  • 字符串
  • 链表
  • 集合
  • 有序集合
  • 散列表

Redis的主从复制

Redis自带有主从复制的功能,仅仅要设置配置文件redis.conf的slaveof选项就可以,例如以下所看到的:

Redis的高可用

眼下为止,Redis官方还在开发redis-cluster,可參考http://redis.io/topics/cluster-spec,中译版http://www.cnblogs.com/chang290/archive/2012/09/05/2672506.html

但我们能够使用keepalived+redis的方法实现高可用,例如以下所看到的:

1. redis的配置
主机     port   角色
redis0 6379   master
redis1 6379   slave


2. keepalived的配置
redis0和redis1使用一个虚拟ip

并使用例如以下脚本监控redis服务是否存活:

#!/bin/bash
/usr/local/bin/redis-cli -h 192.168.1.53 -p 6379 info > /dev/null
if [ $? -eq 0 ]; then
        echo "redis OK"
        exit 0
else
        echo "no redis service found!"
        /usr/local/bin/redis-server /path/to/redis.conf
        # try to start it again
        /usr/local/bin/redis-cli -h 192.168.11.53 -p 6380 info > /dev/null
        if [ $? -eq 0 ]; then
                exit 0
        else
                # restart failed
                killall keepalived
                echo "error"
        fi
fi


要实现redis的故障恢复,能够使用keepalived配置的notify_master, notify_backup这两个方法运行特有的脚本。实际上仅仅要在slave(即redis1)上有2个脚本,第一个用于在redis1接管虚拟ip之后。运行slaveof no one把自己变成master。第二个是在redis1交出虚拟ip之后,在redis0运行slaveof no one确保redis0恢复为主的状态。并对redis1运行slaveof redis0 6379開始又一次从master同步数据,假设自己已经是slave就不是必需同步了。
redis1上keepalived的配置方法例如以下,redis0仅仅要去掉notify_master, notify_backup两行就可以。

! Configuration File for keepalived
global_defs {
router_id redis1
}
vrrp_script Monitor_Redis {
 script "/opt/redis_keepalive.sh"
 interval 10
 weight 2
}
vrrp_instance 360 {
 state BUCKUP #(主机为MASTER,备用机为BACKUP)
 interface eth0 #(HA监測网络接口)
 virtual_router_id 110 #(主、备机的virtual_router_id必须同样)
 mcast_src_ip 192.168.11.53 #(多播的源IP,设置为本机外网IP,与VIP同一网卡)此项可不设置
 priority 70 #(主、备机取不同的优先级。主机值较大。备份机值较小,值越大优先级越高)
 advert_int 1 #(VRRP Multicast广播周期秒数)
 authentication {
  ......
}
 notify_master /opt/redis_2master.sh
 notify_backup /opt/redis_2backup.sh
 track_script {
 Monitor_Redis #(调用nginx进程检測脚本)
}
 virtual_ipaddress {
 192.168.11.4 #(VRRP HA虚拟地址)
 }
}

Redis的持久化

Redis的有下面2种的持久化机制:
  • 快照(snapshot)
  • AOF(Append Only File)
Redis的快照功能配置例如以下:

Redis快照原理例如以下:

  • Redis借助了fork命令的copy on write机制。

    在生成快照时。将当前迚程fork出一个子进程,然后在子迚程中循环全部的数据。将数据写成为RDB文件。


  • Redis原来的RDB文件不会坏掉,由于其写操作是在一个新迚程中迚行的。当生成一个新的,RDB文件时,Redis生成的子迚程会先将数据写到一个暂时文件里。然后通过原子性rename系统调用将暂时文件重命名为RDB文件,这样在仸何时候出现故障。Redis的RDB文件都总是可用的。
  • 同一时候。Redis的RDB文件也是Redis主从同步内部实现中的一环。
  • 我们能够非常明显的看到,RDB有它的不足,就是一旦数据库出现故障,那么我们的RDB文件里保存的数据并非全新的。从上次RDB文件生成到Redis停机这段时间的数据全部丢掉了。

    在某些业务下,这是能够忍受的,我们也推荐这些业务使用RDB的方式进行持久化。由于开启RDB的代价并不高。


AOF的配置例如以下:


AOF优先于RDB(即快照),RDB性能优于AOF。由于里面没有反复。
AOF Rewrite:
又一次生成一份AOF文件。新的AOF文件里一条记录的操作仅仅会有一次。而不像一份老文件那样,可能记录了对同一个值的多次操作。

其生成过程和RDB相似, 也是fork一个进程,直接遍历数据,写入新的AOF暂时文件。

在写入新文件的过程中,全部的写操作日志还是会写到原来老的 AOF文件里,同一时候还会记录在内存缓冲区中。

当重完操作完毕后,会将全部缓冲区中的日志一次性写入到暂时文件里。

然后调用原子性的rename命令用新的 AOF文件代替老的AOF文件。


相关文章:

  • JS 面试题总结
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • c++(类) this指针
  • 【Python改变生活!】用pynput控制键盘鼠标!Mac如何卸载python?
  • Docker 镜像、容器、仓库的概念及基本操作
  • 十分钟讲清楚大众对区块链的误解
  • 移动端适配问题解决方案
  • 每天一个linux命令(20):find命令之exec
  • 多张图片合成一张图片、兼容问题总结
  • git 配置多个账户
  • CentOS下安装php扩展exif
  • Alembic基本使用
  • 机器学习中特征的处理及选择
  • Prometheus Querying Function rate() vs irate()
  • 多线程基础篇(3)——初试锁
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Debian下无root权限使用Python访问Oracle
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js写一个简单的选项卡
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spark学习笔记之相关记录
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 半理解系列--Promise的进化史
  • 跨域
  • 前端路由实现-history
  • 前端之React实战:创建跨平台的项目架构
  • 试着探索高并发下的系统架构面貌
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # Java NIO(一)FileChannel
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C#)获取字符编码的类
  • (ZT)一个美国文科博士的YardLife
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • .form文件_一篇文章学会文件上传
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [20181219]script使用小技巧.txt
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [AX]AX2012 SSRS报表Drill through action
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [HDU3710]Battle over Cities
  • [leetcode]Clone Graph