1.Redis介绍:
Redis是C语言开发的开源高性能,非关系型的key-value存储型数据库;可以用在数据库,缓存,消息中间件等.
优点:
纯内存操作,性能强,每秒10万次读写速度,最快的key-value数据库;
支持事务支持持久化;
单线程操作,避免上下文频繁切换;
非阻塞IO实现了多路复用,多路复用指的是单线程监控多i/o状态来管理,可高并发
缺点:
一致性问题,缓存的数据和数据库数据不一致时,客户得到的数据就不正确了,解决:更新数据库时,删除缓存或使用消息队列
并发竞争问题,多个系统同时修改同一个key的value值,解决:准备分布式锁,有锁才可操作
缓存雪崩问题:指大批key同时时效,又来一批请求,导致数据库连接异常,解决:设置随机失效时间或搭建Redis集群或使用互斥锁,缓存时效时,获得锁,然后再访问数据库,没得到锁则休眠后重试
缓存击穿问题:指故意请求不存在的数据,导致请求堆压,出现数据库连接异常,解决:互斥锁或异步更新策略,key是否有值都直接返回,value中维护缓存时效时间,时效自动异步更新数据库数据到缓存
2.Redis中的存储结构:
String:字符串,最基本的存储类型,key-value,二进制安全,容量最大512MB
Hash:散列,是一个key-value集合,特别适合存储对象;每个Hash最大存232-1键值对(40多亿)
List:列表,最简单的字符串列表,按插入顺序排序,可插入到头或尾,最大存储232-1元素,(每个列表40亿)
Set:集合,string类型无序集合,最大成员232-1,40多亿成员
Zset(Sorted set):string类型有序集合,不允许重复,每个成员管理一个double类型分数,通过分数排序,zset分数可以重复
3,Redis持久化:
一种持久化方式为RDB:将Redis中数据生成快照保存到磁盘,下次启动加载到内存
二中持久化方式为AOF:将操作Redis的写操作的命令都记录静磁盘,下载启动,再执行一遍,这种方式回复数据的完整度更高
4.Redis集群:
主从复制:
从服务器连接主服务器->从服务发送SYNC同步命令->主服务器接收到命令生成快照,发送给从服务器期间继续记录写命令->从服务器载入快照,完成同步->接下来接收主服务器写命令,执行命令同步数据,主服务器执行一条,从服务器执行一条
优点:读写分离,分载master同步压力,非阻塞方式提供服务,同步期间如果查询,返回同步之前的数据
缺点:不具备自动容错和恢复功能,宕机会使得请求失败,需要重启或受切换前端ip,切换ip会导致数据不一致,集群容量达到上限是,很难在线扩容
哨兵模式:
Redis2.8提供哨兵实现自动化系统监控和故障恢复,他的作用就是监控Redis系统的运行状态,1.监控注解和从机是否正常运行,2.主服务器中断服务后,自动将从服务转换为主服务,来提供服务,
注意,哨兵模式是基于主从模式的
工作方式:
1.每个哨兵每秒向整个集群的所有服务器和其他哨兵发送PING命令,看是否ping通,如果响应超过自己的设定时间,将进程标记状态为主观下线
2.如果主服务器进入了主观下线状态,所有哨兵会每秒向改主服务器发确认,当足够数量哨兵都认为此服务器,确实是主观下线了,则标记此主服务器状态为客观下线
3.每个哨兵向每个服务器发送INFO命令每10秒169/196次;当一个主服务器被标记为客观下线,哨兵会向此主服务器下的所有从服务器发送INFO命令(由原来10秒一次改为每秒一次),如果没有足够数量哨兵同意该主服务器下线,此主服务器将移除客观下线状态
4.若客观下线状态移除后,此主服务器可以向哨兵发送PING命令并收到有效回复了,此主服务将被移除主观下线的状态
Redis-Cluster集群:
分布式存储,每个节点存储不同数据;每个节点相互关联,客户访问任一节点都可;半数节点检测确认某个节点时效,则该节点为fail
工作方式:
每个节点上有插槽(slot)和集群插件(cluster),存放key时,Redis通过crc16算法得出结果,此结果对16384求余数,得到标号为0-16383之间的hash槽,通过此hash槽找到插槽对应的节点,存取操作
引入主从模式,当主节点宕机就自动启用一个从节点作为主节点,当其他主节点ping此节点,有超过主节点认为此节点宕机,那么确认此节点为宕机,集群将无法提供服务
Redis实现分布式锁:
Redis为单线程单进程模式,采用队列模式,将所有访问排队,实现串行访问,所以多客户对Redis的连接不存在竞争关系,可以使用SETNX命令实现分布式锁,当且仅当key不存在时,将key设置为预定值value,若key存在则SETNX什么都不会做
实现:
1 使用SETNX命令获取锁,返回值为1表示设置成功,0表示失败(已存在key)
2 为锁设置合理的过期时间
3 使用后释放,DEL命令删除锁数据