大数据笔记(二十一)——NoSQL数据库之Redis
一、Redis内存数据库
一个key-value存储系统,支持存储的value包括string(字符串)、list(链表)、set(集合)、zset(sorted set--有序集合)和hash(哈希类型)。数据存在缓存中。
与MemCached区别:
(*)支持持久化
(*)丰富的数据类型
(*)实现了主从同步
(*)补偿了key/Value存储的不足
3、Redis的特点
(*)基于内存
(*)持久化: RDB、AOF
(*)消息机制:支持String,只支持Topic的消息(广播)
(*)丰富的数据类型
(*)支持简单的事务
(*)支持主从复制
(*)HA(哨兵): 对版本有要求
二、Redis的安装和配置: 需要gcc的编译器
tar -zxvf redis-3.0.5.tar.gz
make
make PREFIX=/root/training/redis install
(*)Redis的相关命令
redis-benchmark 提供的一个压力测试工具,模拟:10万操作
redis-check-aof 检查AOF日志文件
redis-check-dump 检查RDB快照文件
redis-cli 命令行
redis-sentinel 哨兵(Redis的HA) -----> 配置文件:sentinel.conf
redis-server 服务器
(*)核心的配置文件: redis.conf
42 daemonize yes
50 port 6379
(*)启动: bin/redis-server conf/redis.conf
三、Redis的操作:基于key-value形式
1、命令行: bin/redis-cli
2、JAVA API
四、Redis的事务: 不是真正的事务
1、复习:事务(关系型数据库)
Oracle数据库中,事务的本质是什么? -----> 将事务操作(DML)写入日志
举例: insert
insert
update
commit
2、Redis的事务: 不是真正的事务
Redis的事务的本质:将一组操作放入队列中,批量执行
3、对比Oracle和Redis的事务
Oracle Redis
开启事务: 自动开启 multi
操作: DML Redis命令
提交: commit,隐式提交 exec
回滚: rollback,隐式回滚 discard
4、举例:银行转账
set tom 1000
set mike 1000
multi
decrby tom 100
incrby mike 100
exec
通过Java API 实现:
package demo; import org.junit.Test;
import org.omg.CORBA.TCKind; import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction; public class TestRedis { @Test
public void testTransaction(){
//创建一个客户端
Jedis jedis = new Jedis("192.168.153.11", 6379);
//定义事务
Transaction transaction = null;
try {
//开启事务
transaction = jedis.multi(); //转账
transaction.decrBy("tom", 100);
transaction .incrBy("mike", 100); //提交事务
transaction.exec();
} catch (Exception e) {
if (transaction != null) {
transaction.discard();
}
} jedis.disconnect();
}
}
5、Redis的锁机制 -----> 核心:当事务提交的时候,如果监控的值,发生变化,则提交失败
命令:watch
举例:买票
set ticket 1
set tom 1000
用户一:tom
multi
decr ticket
decrby tom 100
exec -------> 提交的时候,慢了一点
1) (integer) -1 ====> 票数不可能是-1
2) (integer) 900
用户二:在tom提交前,已经把票买走了(重新开一个窗口)
decr ticket
五、Redis的消息机制
1、消息系统类型:同步消息系统: 需要等待对方的回答
异步消息系统: 不需要等待对方的回答
2、消息的类型:
Queue:队列(点对点)
Topic:主题(广播)
Redis和Kafka:只支持Topic
JMS: Java Message Service ----> 都支持:Queue和Topic
推荐:Weblogic
3、Redis的消息相关的命令:
publish: 发布消息 指定频道
subscribe:订阅消息 指定频道
psubscribe:订阅消息 使用通配符指定频道
也可以使用JAVA API的方式
六、Redis的持久化: RDB(默认)、AOF
1.作用:进行恢复
2.RDB:快照的方式。每隔一段时间,把内存中的数据写到rdb文件中
参数:
规则:从下往上
save 900 1 在15分钟内,如果有1个key的value发生了变化,就产生RDB文件
save 300 10 在5分钟内,如果有10个key的value发生了变化,就产生RDB文件
save 60 10000 在60秒内,如果有1w个key的value发生了变化,就产生RDB文件
stop-writes-on-bgsave-error yes 如果在写RDB文件的时候产生了错误,停止新的数据写入
rdbcompression yes 是否压缩(优点:节约了空间 缺点:恢复的效率低),可以设置为:no
rdbchecksum yes 校验和来检查RDB文件是否是好的
dbfilename dump.rdb 如果在集群下,一台主机上运行多个Redis的实例,建议区别rdb文件
dir ./ 保存的目录
RDB的优缺点?
(*)优点:恢复的速度快
补充:Oracle数据库中的备份:备份集
镜像拷贝(image copy):相当于RDB
(*)缺点:如果在两次RDB之间发生了掉电,数据肯定丢失
3.AOF:通过日志的方式
(*)重做日志,达到恢复的目的
(*)默认:禁用
(*)参数:
appendonly no ===> yes 开启AOF
appendfilename "appendonly.aof" 如果在集群下,一台主机上运行多个Redis的实例,建议区别aof文件
什么时候记录日志???
538 # appendfsync always 每个操作都记录日志。最安全,性能最差
539 appendfsync everysec 默认:每秒
540 # appendfsync no 由操作系统决定
no-appendfsync-on-rewrite no 重写发生的时候,是否写入aof的新日志
什么时候执行AOF重写?
580 auto-aof-rewrite-percentage 100
581 auto-aof-rewrite-min-size 64mb
(*)什么是AOF的重写:rewrite
set i 0
incr i
incr i
======> 问题: AOF文件太大了
100次
****
incr i
最终:i = 100

(*)演示:AOF的重写:合并小日志,生成大的日志
模拟:10万个操作
bin/redis-benchmark -n 100000
七、Redis的集群:主从复制
1、Redis的集群:
(*)主从备份(复制):从主节点上写入数据,从从节点(s)上读取数据。对主节点做一个备份。
(*)读写分离:一般来说,都是读的压力大。分担master的压力。
(*)任务分离
2、两种架构:星型、线型



3、搭建:星型
主节点:关闭RDB和AOF
从节点:开启RDB和AOF
slaveof 主节点地址
三台Redis:端口 6379 6380 6381
主 从1 从2
redis6379.conf
147 #save 900 1
148 #save 300 10
149 #save 60 10000
509 appendonly no
redis6380.conf
50 port 6380
182 dbfilename dump6380.rdb
513 appendfilename "appendonly6380.aof"
211 slaveof 192.168.157.11 6379
redis6381.conf
50 port 6381
182 dbfilename dump6381.rdb
513 appendfilename "appendonly6381.aof"
211 slaveof 192.168.157.11 6379
注意:默认:从节点只读
(error) READONLY You can't write against a read only slave.
修改参数:
slave-read-only yes
# masterauth <master-password> 主从节点密码
4、主从节点通信的过程
主节点 从节点
<------------ 发出同步请求
将RDB同步 ----------->
将AOF同步 -----------> 重做日志

一定注意:每次启动的时候,从节点的个数不能太多
八、Redis的HA:哨兵机制

九、Redis的分片

1、回顾:集群有两大功能
(1)Fail Over 失败迁移:HA -----> Redis 哨兵
(2)Load Balance 负载均衡 ------> Redis 分片
来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务,再原路返回。Redis的分片,解决了单个Redis实例承载能力的问题。
2、nutcracker-0.3.0.tar.gz
./configure --prefix=/root/training/proxy
make
make install
配置文件中,注意空格
alpha:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 192.168.157.11:6380:1
- 192.168.157.11:6381:1
3、检查配置文件是否正确
sbin/nutcracker -t conf/nutcracker.yml
4、启动代理服务器
sbin/nutcracker -d -c conf/nutcracker.yml
大数据笔记(二十一)——NoSQL数据库之Redis的更多相关文章
- Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)
第1章 redis存储系统 1.1 redis概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Mem ...
- Linux实战教学笔记46:NoSQL数据库之redis持久化存储 (二)
第3章 Redis数据类型详解 3.1 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如"foo"的简单字符串到一个JPG ...
- Linux实战教学笔记44:NoSQL数据库开篇之应用指南
第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...
- 大数据量高并发的数据库优化详解(MSSQL)
转载自:http://www.jb51.net/article/71041.htm 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能. ...
- 决战大数据之二:CentOS 7 最新JDK 8安装
决战大数据之二:CentOS 7 最新JDK 8安装 [TOC] 修改hostname # hostnamectl set-hostname node1 --static # reboot now 重 ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- NOSQL数据库之 REDIS
NOSQL数据库之 REDIS 一.NOSQL 1.简介 NoSQL ,(Not Only SQL),泛指非关系型数据库. 特点: NoSQL 通常是以key-value形式存储, 不支持SQL语句, ...
- 初识大数据(二. Hadoop是什么)
hadoop是一个由Apache基金会所发布的用于大规模集群上的分布式系统并行编程基础框架.目前已经是大数据领域最流行的开发架构.并且已经从HDFS.MapReduce.Hbase三大核心组件成长为一 ...
- 大数据笔记(一)——Hadoop的起源与背景知识
一.大数据的5个特征(IBM提出): Volume(大量) Velocity(高速) Variety(多样) Value(价值) Varacity(真实性) 二.OLTP与OLAP 1.OLTP:联机 ...
- 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17
黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...
随机推荐
- 联想Z485安装64位ubantu
开始今天的正式写作之前不得不吐槽一下联想电脑,真的是很垃圾!联想Z485使用的是AMD的处理器,性能差的很,更让人不能忍的是,居然不能正常安装64位ubantu.这个情况让那些想在自己笔记电脑上安装T ...
- (3.5)常用知识-NULL与零长度、字符串尾部填充空格
概述:NULL与零长度是不同的,NULL表示数据未知或不可用,它是与零(数值或2进制).零长度字符串不 同的一种值,也可以理解为一种状态. 即可以理解为:所有的变量都有2种状态,一种有值,一种为NUL ...
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...
- 《剑指offer》面试题22 栈的压入、弹出序列 Java版
(输入两个整数序列,第一个序列是一串数字的压入顺序,判断第二个序列是否是该栈数字的弹出顺序.) 我的方法:压入序列是给定的,每一次弹出操作形成一个弹出序列的值,我们从前往后遍历弹出序列,每一次访问弹出 ...
- Diango路由映射FBV和CBV
django中请求处理方式有2种:FBV(function base views) 和 CBV(class base views),换言之就是一种用函数处理请求,一种用类处理请求. FBV # url ...
- jmeter性能测试抛除工具用命令测试的方法
1.我们有时会遇到那种图片或文件大的传输数据,容易将jmeter测试工具卡死,这个时候就需要抛除测试工具,直接用命令进行测试(window和linux都适用) 2.首先在jmeter工具上把性能测试脚 ...
- tomcat 启动报错 解决办法 A child container failed during 
转自:http://blog.sina.com.cn/s/blog_4e1e357d0102v55c.html 控制台报错: Caused by: org.apache.catalina.Lifecy ...
- GIT服务器项目部署和自动同步
1.1.初始化Git仓库首先我们选定一个目录作为Git仓库,假定是/home/data/share/share.git,在/home/data/目录下输入命令: $ cd /home/data/ $ ...
- Spring基础13——Spring表达式语言:SpEL
1.SpEL简介 Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.语法上类似于EL:SpEL使用#{...}作为界定符,所有在大框号中的字符都将被认为是Sp ...
- Linux学习--第六天--软件包
yum在线管理 管理的是rpm包,光盘里面都有 /etc/yum.repos.d下面有四个文件,对应网络yum源,光盘yum源等.如果需要用到哪个源,将其他三个源的enabled设置为0即可. |源配 ...