- redis支持 string list set hash zset,memcached只支持string
- redis支持数据持久化,可以把内存中的数据持久化到硬盘上,memcached不支持,只能存到内存中,重启就没有数据了。
- redis使用的是单线程的多路IO复用机制
因为传统的关系型数据库已经不适用于所用的场景了,比如秒杀时的库存扣减,APP首页的访问流量高峰。很容易把数据库搞崩,所以就需要用到缓存中间件。目前市面上常用的中间件就是redis和mc。
2Redis为什么要把数据放到内存中?如果不将数据放到内存中,磁盘的IO速度会严重影响性能。
Redis为什么这么快?- redis大部分 *** 作在内存中完成,
- redis是单线程的多路IO复用机制
string:缓存,做计数器,分布式系统升自增长ID
list:异步队列,任务轮询,文章列表
hash:记录博客中某个博主的页面访问量,名字,信息
set:微博抽奖,QQ标签,共同关注 好友(交集)
sorted set:排行榜
Redis的过期策略有哪些?大量key集中过期导致卡顿如何解决?Redis过期策略采用的是惰性删除+定期删除策略。
大量key集中过期导致卡顿如何解决?
- 在设置过期时间时,增加一个随机时间
RDB做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要AOF来配合使用。在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放近期的 *** 作指令来实现完整恢复重启之前的状态。
缓存雪崩、击穿、穿透如何解决?-
缓存雪崩:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,全部转发到数据库中,导致数据库压力过大而崩溃。
可以加给过期时间加一个随机数
-
缓存击穿:某一个key在某个时间点被高并发的访问。
可以采用互斥锁/分布锁。让一个线程去查询,其他线程等待
-
缓存穿透:恶意请求不存在的key,导致缓存无法命中,每次都去查数据库
如果数据库查不到就设置NULL并设置过期时间
对参数做校验,不合法的参数直接return
使用布隆过滤器判断数据是否存在
原子性:多个命令要么全部成功,要么全部失败。
通过Lua脚本实现:多个 *** 作写道lua脚本中,redis把整个lua脚本作为整体执行
它给集合中的每一个元素设置分数,按照其分数进行排序,也不允许有重复值
缓存的原理有缓存则读缓存,没缓存则读数据库然后做缓存
MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
如果有大量的key需要设置同一时间过期,一般需要注意什么?可能会出现缓存雪崩,我们一般需要在过期时间上加一个随机值。
那你使用过Redis分布式锁么,它是什么回事?先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记释放。
使用过Redis做异步队列么,你是怎么用的?使用list最为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再试。
如果对方追问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。
如果对方接着追问能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列。
如果对方继续追问 pub/sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)