实习日记07/19 day8 Redis的了解

今天聊聊Redis

无论什么业务,本质上就是对数据的操纵。

无论什么工具,本质上就是为了解决问题而诞生的。

由此可知,解决操作数据时所遇到的难题是后端开发的重点—我自己说的

Spring Boot和Mybatis是一对很棒的组合,以前是Hibernate,但对于一个项目来说却好像缺了点什么,对于一些常用数据,存储在硬盘上速度太慢了,所以今天我学习的是Redis,一款非关系型数据库。

带着问题看Redis

1.什么是Redis?

答:Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。同时 Redis 的诸多高层级功能使其可以胜任消息队列、任务队列等不同的角色

2.Redis的数据类型有哪些?

Redis的数据类型有五种:

1.String(字符串)。
2.Hash(哈希),键值对结构。
3.list(列表),列表的值有序可重复。
4.set(集合),集合值无序不可重复。
5.sort set(有序集合),集合值有序不可重复。

3.使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1),Redis性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

4.Redis相比Memcached有哪些优势?

Redis相比于Memcached来说,拥有更多的数据结构并且支持更丰富的数据操作,在Memcached里只能把数据取出来再去修改,而Redis并不需要,Redis支持内存数据持久化,同时在采用HashMap的情况下Redis的内存使用率高于Memcached

5.Memchache与Redis的区别都有哪些?

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;

3、虚拟内存Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;

4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;

5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;

6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

7、灾难恢复memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;

8、Redis支持数据的备份,即master-slave模式的数据备份;

6.Redis是多线程还是单线程

Redis是单线程,,因为文件事件分派其队列的消费是单线程的,所以Redis才叫单线程模型。

在一个队列中,一次性、顺序的、排他的执行一系列命令。

7.一个字符串类型的值能存储最大容积是多少?

Strings类型:一个String类型的value最大可以存储512M

Lists类型:list的元素个数最多为2^32-1个,也就是4294967295个。

Sets类型:元素个数最多为2^32-1个,也就是4294967295个。

Hashes类型:键值对个数最多为2^32-1个,也就是4294967295个。

Sorted sets类型:跟Sets类型相似。

8.Redis的持久化机制是什么?各自的优缺点?

1)RDB(Redis DataBase)持久化方式: 是指用数据集快照的方式(半持久化模式)记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

优点:

1.只有一个文件dump.rdb,方便持久化。

2.容灾性好,一个文件可以保存到安全的磁盘。

3.性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。(使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能) 4.相对于数据集大时,比AOF的启动效率更高。

缺点:

1.数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。

2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。

2)AOF(Append-only file)持久化方式: 是指所有的命令行记录以redis命令请求协议的格式(完全持久化存储)保存为aof文件。

优点:

1.数据安全,aof持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录到aof文件中一次。

2.通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题。

3.AOF机制的rewrite模式。(AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall))

缺点:

1.AOF文件比RDB文件大,且恢复速度慢。

2.数据集大的时候,比rdb启动效率低。

9.Redis常见的性能问题和解决方案?

  1. Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;AOF文件过大会影响Master重启的恢复速度)

  2. 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

  3. 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

  4. 尽量避免在压力很大的主库上增加从库

  5. 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…;这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

10.Redis的回收策略< 淘汰策略 >?

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  6. no-enviction(驱逐):禁止驱逐数据

注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。

使用策略规则:

  1. 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru

  2. 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

11.为什么Redis的需要把所有数据放在内存中?

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。无论机械还是固态,其速度都远远小于内存,所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。

12.pipeline有什么好处?为什么要用pipeline?

redis客户端执行一条命令分4个过程:发送命令-〉命令排队-〉命令执行-〉返回结果

使用pipeline执行操作可以极大地方便命令的执行,不用之前一条发送,再返回结果影响效率,使用Pipeline后执行N条命令,返回N条结果,提高了效率。

13.是否使用过Redis集群,集群的原理是什么?

集群的出现是为了解决高并发的需求,传统的单体架构一般应用于业务量级别低,用户数量没有到达高并发。例如前段时间B站服务器宕机事件,如果在B站单机单柜的基础上,增加1台备用主机,即可构建基于共享存储的热备集群。这等同于Redis Sentinal机制。如果负载过高,采用多台设备同时存储数据,这是Redis Cluster。

1)、Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为

master,继续提供服务。

2)、Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。

14.Redis集群方案什么情况下会导致整个集群不可用?

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

15.Redis支持的Java客户端都有哪些?官方推荐哪个

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

Redisson:

  1. 基于Netty实现,采用非阻塞IO,性能高

  2. 支持异步请求

  3. 支持连接池

  4. 支持pipelining、LUA Scripting、Redis Sentinel、Redis Cluster

  5. 不支持事务,官方建议以LUA Scripting代替事务

  6. 支持在Redis Cluster架构下使用pipelining

  7. 支持读写分离,支持读负载均衡,在主从复制和Redis Cluster架构下都可以使用

  8. 内建Tomcat Session Manager,为Tomcat 6/7/8提供了会话共享功能
    可以与Spring Session集成,实现基于Redis的会话共享

  9. 文档较丰富,有中文文档

项目中对Redis的使用非常频繁,这是我的Redis配置

//yml文件
redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    pool:
      max-active: 8
      max-wait: -1
      max-idle: 8
      min-idle: 0
      timeout: 0

<!--  redis -->
 	<dependency>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-data-redis</artifactId>

 	</dependency>
 	<!--  开启缓存cache -->
 	<dependency>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-cache</artifactId>
 	</dependency>
 </dependencies>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值