Redis
Redis应用场景
(1) 缓存(数据查询,短链接,新闻内容,商品内容等)
(2)聊天室在线好友列表
(3)任务队列(秒杀 ,抢购,12306)
(4)应用排行榜
(5)网站访问统计
(6)数据过期处理
(7)分布式集群架构中的session问题
一般这种需要频繁读取数据库中数据的应用
daemonize介绍 守护线程
redis.conf配置文件中可以设置daemonize守护线程
daemonize:yes 时会采用单进程多线程模式,即使redis可以在后台运行,但需要kill掉进程才会关闭,
daemonize:no 当前界面将进入redis的命令行界面,exit退出界面 一般使用后台运行操作起来更方便
Redis数据结构
Redis是一种基于内存的数据库,并且提供一定的持久化功能,是键值数据库
数据类型有String–保存字符串,整数和浮点数,
List–链表,每一个节点都包含一个字符串,
Set–每一个元素都是一个字符串,
Hash–类似于Map键值对应的无序列表
Zset–有序集合可包含字符串,整数,浮点数,分值等
HyperLogLog–计算不重复的值以确定存储数量
Redis持久化
1.RDB持久化
以二进制文件进行存储,间隔一段时间进行持久化,save时间为
更改1个key时间隔900s;
更改10个key时间隔300s;
更改10000个key间隔60s;
2.AOF持久化
将“操作+数据”以格式化指令的方式追加到操作日志文件的尾部。
AOF同步方式:
always:每一条aof记录进行同步
everysec:每秒同步一次
no:redis并不直接调用文件同步,而是交给操作系统来处理
Redis主从复制
端口号 6380
主从复制原理:1.当主库和从库建立Master-Slave关系后,会向主数据库发送SYNC命令
2.主库接收到SYNC命令后会开始在后台保存快照(持久化),并将期间接收到的写命令缓存起来
3.快照完成后,主Redis会将快照文件和所有缓存的写命令发送给Redis
4.从Redis接收后,会载入快照文件并且执行收到缓存命令
5.主Redis每当收到写命令时,都会将命令放松给从Redis,以保证数据一致性。
哨兵模式
通过Sentinel 哨兵模式,可以通过投票选出一台从机升格为主机
Redis集群方案
架构细节
1.所有redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
2.节点的fail是通过集群中超过半数的节点检测有效时整个集群才生效
3.客户端与redis节点直连,不需要proxy层,客户端不需要连接集群所有节点
4.redis-cluster,把所有物理节点映射到【0-16383】slot哈希槽上
Redis的缓存问题
Redis是内存数据存储,可以作为本地缓存的下一级缓存,对数据的读写操作即快。
缓存雪崩
由于原有缓存失效,新缓存没有恢复,所有数据读取写入都要到MySQL 中进行,极有可能造成数据库宕机,系统崩溃,这就是缓存雪崩
解决:当发生缓存雪崩时,通过加锁来人为降低数据的读取写入频率,以降低数据库压力
缓存穿透
指数据为null时,数据中没有,则缓存肯定也没有,那么每一次要去MySQL数据库中查询,降低了数据库的效率
解决方案:1.当第一次读取数据时,设置一个默认值存放在缓存中,这样第二次到缓存中获取就有值了
缓存击穿
对于设置过期时间的key,如果这些key可能会在某些时间点被超高并发访问,是一种非常“热点”的数据,则可能会被发生缓存击穿问题
解决方案:
1.用锁,人为降低访问频率
2.不设置热点key的过期时间,而是将过期时间设置key对应的value里