主要介绍:Redis概念,特点,数据存储类型,持久化方式及其优缺点,通讯协议,五种架构模式,缓存穿透、缓存雪崩、缓存并发及其的解决办法

关系数据库:

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

优点:

1、易于维护:都是使用表结构,格式一致;

2、使用方便:SQL语言通用,可用于复杂查询;

3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:

1、读写性能比较差,尤其是海量数据的高效率读写;

2、固定的表结构,灵活度稍欠;

3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库:

严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:

1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。

2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;

3、高扩展性;

4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

1、不提供sql支持,学习和使用成本较高;

2、无事务处理;

3、数据结构相对复杂,复杂查询方面稍欠。

Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,

一、特点:

1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用,若没有进行持久化操作,Redis服务器关闭后,数据库中变动的数据会消失

2.可以存储键和五种不同类型的值之间的映射。

键的类型只能为字符串,值支持五种数据类型:字符串(String)、列表(list)、集合(set)、散列表(hash)、有序集合(zset)。

优势:

1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

2.丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

3.原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

4.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性

二、使用方法:

下载解压到Redis目录:

1.在Redis目录下启动服务器及它的配置文件

redis-server.exe redis.windows.conf

2.开启客户端使用

redis-cli.exe -h 127.0.0.1 -p 6379

3.键值对使用

redis默认选择的是0数据库

String类型使用方法

set mykey 111——设置键值对

get mykey——获取键key对应的value

del  mykey——删除键,成功输出(integer) 1

exists mykey——检查是否存在key,没有输出(integer) 0

keys  myk*——查找所有符合模式的key集合,key * 可以查找所有当前数据库下的key对应的value

move mykey 1——将key移动到1数据库

rename mykey newkey——修改key的名称

type mykey——返回key对应的value的类型

getrange mykey 0 2 ——返回mykey的value的前三个字符

mget key1, key2....——得到多个key对应的value

mset key1 value1 key2 value2——同时设置多个key-value对

strlen mykey——返回key对应value长度

Hash类型使用方法——每个key对应的是一个对象

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)

hmset student name "likui" grade 3.56 class "1203"——设置student对象属性

hgetall student ——得到student对象的所有属性

设置对象属性和得到指定对象属性的方法

hexists student name——检查student的name属性是否存在

hkeys student——获取所有student的字段

hlen key——获取哈希表key的长度

hmget key field1,field2...——获取哈希表key对应的字段值

hmset  key field1 value2 field2 value2——设置hash表key对应属性值

获取所有hash表中的值

List类型使用方法——相对于是一个栈(stack)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

lpush list 1,2,....——往list集合中加入元素

lset list 0 1——设置list集合指定位置值

lindex list 0——获取集合中指定位置元素

lpop list——移除并获取列表中第一个元素

Set类型使用方法——无序不重复结合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)

sadd key value——往set集合中添加值

scard key——获取set集合成员数

smember key——返回set集合所有值

zset类型使用方法——有序不重复集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

有序集合的成员是唯一的,但分数(score)却可以重复

zadd key grade value

zadd key grade value2 ,往zset中添加元素方式,grade可以重复,但是value不能

zrank key value——返回zest中key指定元素索引

zrem key value——移除zset中指定元素

zscore key value——返回zset中指定元素分数值

4.操作数据库语句

select 数字  切换到指定数据库

三、Redis进行持久化的方式

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据

1. RDB持久化(Redis DataBase): 指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储

2. AOF持久化 (append only file): 原理是将Reids的操作日志以追加的方式写入文件。 AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,读操作不会记录, 在服务器启动时,通过重新执行这些命令来还原数据集

具体持久化方式:

1)找到conf配置文件,打开它

2)在文件中搜索save

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10            #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

3)AOF持久化配置

在Redis的配置文件中存在三种同步方式,它们分别是:

# If unsure, use "everysec".

# appendfsync always  #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。

# appendfsync no  #从不同步。高效但是数据不会被持久化。

4)最后一定要在客户端使用shutdown命令关闭服务器

四、RDB和AOF持久化特点

RDB优点:

1.整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的

2.对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上

3.性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了

4.相比于AOF机制,如果数据集很大,RDB的启动效率会更高

RDB缺点:

1.一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失

2.如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟

AOF优点:

1.这个机制可以带来更高的数据安全性,即数据持久性。 每次修改后,操作都会被写入到日志文件中去,采取的同步机制在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容

2.AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作, 我们也可以通过该文件完成数据的重建

AOF缺点:

1.对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快

2.根据同步策略的不同,AOF在运行效率上往往会慢于RDB

选择方面,如果系统追求高性能,可以采用RDB持久化方式,若是追求安全性,查看服务器操作日志、防止系统宕机情况发生的话采取AOF持久化方式较好

五、Redis通讯协议( Redis Serialization Protocol,RESP)

RESP 是redis客户端和服务端之前使用的一种通讯协议, 基于请求-响应的模式

RESP 的特点:实现简单、快速解析、可读性好

RESP有五种最小的单元类型,单元结束时统一加上回车换行符号\r\n

(+) 表示一个正确的状态信息,具体信息是当前行+后面的字符。

(-) 表示一个错误信息,具体信息是当前行-后面的字符。

(*) 表示消息体总共有多少行,不包括当前行,*后面是具体的行数。

($)表示下一行数据长度,不包括换行符长度\r\n,)表示下一行数据长度,不包括换行符长度\r\n,后面则是对应的长度的数据。

(:) 表示返回一个数值,:后面是相应的数字节符。

可以通过wireshark软件查看

set demo 123456  //MSEP进行处理*3\r\n #消息一共有三行$3\r\n #第一行有长度为3set\r\n #第一行的消息$4\r\n #第二行长度为4demo\r\n #第二行的消息$6\r\n #第三行长度为6123456\r\n #第三行的消息+OK\r\n #操作成功

六、Redis有哪些架构模式?

1.单机版。多个客户端访问一个服务器,多用于在本地运行的程序,服务器在本机上

特点:

简单;内存容量有限、处理能力有效、无法高可用

2.主从复制。 Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。

特点:

1、master/slave 角色

2、master/slave 数据相同

3、降低 master 读压力在转交给从库

3.哨兵(sentinel)。sentinel 是一个分布式系统中监控 redis 主从服务器, 并在主服务器下线时自动进行故障转移

特点:

1)监控(Monitoring):Sentinel  会不断地检查你的主服务器和从服务器是否运作正常。

2)提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

3)自动故障迁移(Automatic failover): 如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master。

缺点:切换需要时间,会丢失数据

4.集群(代理型):

特点:

1)多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins

2)支持失败节点自动删除

3)后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致

缺点:增加了新的 proxy,需要维护其高可用。

5.集群( redis-cluster): 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接

特点:

1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。

2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。

3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。

4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本

5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。

缺点:

1、资源隔离性较差,容易出现相互影响的情况。

2、数据通过异步复制,不保证数据的强一致性

七、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?缓存并发问题?

Redis一般用于充当缓存数据库功能 ,一般的缓存系统, 数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存,如果数据库查询对象为空,则不放进缓存

1.缓存穿透

恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。这就叫做缓存穿透。

2.如何避免穿透 ?

1)对查询结果为空的情况也进行缓存:缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

2) 加锁( synchronized,lock):key获取value值为空时,对后端数据库操作语句加锁锁上,从数据库中load数据后再释放锁

3.缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,在失效的时候,大量的请求会给数据库带来很大压力。导致系统崩溃

4.如何避免?

1)加锁:通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

2)二级缓存:A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

3)设置不同过期时间:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

5.缓存并发问题?

多个redis的client同时set key引起的并发问题, redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。 将这些操作放在队列中使其串行化,一个一个的进行执行,或者进行加锁

后台开发人员面试内容——Redis非关系数据库(三)相关推荐

  1. 后台开发人员面试内容——JVM虚拟机(四)

    一.Java类加载机制 类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolut ...

  2. 后台开发人员面试内容——数据库(二)

    数据库锁分类 从数据库系统角度分为三种:排他锁.共享锁.更新锁. 从程序员角度分为两种:一种是悲观锁,一种乐观锁. 1.乐观锁和悲观锁 1).乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲 ...

  3. 后台开发人员面试内容——计算机网络(五)

    计算机网络 一.OSI七层网络协议: 应用层--表示层--会话层--传输层--网络层--数据链路层--物理层 五层体系机构: 应用层--传输层(TCP报文.UDP数据包)--网络层(IP数据报或分组) ...

  4. 后台开发人员面试内容——操作系统(一)

    操作系统 并发编程的3个基本概念 1.原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行 2.可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值 ...

  5. 2018平安科技春季校招后台开发人员面试经历

    步骤 1.在线IQ.EQ测试,EQ测试题量大,选正能量.积极的选项即可. 2.通过1之后隔天会收到在线笔试邀请,附笔试地址链接.牛客网的题,12道单选,4道多选,两道编程,内容上涵盖了网络基础,jav ...

  6. 多线程编程是后台开发人员的基本功

    这里先给大家分享一个小故事: 在我刚开始参加工作的那年,公司安排我开发一款即时通讯软件(IM,类似于 QQ 聊天软件),在这之前我心里也知道如果多线程操作一个整型值是要加锁的,但是当时为了图代码简便, ...

  7. 2021年4月19日 深圳头条后台开发实习面试(二面)(含总结)

    title: 2021年4月19日 深圳头条后台开发实习面试(二面) tags: 面经 2021年4月19日 深圳头条后台开发实习面试(二面) 自我介绍 面试直接跟我讲你想让我问哪个方面的问题呢?(这 ...

  8. 开发人员面试62到经典题

    开发人员面试62到经典题 ENTER TITLE 1.请介绍一下你自己 这是面试官100%会问的问题,一般人回答这个问题过于平常,只说姓名.年龄.爱好.所学专业等,如果你用一分钟来重复你的简历,那么, ...

  9. 电商生鲜网站开发(三)——后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧

    电商生鲜网站开发(三)--后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧 分类层级 在商品分类上需要继续做归类操作 分类设置成三级 层级太深的弊端:对用户不友好,不利于 ...

最新文章

  1. 5G 信令流程 — 5GC 的会话管理(SM,Session Management)
  2. HGOI 20181103 题解
  3. springboot映射服务器目录,Spring boot文件路径映射配置代码实例
  4. nginx 去掉服务器版本和名称和nginx_status 状态说明
  5. Android环境配置
  6. 【我的物联网成长记14】车路协同,不只是车和路
  7. jq常用过滤器_JQuery的常用选择器、过滤器、方法全面介绍
  8. Android 应用开发(17)---应用权限
  9. Android 系统(42)---Android7.0 PowerManagerService亮灭屏分析(三)
  10. spring-boot报错循环注入报错:has been injected into other beans
  11. 如何防止数据库中的信息被“脱库”-笔记
  12. 推荐几款比较好用的聊天机器人bot开发工具
  13. itest听力答案2020_大学英语itest2018答案
  14. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍
  15. [Atlassian]JiraConfluenceCrowd配置SSO
  16. Python计算温度植被干旱指数(TVDI)
  17. 判断按键输入代码及 vk 键值对应表
  18. 5.4呈献:HP-Socket v5.3.1 支持 Android NDK
  19. Arduino ESP8266 MQTT 阿里 腾讯 连接示例
  20. java二元运算符_java – 什么原因导致“二元运算符的错误操作数类型’==’”与第二种类型?...

热门文章

  1. 我最喜欢的科目是计算机英语,我最喜欢的科目英语作文
  2. ceph与hdfs的比较_分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?
  3. pytorch Tensor的操作和Numpy之间的转化(三)
  4. RoFormerV2:自然语言理解的极限探索
  5. 直播 | 北京邮电大学助理教授王啸:网络嵌入的最新进展
  6. ACL 2020 | MobileBERT:一种与任务无关的模型压缩方法
  7. “玩转标签,发现层次的力量!”:跨模态哈希方法研究
  8. 经典论文复现 | PyraNet:基于特征金字塔网络的人体姿态估计
  9. 51Nod1079 中国剩余定理
  10. SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)