什么是redis
- 是一个开源的,可基于内存亦可持久化的key-value数据库,支持多种语言
redis使用场景
- 缓存,减轻mysql压力,提升系统性能
- 排行榜:利用SortSet(有序集合)实现
- 计数器:利用原子性自增操作
- 好友关系:利用集合的交集,并集,差集等,解决共同好友等功能
- 消息队列
- session共享,用redis保存session,无论用户落在哪台机器上都能获取信息
redis常见功能
- 数据缓存功能
- 分布式锁功能
- 支持数据持久化
- 支持事务
- 支持消息队列
redis数据类型
- String字符串
- 哈希(Hash),键值对结构,常用与用户信息管理,但是哈希是稀疏的,不利于复杂查询
- 列表(List):用来储存多个有序的字符串,能充当队列和栈
- 集合(set):保存多个字符串,但是不允许重复,无序,适合去交集并集等
- 有序集合(zset):不能有重复元素,但是是有序的,如排行榜
redis速度快
- 完全基于内存,绝大部分是纯粹的内存操作
- 数据结构简单,对数据的操作也简单
- 采用单线程,不存在锁的问题
- 使用多路I/O复用模型,非阻塞IO
缓存穿透
- 一直查询一个一定不存在的数据,因为没有写入缓存,每次都要去数据库查询
- 设定一个时间较短的空字符串
缓存雪崩
- 缓存集中在一个时间失效,所有查询都去数据库找
- 解决方法
- 加锁排队:缓存失效后,通过加锁或者队列来控制数据库读写缓存的线程数量
- 数据预热:缓存reload机制,预先更新缓存,即将雪崩前加载缓存设定不同时间
- 做二级缓存,缓存时间较长
- 给过期时间加一个随机值
保证缓存和数据库数据的一致性
- 双写一致性方案
- 先删除缓存,后更新数据库
- 先淘汰缓存,再写数据库,休眠一秒再淘汰缓存
- 先更新数据库,后删除缓存
- 先删除缓存,后更新数据库
redis持久化
- RDB
- Redis DataBase:按照一定的时间周期把内存数据以快照的形式保存到硬盘的二进制文件
- 即snapshot快照储存,产生的数据文件为dump.rdb
- rdbSave(生成RDB文件),rdbLoad(从文件加载内存)
- AOF
- Append-only file,将每一个收到的命令都以write函数追加到文件最后,类似于binLog
- AOF比RDB更新频率高,优先使用AOF还原数据
- AOF比RDB更安全也更大
- RDB性能更好
Redis内存淘汰策略
- 从已经设置过期时间的数据集中,挑选最少使用,将要过期,任意挑选数据淘汰
- 从数据集中挑选最少使用,任意数据淘汰
- 不淘汰数据
redis与memcached相比
- reis数据类型更丰富
- 支持持久化储存
- 提供主从同步机制,以及集群部署能力
- 速度要快很多
- 使用单线程的多路复用IO复用模型,m使用多线程非阻塞io模型
缓存预热
- 提前将相关的缓存数据记载到系统
- 数据量不大时,工程启动时就加载缓存
- 数据量大时。设置定时任务脚本,刷新缓存
- 数据量太大时,保证热点数据
常见的分布式锁的解决方案
- 关系型数据库,主键索引和唯一索引,依靠唯一性来实现资源锁定
- 插入失败就会报错
- 基于redis实现,适合高并发获取释放锁操作,但不够健壮
- 基于zookeeper:分布式协调,强一致性,很健壮
redis分布式锁
- 加锁:setnx,key是锁的唯一标志,返回1,key不存在,获得锁
- 解锁:del命令
- 设置超时时间,到时间后锁自动释放