关于Java208面试题答案Redis

  1. Redis 是什么?都有哪些使用场景?
    Redis是一个开源的使用 C语言编写支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
    数据高并发的读写
    海量数据的读写
    对扩展性要求高的数据
    记录点赞数、评论数和点击数 (hash)。
    记录用户 ID 列表 (排序),便于快速显示用户列表 (zset)。
    记录标题、摘要、作者和封面信息,用于列表页展示 (hash)。
    记录点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
    缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
    记录相关文章 ID,根据内容推荐相关帖子 (list)。
    如果ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
    收藏集和帖子之间的关系 (zset)。
    记录热榜 ID 列表,总热榜和分类热榜 (zset)。
    缓存用户行为历史,进行恶意行为过滤 (zset,hash)。
  2. Redis 有哪些功能?
    数据缓存功能
    分布式锁的功能
    支持数据持久化
    支持事务
    支持消息队列
    支持发布/订阅
  3. Redis 和 MemeCache 有什么区别?
    memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
    redis的速度比memcached快很多
    redis可以持久化其数据
  4. Redis 为什么是单线程的?
    因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。
    关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
    而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。
  5. 什么是缓存穿透?怎么解决?
    缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
    解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟
    如果请求的id是附属的,可以使用布隆过滤器或者压缩filter提前拦截,不合法就不让这个请求走数据库了

redis挂掉了,请求全部走数据库
1.事发前:实现redis高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免redis挂掉这种事情的发生
2.事发中:万一redis真的挂掉了,设置本地缓存(ehcache)+限流(hystrix),尽量避免数据库被干(起码能保证我们的服务还是能正常工作的)
3.事发后:redis持久化,启动后自动从磁盘上加载数据,快速恢复缓存数据
对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库,从而发送缓存雪崩
在缓存的时候给过期时间加一个随机值,这样就会大幅度的减少缓存在同一时间过期
184. Redis 支持的数据类型有哪些?
string:最基本的数据类型,二进制安全的字符串,最大512M。
list:按照添加顺序保持顺序的字符串列表。
set:无序的字符串集合,不存在重复的元素。
sorted set:已排序的字符串集合。
hash:key-value对的一种集合。
bitmap:更细化的一种操作,以bit为单位。
hyperloglog:基于概率的数据结构。
185. Redis 支持的 Java 客户端都有哪些?
Redisson,Jedis,lettuce
186. Jedis 和 Redisson 有哪些区别?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上
187. 怎么保证缓存和数据库数据的一致性?
合理设置缓存的过期时间。
新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。
188. Redis 持久化有几种方式?
RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。
189. Redis 怎么实现分布式锁?
Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。
获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过在释放锁的时候进行判断。
获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放
190. Redis 分布式锁有什么缺陷?
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
191. Redis 如何做内存优化?
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。
192. Redis 淘汰策略有哪些?
volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
no-enviction(驱逐):禁止驱逐数据。
193. Redis 常见的性能问题有哪些?该如何解决?
主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。
Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。
194.redis 6种过期策略的具体方式
redis 中的默认的过期策略是volatile-lru 。
设置方式 :config set maxmemory-policy volatile-lru
maxmemory-policy 六种方式
lru(算法)
volatile-lru(不稳定的):只对设置了过期时间的key进行LRU(默认)
allkeys-lru : 删除lru算法的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction(催眠) : 永不过期,返回错误

猜你喜欢

转载自blog.csdn.net/weixin_44100313/article/details/89884682