redis
redis包含以下结构
1)String字符串:
格式: set key value
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
2)Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一个键值(key=>value)对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
3)List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value 相同的元素
格式: llen name
返回 key 对应 list 的长度
4)Set(集合)
格式: sadd name value
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
5)zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
redis持久化
redis 是存储在内存的-是内存型数据库
优点:内存存储快
缺点:断电易消失
解决办法:
-
RDB
生成一个.rdb快照文件存储在磁盘上,是存储全部内容的。
触发条件:save(此时线程阻塞处理不了任何请求)bgsave(生成子程序完成请求,可以处理其他情况)或者自动触发,比如:m秒内n次变化进行触发
-
AOF
记录对redis数据所有的修改操作,发生事故的时候可以吧AOF文件全部执行一遍,来恢复数据。AOF进行重写和更新,好几条设置一个数的操作,最后可能只保存最后一条,因此AOF是只看最新文件。
写入策略Always:同步写回只要更改就写回,写到硬盘文件中,性能太慢,数据可靠
Everysec:每秒写回,每一秒内写入内存的缓存区,一秒后再写入磁盘(默认)
NO:自己操作,十分不可靠
redis缓存内容相关
缓存淘汰机制
- 先进先出FIFO
- 最近最少使用LRU
- 最近最不经常使用LFU
过期删除
-
主动删除
设置一个时间,一段时间定时删除,缺点就是当很忙的时候,redis负载比较大
-
惰性删除
当访问到某个数据的时候,看看它是否过期,如果过期删除,缺点就是可能有数据很长时间不更新
-
定期删除
上述两种结合,平时采用惰性删除,隔一段时间用主动删除
缓存一致
我们的数据比如在mysql中,redis缓存中也存在,当修改和查询同时发生后,我们希望在一段时间后能够返回缓存一致的数据
- model1-先
缓存击穿
查询一个值,缓存中没有这个值,去数据库要数据
问题:如果对某个值的请求突然加大,redis设置了清理缓存的时间,就只能去数据库找数据
解决:
- mysql,减少击穿后的直接流量,给它加一个锁
- redis,首先设置热点数据永不过期,其次可以后台启动异步线程吧数据回填缓存中
缓存穿透
请求一个值,缓存中没有数据库也没有
-
返回错误,比如查询了为负的id
-
热点值返回空,为了减少数据库的压力给缓存设置空值
-
布隆过滤器
为了减少无效请求,设置个哈希表,用k个哈希函数来计算值,结果只能为0/1存储在哈希表中,当请求过来后再次用哈希函数计算。比较两次计算结果,有所不同则为无效请求。
缓存雪崩
一大批缓存过期了,缓存击穿是一个点,雪崩是多个点
-
mysql,减少击穿后的直接流量,给它加一个锁
-
redis,首先设置热点数据永不过期,其次可以后台启动异步线程吧数据回填缓存中
分析失效时间,将其分散
缓存预热,当刚开机的时候可能一大批数据都产生缓存雪崩,因此可以提前加到缓存中。
集群
主从复制
主库-写命令
丛库-读命令
首先我们为主库和丛库设置id和端口号,然后进行握手命令,丛库发送PSYN命令开启数据同步的过程,如果此刻断网,从库再发要发送主库id和偏移量offset(防止主库换人)。主库收到从库信息后判断是全量复制还是断网后复制
全量复制:刚开始的初次复制。过程:主库实行GBSAVE(此刻能够访问的操作),生成RDB文件,从库根据RDB恢复。
主从复制:断网后的恢复。过程:发送主库id和偏移量offset,查看消息队列缓冲区。否则进行全量复制。
哨兵机制
处理主库掉线情况,哨兵监控主从情况,每10秒钟向哨兵系统发送此刻情况,当某个哨兵发现主库异常认定为主观掉线,此时联系其他哨兵链接主库试一试当半数都链接不上,认定为主库客观掉线,选取新的主库出来。
当新选出的主库发送给其他从库新的主库id和ip地址,旧主库重新上线变为从库。
集群cluster
当数据特别多的时候,提供的分布式数据库解决方案,将数据切片。
分片策略:对16384取模,每个节点进行认领曹slot
查询策略:每个节点都存储集群的节点信息,这些信息为元信息。元信息包括各个节点的槽数据,各个节点的主从复制,节点存活状态
元数据的传播:使用gossip协议,周期性隔一段时间进行更新,病毒方式传播