1、为什么要使用redis
执行比较耗时,并且不会频繁变动的操作,可以将其放入缓存;比如菜单、配置信息;还有就是在查询大量数据的时候,可以使用redis做缓存处理,并不是直接去操作数据库
2、redis目前存在的问题
缓存和数据库双写一直性问题、缓存雪崩问题、缓存击穿问题、缓存的并发竞争问题
3、常用数据类型
String、hash、liet、set、sorted set
4、RDB和AOF持久化
4.1、RDB持久化
将所有数据库数据以二进制的形式保存到硬盘中。
有3种最常见的方式创建RDB文件:SAVE、BGSAVE后台执行、使用save配置选项设置(时间计数器和次数计数器)的自动保存条件被满足,服务自动执行BGSAVE
缺点:比较耗资源和时间,创建RDB文件过于频繁会影响服务器的性能
4.2、AOF持久化
每当有修改的数据库的命令被执行时,服务器就会将执行的命令写到AOF文件的末尾
安全性问题:虽然服务器执行一个修改数据库的命令,就会将执行的命令写到AOF文件中,但这并不意味AOF文件持久化不会丢失任何数据。因为在执行write函数,会将一些内容写入到某个文件中,为了提高效率系统通常会将内容放入到一个内存缓冲区buffer中,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将缓冲区中内容真正写入到硬盘。所以,这取决于命令被写入到硬盘的时间。
解决:提供了appendfsync选项always(每写一次,调用一次fdatasync,速度慢)、everysec(默认值,每秒,速度快)、no(不主动调用,速度快)
AOF中的冗余命令,提供了重写功能:BGREWRITEAOF,配置方式:auto -aof -rewrite -percentage 100,auto-aof-rewrite-min-size 64mb
4.3两种方式对比,实际中两种持久化是可以同时使用的
5、Redis集群——主从模式_哨兵模式
5.1、主从复制Replication
一个Master可以有多个Slaves,Master可以将自己的数据同步给Slaves,只有Master可以进行写操作,而Slaves只能进行读操作。客户端可以连接Slaves读来减轻Maeter的压力。
配置当前服务为Slaves:redis -server --port 6380 --slaveof 127.0.0.1 6379
将当前的Master改为Slaves:slaveof 127.0.0.1 6379
将Slaves回复为Master:slaveof no one
主从复制存在问题:一个Master可以有多个Slaves,slave下线,只是读请求的处理性能会降低,而Master下线,写请求则无法执行。这样我们需要手动的去修改,让其中的一台Slave使用slaveof no one 命令成为Master,其它的Slave执行slaveof命令指向新的Master,从新的Master同步数据。其实也可以自动实现,就需要我们使用Sentinel哨兵,实现故障转移failover操作。
5.2、高可用哨兵Sentinel
Redis Sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程。
启动Sentinel:将src目录下产生的redis-sentinel程序文件复制到$REDIS HOME/bin,启动一个运行在Sentinel模式下的Redis服务实例
redis -sentinel、 redis server /path/to/sentinel.conf --sentinel
监控 Monitoring:Sentinel会不断的检查Master和Slaves是否正常,每一个Sentine可以监控多个Master和该Master下的Slaves
Sentinel网络:监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息
服务器下线:当一个Sentinel认为被监控的服务器已经下线时,它会向网络其它的Sentinel进行确认,判断该服务器是否真的下线。如果下线的服务器是主服务器,那么Sentinel网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并将其从服务器转为新的主服务器,以此来让系统重新回到上线的状态。
Sentinel配置文件:至少包含一个监控配置选项,用于指定被监控Master的相关信息。 sentinel monitor mymaster 127.0.0.1 6379 2 监视mymaster的主服务器,服务器ip和端口,将这个主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移,Sentinel会根据Master的配置自动发现Master的Slaves。Sentinel默认端口号为26379
5.3、总结
主从+哨兵虽然解决了读性能和高可用的问题,但是没有解决写性能的问题