redis (ap保证可用性)
基于内存的单线程操作,所以不能用bigkey
一共16个库(0-15)
数据结构
string字符串(INCR 文章阅读数等)
hash (购物车 商品id+商品数量)
list列表 (LPUSH LRANGE 微博微信消息流,不适用大流量)
set集合 (SADD 交集并集计算 微信抽奖、点赞、关注模型、共同好友、商品筛选)
zset有序集合 (ZADD 每个集合带有分值 分值+1 微博热搜、排行榜)
分布式锁
SETNX命令(在高并发情况下产生商品购买的情景)
1.代码异常下:
要加finally代码块,保证释放锁
2..服务宕机情况下:
设置超时时间,在高并发情况下,给线程加唯一id 然后判断线程的唯一id,防止锁永久失效
3.释放锁之前超时了:
4.超时时间问题:
另外起线程 定时任务查看是否持有锁,还原超时时间(锁续命)
5.使用redisson工具加锁释放锁,加锁的方法底层执行lua脚本,保证原子性的
问题
1.讲讲redis
redis是一种支持key-value等多种数据结构的存储系统,用于缓存、订阅等,基于内存存储,可持久化
2.有哪些数据结构
string字符串、hash、list列表 、set集合 、zset有序集合
3.redis的持久化
数据(内存中的对象)保存到可永久保存的存储设备中(磁盘)
1.应用层:如果关闭(shutdown)你的应用然后重新启动则先前的数据依然存在。
2.系统层:如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。
3.为什么要持久化:为了防止重启系统或者关闭系统丢失数据
4.如何持久化:
RDB持久化:能够在指定的时间间隔能对你的数据进行快照存储。
AOF持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的
5.缓存穿透:
缓存穿透是指用户请求的数据,不在内存中,也不在数据库中,如果有恶意攻击不断请求不存在的数据。数据库会因为大量的请求导致压力过大崩溃。
6.缓存击穿:
缓存击穿是指一个key非常热点,大量请求导致key失效,穿过redis直接请求数据库
如何解决:1.使用互斥锁2.针对热点key不设置过期时间
7.缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。
如何解决:1.加互斥锁2.用一个异步的线程更新缓存
8.缓存预热:
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,就不需要用户先查数据库再添加到缓存中。
9.什么是redis主从复制
主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器,数据的复制是单向的,只能由主节点到从节点。
10.讲一讲redis集群
redis命令手册:Redis 命令参考 - Redis 命令参考
参考:2020年Java后端面试题大全96集(阿里+京东+美团+滴滴)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
看完这20道Redis面试题后,蚂蚁金服面试可以约起来了?