Redis

作者: 做自己的Yang光 | 来源:发表于2019-08-08 14:01 被阅读0次

NoSQL(基于内存的数据库),并且提供一定的持久化功能。RedisMongoDB是当前使用最广泛的NoSQL。Redis的性能十分优越,可以支持每秒十几万次的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。

1.Redis 在 Java Web 主要有两个应用场景:

1)存储缓存用的数据;

2)需要高速读/写的场合使用它快速读/写

2.Redis持久化?持久化方式?优缺点?

Redis持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

Redis 提供了两种持久化方式:

1)RDB(默认,Redis DataBase缩写) :定时的持久机制,宕机有可能会存在数据丢失。

功能核心函数:rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)

2)AOF(Append-only file缩写):基于操作日志的持久机制。

每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作。AOF写入保存:1) WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件;2)SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

存储结构:Redis通讯协议(RESP)格式的命令文本存储。(RESP 是redis客户端和服务端之间使用的一种通讯协议;其特点:实现简单、快速解析、可读性好)

比较:   1)AOF文件比RDB更新频率高,优先使用AOF还原数据;

              2)AOF比RDB更安全也更大;

              3)RDB性能比AOF好;

              4)若两个都配置了优先加载AOF。

3.什么是RESP(redis通讯协议)?有什么特点?

RESP是Redis客户端与服务端之间使用的一种通讯协议。

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

4.Redis 有哪些架构模式?讲讲各自的特点?

单机版

特点:简单

问题:1)内存容量有限;2)处理能力有限;3)无法高可用。

主从复制

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

特点:1)master/slave角色;2)master/slave数据相同;3)降低master读压力在转交从库

问题:1)无法保证高可用;2)没有解决master写的压力

哨兵

Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:

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

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

自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

特点:1)保证高可用;2)监控各个节点;3)自动故障迁移

缺点:1)主从模式,切换需要时间丢数据;2)没有解决 master 写的压力

集群(proxy型)

集群(直连型)

5.Redis支持的数据结构?

String(字符串)、List(列表)、Set(集合)、zset(sorted set:有序集合)

6.缓存穿透?

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

如何避免?

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

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

7.缓存雪崩?

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

如何避免?

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

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

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

参考:https://blog.csdn.net/ahilll/article/details/82421994

https://www.cnblogs.com/shsxt/p/10763608.html

 https://blog.csdn.net/tlk20071/article/details/80384817

https://www.jianshu.com/p/56999f2b8e3b

1.持久化方式 

RDB:在指定的时间间隔能对你的数据进行快照存储。

AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。

RDB原理

AOF原理

https://segmentfault.com/a/1190000015983518

2.主从复制

https://www.cnblogs.com/shsxt/p/7911591.html

Redis支持简单且易用的主从复制,可以让从服务器成为主服务器的精准复制品。

Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流的处理进度。

一个主服务器可以有多个从服务器。

不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构。

复制功能不会阻塞主服务器: 即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。

复制功能也不会阻塞从服务器: 只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。

复制功能可以单纯地用于数据冗余(data redundancy), 也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT 命令可以交给附属节点去运行。 

可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。

相关文章

网友评论

      本文标题:Redis

      本文链接:https://www.haomeiwen.com/subject/ihetjctx.html