目录
Redis简介
1 NoSql简介
关系型数据库索引数据都是树状结构,当数据量特别大时,导致树深度比较深,当深度深时查询性能会大大降低。尽量减少对数据库的操作,能够明显提升程序运行效率。
NoSql (Not Only Sql)
- memcached:键值对,内存型数据库,所有数据都在内存中
- Redis:和memcached类似,还具备持久化能力
- HBase : 以列作为存储
- MongoDB:以Document做存储
2 Redis简介
Redis是以Key-value形式进行存储的NoSQL数据库。
Redis是使用C语言进行编写的。
平时操作的数据都在内存中,效率高,所以多把Redis当做缓存工具使用(在一些框架中Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。
Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。
同时通过哨兵提供高可用,通过Redis Cluster(集群)提供自动分区。
使用Redis作为缓存工具时流程(边路缓存思想中一部分)
Redis数据类型
Redis中数据是key-value刑事。不同类型value是有不同的命令进行操作。key和value都支持下面类型(在代码中多把key设置为String类型):
- String 字符串
- Hash 哈希表
- List 列表
- Set 集合
- Sorted Set 有序集合
Redis命令相关手册:
http://www.redis.net.cn/order/
http://doc.redisfans.com/
-
key操作
keys *
exists
ttl
expire
del
-
String(字符串)
set
get
setnx
setex
-
Hash
Hash类型的值中包含多组field value
hset
hget
hmset
hmget
hvals
hgetall
hdel
-
List
rpush
lrange
lpush
llen
lrem
-
Set
sadd
scard
smembers
-
SortedSet
有序集合中每个value都有一个分数(score),根据分数进行排序
zadd
zrange
Redis持久化策略
Redis不仅仅是一个内存型数据库,还具备持久化能力。
Redis每次启动时都会从硬盘存储文件中把数据读取到内存中。运行过程中操作的数据都是内存中的数据。
两种持久化策略:RDB和AOF。
1 RDB(Redis DataBase)
rdb模式是默认模式,可以在指定的时间间隔内生成数据快照(snapshot),默认保存到dump.rdb文件中。当redis重启后悔自动加载dump.rdb文件中内容到内存中。
用户可以使用SAVE(同步)或BGSAVE(异步)手动保存数据。
可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设个多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。
例如:save 900 1 save 300 10, 只要满足了两个条件中的任意一个,BGSAVE命令就会被执行。SAVE 900 1,每900秒检测一次,服务器至少做了1次修改
优点:rdb文件是一个紧凑文件,直接使用rdb文件就可以还原数据。数据保存会由一个子进程进行保存,不影响父进程做其他事情。恢复效率高于AOF.
缺点:每次保存点之间导致redis不可意料的关闭时,可能会丢失数据。每次保存数据都需要fork()子进程,在数据量比较大时可能会比较消耗性能。
2 AOF(AppendOnly FIle)
AOF默认是关闭的 APPendonly no,需要在配置文件redis.conf中开启AOF。Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)。
AOF原理:监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据文件中,同时会把命令记录到日志中。即使突然出现问题,由于日志文件中已经记录命令,下一次启动时也可以按照日志进行恢复数据。
优点:相对RDB数据更加安全。
缺点:相同数据集AOF要RDB。相对RDB可能会慢一些。
开启办法:修改redis.conf中。appendonly yes开启aof。appendfilename设置aof数据文件,名称随意。
Redis主从复制
1. 主从优点
-
增加单一节点的健壮性,从而提升整个集群的稳定性。(Redis中当超过1/2节点不可用时,整个集群不可用)
-
从节点可以对主节点数据备份,提升容灾能力
-
读写分离。在redis中,主节点一般用作写(具备读的能力),从节点只能读,利用这个特性实现读写分离,写用主,读用从。
2. 基于docker一主多从搭建
-
拉取redis一主多从
docker pull redis
-
创建并运行三个Docker容器
先停止单机版Redis
三个容器分别占用系统的3个端口
-
在从中指定主的ip和端口
只需要设置从
-
测试主从效果
哨兵(Sentinel)
在Redis主从默认中只有主具备写的能力,而从只能读。如果主宕机,整个节点不具备写能力。但是如果让一个从变成主,整个节点就可以继续工作。即使之前的主恢复过来也当做这个节点的从即可。单哨兵 多哨兵
Redis 脑裂
Redis集群(Cluster)
1. 集群原理
2. Redis集群安装步骤
- 新建配置模板文件
- 使用Shell脚本创建6个目录
- 创建桥接网络
- 创建并启动6个容器
- 查看6个容器ip及端口
- 执行集群脚本
- 验证集群
缓存穿透
缓存击穿
缓存雪崩
Redis 脑裂
Redis集群(Cluster)
1. 集群原理
2. Redis集群安装步骤
- 新建配置模板文件
- 使用Shell脚本创建6个目录
- 创建桥接网络
- 创建并启动6个容器
- 查看6个容器ip及端口
- 执行集群脚本
- 验证集群