目录
应用场景
秒杀、双十一、突发时政要闻、在线人数、单服务器升级集群
是一个内存数据库,读写非常快,广泛应用于缓存方向,可以做分布式锁,和消息队列
和mysql的区别
mysql:关系型数据库,持久化的存储数据到硬盘,功能强大、速度较慢
redis:缓存数据库、存储使用频繁的数据到缓存中,读取速度快
数据类型(五种)
string:是key-value 类型,都是String类型
添加(set key value)、添加多个(mset key1 value1)、获取(get key)、获取多个(mget key1 key2)、获取数据字符个数(strlen key)、追加(append key value没有就创建)、删除(del key)、计数器(incr、decr)
成功(integer 1)、失败(integer 0)、找不到(nil)
mset一般比单个set效率高,但mset如果执行一条很长的语句,则要进行适当的分割
自己构建了一种 简单动态字符串(SDS):可以保存文本数据和二进制数据、获取字符串长度复杂度O(1)、安全的
应用场景:一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等
list:是链表,支持反向查找和遍历
常用命令:rpush,lpop,lpush,rpop,lrange、llen
等
应用场景: 发布与订阅或者说消息队列、慢查询
hash:特别适合用于存储对象
常用命令: hset,hmset,hexists,hget,hgetall,hkeys,hvals
等
应用场景: 系统中对象数据的存储
set:类似HashSet,无序不重复
常用命令: sadd,spop,smembers,sismember,scard,sinterstore,sunion
等
应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
sorted set:和set相比增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列
常用命令: zadd,zcard,zscore,zrange,zrevrange,zrem
等
应用场景: 需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息
缓存数据处理流程
为什么使用缓存
提高性能:用户访问的数据属于高频数据并且不会经常改变的话,可以放入缓存(但要保证数据库和缓存的一致性)
高并发:直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的
缓存雪崩,缓存穿透、缓存击穿怎么解决?
缓存雪崩
缓存同一时间大面积失效,请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉(redis重启)
解决方案:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期
- 给每一个缓存数据增加相应的缓存标记,记录是否失效,如果缓存标记失效则更新数据缓存(比较消耗性能)
- 缓存预热(启动系统之前,写一个接口,把热点数据放入接口)
- 互斥锁(防止大量的请求对同一个键进行操作)
缓存穿透
指缓存和数据库中都没有的数据,导致所有的请求落在数据库上,造成数据库短时间内承受大量请求而崩掉(一般是遭到攻击,高并发情况)
解决方案:
- 接口层增加参数校验,id<=0的直接拦截
- 可以将key-value对写为key-null
- 采用布隆过滤器:不存在的数据在布隆过滤器中一定会被拦截
缓存击穿
缓存中没有数据库中有(缓存过期),此时由于并发用户特别多,在缓存中没有数据,全部去访问数据库,导致数据库压力极具增大
解决方案
- 设置热点数据不过期
- 加互斥锁