说下你对Redis的理解?
提示:从基本数据类型开始–》贯穿 持久化机制机制–》加上应用场景
首先,Redis有5种数据类型,分别是String、list、set、zset、hash,我在项目中最常用的是String,因为String是Key-value形式存储的。
Redis的话还有一个持久化机制,因为Redis是基于内存的,所以如果没有这个机制存在,那么Redis服务重启会造成数据的全部丢失。Redis主要分为2种持久化:RDB快照模式和AOP追加文件模式。先说一下RDB快照模式吧,它会根据我们自己设置的时间自动的生成或者通过save命令的方式,redis就会去生成RDB文件,这个RDB文件实际上就是一个压缩过的二进制文件,redis可以通过这个文件在服务启动的时候来还原我们的数据。而那个AOF追加文件模式的话,实现原理就是把Redis服务器接收到的所有的写命令都记录到日志中。
在项目中使用redis的话主要是存储一些用户登录后的信息,存订单的一个过期的key,还存有一些小程序首页加载的一些页面布局和商品信息等数据。
Redis的过期数据的删除策略是什么?
Redis采用的是惰性删除+定期删除。惰性删除是只会在取出key的时候才会对数据进行过期检查,但是会造成大量过期的key没有被删除。还有一种是定期删除,每隔一段时间删除一批过期的key。
缓存穿透
指缓存和数据库中都没有数据,导致请求都落到了数据库上。
解决办法:
最简单的方法就是做好参数校验,一些不合法的参数请求直接抛出异常给客户端。
1.可以缓存无效的key
==>设计key: 表名:列名:主键名:主键值
当缓存和数据库都查不到key的时候就写一个到Redis中并设置过期时间
2.使用布隆过滤器
把所有可能存在的请求值都存放在布隆过滤器中,当用户请求过来先判断用户发来的请求是否存在于布隆过滤器中。如果不存在直接返回请求参数错误信息给客户端,存在才会走下面的业务流程。
布隆过滤器怎么实现的:
布隆过滤器的本质是一个很长的位数组和一系列随机映射哈希函数,当有一个值进来的时候,会计算每一位的结果是否都为1,如果有0则直接返回。
缓存击穿
缓存中没有数据而数据库中有数据,一般是指缓存时间到期。
缓存雪崩
缓存在同一时间大面积失效,后面的请求都直接落在了数据库上,造成数据库短时间内承受大量请求。
解决方式:为了防止热点缓存失效的情况,设置不同的失效时间,比如随机设置的缓存失效时间
Redis常见的数据结构以及使用场景分析
string,list,hash,set,zset
string的数据结构是简单的key-value类型的,一般用在需要计数的场景,比如用户的访问次数,热点文章的点赞转发数量等等。
list的数据结构是双向链表,支持反向查找和遍历。list常用的应用场景为:消息发布,订阅和慢查询。
hash的数据结构为数组+链表。hash是一个string类型的field和value的映射表,非常适合存储对象hash应用的场景是:对象数据的存储。
set的数据结构相当于是Java中的HashSet,是一种无序集合,没有重复的值。set的应用场景是:共同关注的用户,共同的粉丝,共同的喜好。因为set可以很容易的实现交集,并集,差集的操作。
zset与set相比较,只是增加了一个权重参数分数score ,使得集合中的元素能够按照score进行有序排列,还可以通过score的范围来获取元素的列表。应用场景:对数据根据某个权重进行排行的场景。比如礼物排行榜