Redis思维导图
2019-07-17 11:56:14 0 举报
AI智能生成
redis知识
作者其他创作
大纲/内容
NoSql入门和概述
入门概述
1.互联网时代背景下大机遇,为什么用nosql
1.单机MySQL的美好时代
2.Memcached(缓存)+MySQL+垂直拆分
3.Mysql主从读写分离
4.分表分库+水平拆分+mysql集群
5.MySQL的扩展性瓶颈
6.今天是什么样子
7.为什么用NoSQL
2.是什么
3.能干嘛
易扩展
大数据量高性能
多样灵活的数据模型
传统RDBMS VS NOSQL
4.去哪儿
Redis
Memcache
Mongdb
5.怎么玩
KV
Cache
Persistence
。。。。
3V+3高
大数据时代的3V
海量Volume
多样Variety
实时Velocity
互联网需求的3高
高并发
高可扩
高性能
子主题 3
当下的NoSQL经典应用
当下的应用是sql和nosql一起使用
阿里巴巴中文站商品信息如何存放
阿里巴巴中文网站首页
架构发展历程
1.演变过程
2.第5代
3.第5代架构使命
4.....
和我们相关的,多数据源多数据类型的存储问题
1.商品基本信息
名称、价格、出厂日期、生产厂商等
关系性数据库,mysql/oracle目前淘宝在去O化(也即拿掉Oracle),注意淘宝内部使用的Mysql是大牛改造过的
为什么去IOE
2.商品描述、详情、评价信息(多文字类)
多文字信息描述类,IO读写性能变差
文档数据库MongDB中
3.商品的图片
商品图片展现类
分布式的文件系统中
淘宝自己的TFS
Google的GFS
Hadoop的HDFS
4.商品的关键字
搜索引擎,淘宝内用
ISearch
5.商品的波段性的热点高频信息
内存数据库
Tair、Redis、Memcache
6.商品的交易、价格计算、积分累计
外部系统,外部第3方支付接口
支付宝
总结大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案
难点
数据类型多样性
数据源多样性和变化重构
数据源改造而数据服务平台不需要大面积重构
解决办法
统一数据平台服务层
阿里、淘宝干了什么?UDSL
NoSQL数据模型简介
以一个电商客户、订单、订购、地址模型来对比下关系性数据库和非关系型数据库
传统的关系型数据库你如何设计?
Nosql你如何设计
什么是BSON
给学生用BSON画出构建的数据模型
两者对比,问题和难点
为什么上述的情况可以用聚合模型来处理
高并发的操作是不太建议有关联查询的,互联网公司用冗余数据来避免关联查询,分布式事务是支持不了太多的并发的
关系型数据库如何查询?如果按照我们新设计的BSON,是不是查询起来很可爱
聚合模型
KV键值
Bson
列族
图形
NoSQL数据库的四大分类
KV键值:典型介绍
新浪:BerkeleyDB+redis
美团:redis+tair
阿里、百度:memcache+redis
文档型数据库(bson格式比较多):典型介绍
CouchDB
MongoDB
列存储数据库
Cassandra,HBase
分布式文件系统
图关系数据库
它不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统、社交网络,推荐系统等。专注于构建关系图谱。
Neo4j,InfoGrid
四者对比
在分布式数据库中CAP原理CAP+BASE
传统的ACID分别是什么
A(Atomicity)原子性
C(Consistency)一致性
I(Isolation)独立性
D(Durability)持久性
CAP
C:Consistency(强一致性)
A:Availability(可用性)
P:Partion tolerance(分区容错性)
CAP的3进2
经典CAP图
BASE
是什么
分布式+集群简介
Redis入门介绍
1.入门概述
1.是什么
Redis:REmote DIctionary Server(远程字典服务器)
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,被称为数据结构数据库。
Redis与其他key-value缓存产品有一下三个特点
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
Redis支持数据的备份,即master-slave模式的数据备份。
2.能干嘛
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。
取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
模拟类似于HttpSession这种需要设定过期时间的功能。
发布、订阅消息系统
定时器、计数器
3.去哪下
http://redis.io/
http://www.redis.cn/
4.怎么玩
数据类型、基本操作和配置
持久化和复制,RDB/AOF
事务的控制
复制
.........
2.VMWare+VMTools
3.Redis的安装
Windows版安装
重要提示:
企业做Redis开发,99%都是Linux版的运用和安装。
Linux版安装
下载获得redis-3.0.4.tar.gz后将它放入我们的Linux目录/root
/opt目录下,解压命令:tar -zxvf redis-3.0.4.tar.gz
解压完成后出现文件夹:redis-3.0.4
在redis-3.0.4目录下执行make命令
运行make命令是故意出现的错误的解析:
安装gcc
能上网:yum install gcc-c++
不能上网:
二次make
Jemalloc/jemalloc.h:没有那个文件目录
运行make distclean之后再make
Redis Test(可以不用执行)
如果make完成后继续执行make install
查看默认安装目录:usr/local/bin
启动
永远的helloworld
关闭
4.Redis启动后杂项基础知识讲解
单进程
单进程模型来处理客户端的请求。对读写等时间的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率。
Epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率。
默认16个数据库,类似数组下表从零开始,初始默认使用零号库
Select命令切换数据库
Dbsize查看当前数据库的key的数量
Flushdb:清空当前库
Flushall:通杀全部库
同一密码管理,16个库都是同样密码,要么都ok要么一个也连不上
Redis索引都是从零开始
为什么默认端口是6379
Redis数据类型
Redis的五大数据类型
String(字符串)
Hash(哈希,类似java里的Map)
List(列表)
Set(集合)
Zset(sorted set:有序集合)
哪里去获得redis常见数据类型操作命令
http://redisdoc.com/
Redis键(key)
常用
案例
keys *
move key db -->当前库就没有了,被移出了
expire key 秒钟:为给定的key设置过期时间
ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
Redis字符串(String)
单值单value
set/get/del/append/strlen
getrange/setrange
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx
getset(先get在set)
Redis列表(List)
单值多value
lpush/rpush/lrange
lpop/rpop
llen
lren key 删N个value
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
性能总结
Redis集合(Set)
sadd/smembers/sismember
srem key value 删除集合中元素
srandmember key 某个整数(随机出几个数)
spop key 随机出栈
smove key2 key2 在key1里某个值 作用是将key1里的某个值赋给key2
数学集合类
差集:sdiff
交集:sinter
并集:sunion
Redis哈希(Hash)
KV模式不变,但V是一个键值对
hset/hget/hmset/hgetall/hdel
hlen
hexists key 在key里面的某个值的key
hkey/hvals
hincrby/hincrbyfloat
hsetnx
Redis有序集合Zset(sorted set)
zadd/arange
zrangebyscore key 开始score 结束score
withscores
( 不包含
limit作用是返回限制 limit开始下标步 多少步
zrem key 某score下对应的value值,作用是删除元素
zcard/zcount key score区间/zrank key values值,作用是获得下标值/zscore key 对应值,获得分数
zrevrank key values值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key 结束score 开始score
解析配置文件redis.conf
1.它在哪
2.Units单位
3.INCLUDES包含
4.GENERAL通用
Daemonize
Pidfile
Port
Tcp-backlog
Timeout
Bind
Tcp-keepalive
Loglevel
Logfile
Syslog-enabled
Syslog-ident
Syslog-facility
Databases
5.SNAPSHOTTING快照
Save
save 秒钟 写操作次数
禁用
Stop-writes-on-bgsave-error
rdbcompression
rdbchecksum
dfgilename
dir
6.REPLICATION复制
7.SECURITY安全
8.LIMITS限制
9.APPEND ONLY MODE追加
appendonly
appendfilename
Appendfsync
Always:同步持久化,每次发生数据变更会立即记录到磁盘,性能较差但数据完整性比较好
Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,有数据丢失
No
No-appendfsync-on-rewrite:重写时是否可以运行Appendfsync,用默认no即可,保证数据安全性。
Auto-aof-rewrite-min-size:设置重写的基准值
Auto-aof-rewrite-perentage:设置重写的基准值
10.常见配置redis.conf介绍
Redis的持久化
总体介绍(官网)
RDB(Redis DataBase)
官网介绍
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时将快照文件直接读到内存里。
Redis会单独创建(Fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork
Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量‘程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
RDB保存的是dump.rdb文件
配置位置
如何触发RDB快照
配置文件中默认的快照配置
冷拷贝后重新使用
可以cp dump.rdb dump_new.rdb
命令save或者是bgsave
Save:save时只管保存,其他不管,全部zuse
BGSAVE:Redis会在后台异步进行快照操作,快照操作同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间。
执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。
如何恢复
将备份文件(dump.rdb)移动到redis安装目录并启动服务即可
CONFIG GET dir获取目录
优势
适合大规模的数据恢复
对数据完整性和一致性要求不高
劣势
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
Fork的时候,内存中的数据被克隆了一份,大约2倍的膨胀性需要考虑。
如何停止
动态所有停止RDB保存规则的方法:redis-cli config set save \"\"
小总结
AOF(Append Only File)
是什么:
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话根据日志文件的内容将写指令从前到后执行一次已完成数据的恢复工作。
AOF保存的是appendonly.aof文件
AOF启动/修复/恢复
正常恢复
启动:设置Yes
将有数据的aof文件复制一份保存到对应目录(config get dir)
恢复:重启redis然后重新加载
异常恢复
备份被写坏的AOF文件
修复:
Redis-check-aof --fix进行修复
恢复:
重启redis然后重新加载
Rewrite
AOF采用文件追加方式,文件会越来越大,为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令gbrewriteaof
重写原理
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后在rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
触发机制
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
每秒同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
每修改同步:appendfsync everysec 异步操作 ,每秒记录 如果一秒内宕机,有数据丢失。
不同步:appendfsync no 从不同步
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
AOF运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同。
总结(Which one)
RDB和AOF可以共存,但是恢复的时候找的是AOF,如果AOF文件异常,可以通过check-aof进行AOF修复。
Redis的事务
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。
官网
作用
一个队列中,一次性、顺序性、排他性地执行一系列命令
怎么玩
常用命令
Case1:正常放行
Case2:放弃事务
Case3:全体连坐
Case4:冤头债主
Case5:watch监控
悲观锁/乐观锁/CAS(Check And Set)
悲观锁
乐观锁
CAS
初始化信用卡可用余额和欠额
无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内
有加塞篡改
unwatch
一旦执行了exec,之前加的监控锁都会被取消掉
小结
Watch指令,类似乐观锁,事务提交时,如果Key的值已经被别的客户端改变,比如某个list已经被别的客户端push/pop过了,整个事务队列都不会被执行。
通过WATCH命令在事务执行之前监控了多个keys,倘若在WATCH之后有任何key的值的变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
3阶段
开启:以MULTI开始一个事务
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。
执行:由EXEC命令触发事务
3特性
单独的隔离操作:事务中的所有命令都会被序列化、按顺序地执行。事务在执行的构成中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
Redis的发布订阅
进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
订阅/发布消息图
命令
Redis的复制(Master/Slave)
就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slver机制,Master以写为主,Slave以读为主。
读写分离
容灾恢复
1.配从(库)不配主(库)
2.从库配置:slaveof主库IP主库端口
每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
Info replication
3.修改配置文件细节操作
拷贝多个redis.conf文件
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
4.常用3招
一主二仆
Init
一个Master两个Slave
日志查看
主从问题演示
薪火相传
上一个Slave可以是下一个slave的Master,slave同样可以接受其他slaves的连接和同步请求,那么该slave作为链条中下一个的master,可以有效减轻master的写压力。
中途变更转向:会清楚之前的数据,重新建立拷贝最新的。
slaveof 新主库IP 新主库端口
反客为主
SLAVEOF no one:使当前数据库通知与其他数据库的同步,转成主数据库。
复制原理
Slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
全量控制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量控制:master继续将新的所有收集到的修改命令一次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
哨兵模式(setinel)
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
调整结构,6379带着80、81
自定义的/myredis目录下新建sentinel.conf文件,名字决不能错。
配置哨兵。填写内容
sentinel monitor被监控数据库名字(自己起名字)127.0.0.1 6379 1
上面最后一个数字1,表示主机挂掉后slave投票看让谁解题成为主机,得票数多的成为主机
启动哨兵
Redis-sentinel /myredis/sentinel.conf
上述目录依照各自的实际情况配置,可能目录不同
正常主从演示
原有的master挂了
投票新选
重新主从继续开工,info replication查查看
问题:如果之前的master重启回来,会不会双master冲突?
一组sentinel能同时监控多个Master
复制的缺点
复制延时
Redis的Java客户端Jedis
NoSql
0 条评论
下一页