700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 后台开发人员面试内容——Redis非关系数据库(三)

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

时间:2022-08-18 17:36:52

相关推荐

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

主要介绍: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类型使用方法

setmykey 111——设置键值对

getmykey——获取键key对应的value

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

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

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

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

renamemykeynewkey——修改key的名称

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

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

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

msetkey1value1key2value2——同时设置多个key-value对

strlenmykey——返回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对象的所有属性

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

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

hkeysstudent——获取所有student的字段

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

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

hmset keyfield1 value2 field2value2——设置hash表key对应属性值

获取所有hash表中的值

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

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

lpushlist 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集合成员数

smemberkey——返回set集合所有值

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

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

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

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

zaddkeygradevalue

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

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

zremkeyvalue——移除zset中指定元素

zscorekeyvalue——返回zset中指定元素分数值

4.操作数据库语句

select数字 切换到指定数据库

三、Redis进行持久化的方式

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

1.RDB持久化(RedisDataBase)指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程是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软件查看

setdemo 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并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。将这些操作放在队列中使其串行化,一个一个的进行执行,或者进行加锁

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。