Redis 介绍

Redis是一个开源的使用ANSI C语言编写、遵循BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言API的非关系型数据库。

Redis 支持的数据类型

  • String (字符串)
    格式:set key value
    String 类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
    String 类型是redis最基本的数据类型,一个键最大能存储512MB。
  • Hash(哈希)
    格式:hmset name key1 value1 key2 value2
    Redis hash是一个键值(key=>value)对集合,
    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • List(列表)
  • Redis列表是简单的字符串列表,按照插入插入顺序排序。可以添加一个元素到列表的头部或者尾部。
    格式:lpush name value
    在key对应list的头部添加元素
    格式:rpush name value
    在key对应list的尾部添加元素
    格式:lrem name index
    Key 对应list中删除count个和value相同的元素
    格式:llen name
    返回key对应的list长度
  • Set(集合)
    格式:sadd name value
    Redis的set是string类型的无序集合。
    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0。
  • Zset(sorted set:有序集合)
    格式:zadd name score value
    Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个 double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大排序的。
    Zset 的成员是唯一的,但分数(score)却可以重复。

什么是redis持久化?Redis有那几种持久化方式,优缺点。持久化是把内存中的数据写到磁盘中去,防止服务器宕机内存中的数据丢失。

Redis提供了两种持久化的方式:RDB(默认)和AOF

  • Rdb
    Rdb是redis DataBase缩写功能核心函数rdbSave(生成rdb文件)和rdbLoad(从文件加载内存)两个函数。

  • AOF
    Aof是append-only file缩写
    每当执行服务器(定时)任务或者函数flushAppendOnlyFile函数都会被调用,这个函数执行以下两个工作。

    Aof写入保存:
    WRITE:根据条件,将aof_buf中的缓存写入到AOF文件
    SAVE:根据条件,调用fsync或fdatasync函数,将AOF文件保存到磁盘。
    存储结构:内容是redis通讯协议(RESP)格式的命令文本存储。
    RESP是redis客户端和服务端之间使用的一种通讯协议;
    RESP的特点:实现简单、快速解析、可读性好

  • Rdb与Aof对比
    1、aof文件比rdb更新频率高,优先使用aof还原数据。
    2、Aof比rdb更安全也更大
    3、Rdb性能比aof好
    4、如果两个都配置了优先加载aof

redis架构模式,各自的特点

  • 单机版

    特点:简单
    问题:1、内存容量有限2、处理能力有限3、无法高可用
  • 主从复制

    Redis的复制(replicstion)功能允许用户根据一个Redis服务器来创建任意多个该服务的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。只要主从服务器之间的网络连接正常,主从服务器两者会具有相同数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
    特点:
    1、master/slave角色
    2、Master/slave数据相同
    3、降低master读压力在转交从库
    问题:
    无法保证高可用,没有解决master写的压力
  • 哨兵

    Redis sentinel是一个分布式系统中监控redis主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:
    监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
    提醒(Notification):当被监控的某个redis服务器出现问题是,Sentinel可以通过API向管理员或者其他应用程序发送通知。
    自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作。
    特点:
    1、保证高可用
    2、监控各个节点
    3、自动故障迁移
    确定:主从模式,切换需要时间丢数据,没办法解决master写的压力
  • 集群(proxy型)

    Twemproxy是一个Twitter开源的一个redis和memcache快速/轻量级代理服务器;Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和redis协议。
    特点:
    1、多种hash算法:MD5、CRC16、CRC32、CRC32a、hsish、murmur、jenkins
    2、支持失败节点自动删除
    3、后端Sharding分片逻辑对业务透明,业务方的读写方式和操作单个Redis一致。
    缺点:添加了新的proxy,需要维护其高可用。
    Failover逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预
  • 集群(直连型)

    从redis 3.0之后版本支持redis-cluster采用务中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所以节点连接。
    特点:
    1、无中心架构(不存在哪个节点影响性能瓶颈),少了proxy层。
    2、数据按照slot存储分布式在多个节点,节点间数据共享,可动态调整数据分布。
    3、可扩展性,可线性扩展到1000个节点,节点可动态添加或删除。
    4、高可用性,部分节点不可用时,集群仍可用。通过添加slave做备份数据副本。
    5、实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。
    缺点:
    1、资源隔离型较差,容易出现相互影响的情况。
    2、数据通过异步复制,不保证数据的一致性。

使用过Redis分布式锁吗,他是怎么实现的?

先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记释放。
如果在setnx之后执行expire之前进程意外crash或者要重启维护了该怎么办?
Set指令有非常复杂的参数,这个应该是可以同事把setnx和expire合成一条指令来用的。

使用过redis做异步队列吗,你是怎么用的,有什么缺点?

一般使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会在重试。
缺点:
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。
能不能生产一次消费多次呢?
使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?

缓存穿透:
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value值,就应该去后端系统查询(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后台系统造成很大的压力。这就叫缓存穿透。
如何避免:
1、对查询结果为空的情况下也进行缓存,缓存时间设置短一点,或者该key对应的数insert了之后清理缓存。
2、对一定不存在的key值进行过滤。可以把所有的可能存在的key放到一个大的bitmap中,查询是通过bitmap过滤。
缓存雪崩:
当缓存服务器重启或者缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大的压力。导致系统崩溃。
如何避免:
1、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询和写缓存,其他线程等待。
2、做二级缓存,a1为原始缓存,a2为拷贝缓存,a1失效时,可以访问a2,a1缓存时间设置短期,a2设置为长期。
3、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

自己总结,有帮助到记得点赞哦^_* 谢谢!

Redis 最全面试题(2021)相关推荐

  1. Redis高频面试题汇总(2021最新版)

        本文已收录于专栏 ⭐️<Redis面试题汇总--2021最新版本>⭐️ 上千人点赞收藏,全套Redis高频面试题,大厂必备技能! 面试官心理分析 从面试官的角度分析,出这道题的目的 ...

  2. Redis常见面试题总结

    Redis常见面试题 持久化方式有哪些?有什么区别? redis持久化方案分为RDB和AOF两种. RDB RDB持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上的数据库状态保存到R ...

  3. 前端面试题2021(超详细)

    真的是一篇好文章,好文就要收藏~ 晟小明 身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案

  4. 七天玩转Redis 第七天打卡 Redis常见面试题及课程总结

    七天玩转Redis 第七天打卡 Redis常见面试题及课程总结 主要总结点: 截止到今天,七天玩转Redis课程就马上结束了,学以致用,那么学会了Redis,在找工作时会有哪些面试官爱问的问题呢? 一 ...

  5. 2022年Redis最新面试题

    2022年Redis最新面试题 一.Redis基础知识 1.什么是 Redis, 有哪些优缺点? 2.Redis 最适合的场景, 可以简单的说说吗? 3.Redis 相比 Memcached 有哪些优 ...

  6. 看文档学redis以及面试题2(配套发出有docker以及linux两个不同的皆可学习)

    看文档学redis以及面试题(配套发出有docker以及linux两个不同的皆可学习) 遇到的坑都会讲到 这是配套的第二章内容 今天讲的是redis的五大数据类型的使用场景以及五大数据类型的常用命令以 ...

  7. 美团笔试题2021.8.29(第四题求大佬解答)

    美团笔试题2021.8.29 又再帮同学写,推了这周的周赛,侥幸都有点思路 丁香树 题目描述 思路 因为芳香值最大为30,所以用一个数组存储已走过的芳香值,然后走到第i个点,找比当前芳香值小的有多少个 ...

  8. Redis常见面试题(缓存击穿、穿透、雪崩)

    Redis常见面试题(缓存击穿.穿透.雪崩) 击穿 场景: 一般由于redis中的数据到期,同时并发用户特别多,此时大量请求压到数据库上. 解决思路: 根据redis是单进程单实例的特性,当高流量进入 ...

  9. 2022年Redis最新面试题- Redis集群

    最近整理一份关于Redis常见面试题的,也会根据自己的经验, 标注一些出现的概率,最高5颗★出现的概率最高.比如这样: Redis 最适合的场景, 可以简单的说说吗? 出现概率: ★★★★ 整体目录大 ...

最新文章

  1. mysql installer图解_MySQL Installer GUI - 图解
  2. Java VS .Net 程序员的困惑 (转)
  3. UVa 1583 - Digit Generator
  4. mysqlbinlog 恢复mysql数据
  5. 关于Puremvc的理解
  6. 解决fatal: 不是一个 git 仓库(或者任何父目录)的方法
  7. matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...
  8. 如何给UNIX域Socket套接字抓包?
  9. 聚类算法—K-means python实现
  10. 如何自学python-如何自学python语言
  11. 隐秘攻击:恶意病毒可使智能手机加速老化
  12. 后台解析数据--form表单get、post方法的使用(如何上传图片到服务器)
  13. Windows10 开机跳过密码验证
  14. DotSpatial入门
  15. 儿童使用计算机和手机的 危害,手机对孩子的4个不良影响,第3个最严重!
  16. Java多重选择switch
  17. 牛年第一瓜!阿里女员工被初中文化男子骗走500多万!开豪车连骗12名女性,被判无期!...
  18. 【第二十四期】golang 一年经验开发 富途
  19. Sentence Centrality Revisited for Unsupervised Summarization
  20. 贝叶斯估计和极大似然估计到底有何区别

热门文章

  1. cubemx使用FATFS实现对U盘读取 --- STM32F407
  2. 如何在word中输入分数
  3. 剑指Offer59-数据流中的中位数
  4. 爱奇艺RND框架之JS Framework解析
  5. 再获认可!天威诚信入选中国信通院“数据安全共同体计划(DSC)”
  6. 华为android版本9什么意思,基于Android P的华为EMUI 9.0系统正式发布
  7. EGit /用户指南
  8. ​Kraken一月加密市场波动报告:地震级转型?
  9. Python画图2(八卦阵等)
  10. 【SQL性能优化】当我们思考数据库调优的时候,都有哪些维度可以选择?