1.redis特性
1). 是一个速度非常快的非关系型数据库
2). 可以存储key与5种不同类型值的映射关系
3). 可以将键值数据持久化到硬盘中
4). 可以使用复制特性扩展读性能
5). 可以使用分片来扩展写性能
2.redis和其他产品的对比
3.redis的五种数据结构
4.redis持久化的两种手段
1) 快照方式(snapshotting ):
方式一:指定时间段内有 指定数量的写操作执行( point-in-time dump 时间点转储)
cmd: save 60 1000 //60s 内写入1000条数据则执行BGSAVE命令,如果设置了多个条件满足一个也会执行BGSAVE
方式二:调用两条(dump-to-disk)命令执行
快照缺点:如果宕机,则距离上次快照数据持久化之后的数据会丢失,解决办法:使用日志对比分析丢失的数据(redis有提供日志帮助)
2)AOF方式(append-only File):
设置追加(append-only)文件同步的频率,设置配置文件 appendonly yes和相关参数,所有写操作都会记录在该文件中
AOF缺点:丢失数据的窗口可减少至一秒,但是会造成文件体积过大,虽可以压缩,但治标不治本
5.redis复制机制
redis配置文件中的dir,dbfilename对于任何redis都是可用的
主从复制,从从复制,当从机多是一个master撑不住时可以采用从从复制机制减轻master的压力
cmd:
SLAVEOF ip(master) port //复制master数据
SLAVEOF no one //停止复制
主从复制的步骤: 从机复制master节点会清空自己原有的数据
6.一主多从,主机瘫痪后如何产生新的master
1).选择一台从机使用save命令产生,产生快照
2).新master目录放置快照文件,启动
3).从机重新指定主机SLAVEOF ip port
7.redis事务
redis会延迟执行Muti命令中的写语句,直到执行命令EXCE到达
8.redis高可用
redis常见问题
1.QPS太高?
答:采用一主多从结构,读写分离,由于主机宕机,从机晋升为主机或者另开一个主机
步骤: 停止从机的数据同步,选择一个从机导出快照,新主机开启时恢复快照数据,从机重新指定master
这个方式并不适合java项目中用,为什么?新master的ip和端口可能会变,java的配置就需要改,于是采用redis sentinel框架(哨兵模式)解决这个问题
2.redis缓存数据100G怎么处理?
单master一般16G左右,而且一般要求只能使用(35%-65%)左右的空间,100G大概需要10个redis的存储
思路: 10个master做分库,每个master都采用哨兵模式,key的hash做分库依据,key分布不均,新加/减少机器会导致key值重新分配(hash一致性算法解决),这么多问题很烦,别急,看看redis clutser框架,java项目连接redis cluster编程,支持多master分库,且使用hash一致型算法解决上述问题
9.redis sentinel 和 cluster对比
sentinel 只支持单master,能自动切换master, 一般配置三个哨兵,由其中的leader执行主从切换,哨兵中超过半数认为某redis失去连接则剔除,原理是通过ping命令探测
cluster 支持多master, cluster集群类似eureka去中心化的集群