Redis知识点

一、Redis 是什么

Redis 是完全开源免费的,运行在内存中的数据结构服务器。Redis使用的是单进程(除持久化时候)。

二、Redis数据类型

String(字符串):
最常规的set/get操作,value可以是字符串或者数字。

List(列表):
可以做简单的消息队列功能。

Hash(哈希):
存储结构化的对象信息。

set(集合):
存放不重复value的数据。

Sorted Set(有序集合):
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N
操作。

三、Redis为什么块

  1. 纯内存操作
  2. 单线程,避免上下文切换
  3. 采用非阻塞多路复用IO

四、Redis缓存删除策略

1、定时删除:为每个键设置一个定时器,一旦时间到了,将键删除。

2、惰性删除:每次获取键的时候判断键是否过期,然后再删除。

3、定期扫描:系统每隔一段时间就扫描一次,发现过期的键就删除。

Redis中是2和3 的综合使用,不过redis的定期扫描只会扫描加上过期时间的键。

策略说明
volatile-lru根据lru对设置过期时间的键进行删除,如果没有可删除的内存不够时报异常
allkeys-lru根据lru对所有键进行删除,如果没有可删除的内存不够时报异常
volatile-lfu根据lfu对设置过期时间的键进行删除,如果没有可删除的内存不够时报异常
allkeys-lfu根据lfu对所有键进行删除,如果没有可删除的内存不够时报异常
volatile-random对设置过期时间的进行随机删除
allkeys-random对所有进行随机删除
volatile-ttl对将要过期的删除
noeviction直接报异常。默认策略

lru: 最久没有使用的 lfu: 最近最少使用的

五、Redis 常见性能问题和解决方案

  1. Master最好不要做任何持久化操作(RDB内存快照,AOF写日志文件)
  2. 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
  3. 为了主从复制速度和稳定性,Master和Slave最好在同一局域网内。
  4. 尽量避免压力很大的主库上增加从库。
  5. 主从复制不要图状结构,用单链表更稳定,即 Master -> Slave1 -> Slave2 -> Slave3…
    这样结构方便解决单点故障问题,实现Slave对Master替换。如果Master挂了,可以立刻启用Slave1做Master。

六、Redis持久化机制,以及优缺点

Redis提供了两种持久化机制 RDB 和 AOF:
1、RDB方式:用数据集快照方式记录redis所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件。这也是redis默认持久化方式。
优点
1、只有一个dump.rdb,方便持久化
2、性能好,fork子进程来完成写操作,主进程继续处理命令,所以IO是最大化。
3、数据集大时候,比AOF效率高。
缺点
1、数据安全性低,会丢失数据。RDB是间隔一段时间持久化,如果持久化时候发生故障,数据会丢失。

2、AOF方式:把写操作指令,持续的写到一个类似日志文件里。数据恢复时候,按照顺序再执行一遍日志里面的指令实现数据恢复。
优点:数据安全,最多丢失1秒的数据。
缺点:文件大,恢复慢,效率比RDB低。

7、Redis同步机制

Redis可以主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

8、Redis为什么把所有数据放到内存中。

Redis为了达到最快的读写速度,将数据都读到内存,并通过异步方式将数据写入磁盘。所以redis具有快速和数据持久的特征。如果不将数据放到内存中,磁盘IO速度严重影响redis性能。在内存越来越便宜的今天,redis将会越来越受欢迎。

9、Redis的哨兵模式(Sentinal)和集群(Cluster)

1、Sentinal 着重于高可用,在master宕机时会自动将Slave提升为Master,继续提供服务。
2、Cluster 着重于扩展性,单个Redis内存不足时,使用Cluster进行分片存储。

10、redis事务

事务相关命令: MULTI、EXEC、DISCARD、WATCH
1、MULTI:用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中命令才会执行。
2、EXEC:执行所有事务内的命令。命令按顺序执行,如果被打断,返回空值nil.
3、DISCARD: 放弃执行事务,并且退出事务状态。
4、WATCH :提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。

特点
1、redis事务失败时候不支持回滚。
2、事务中如果某个命令出现错误,那么所有的命令都不会执行。
3、事务中如果出现运行错误,那么正确的命令会被执行。

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

如果有a、b、c三个节点的集群,在没有复制的情况下,如果节点a失败了,那么整个集群就会缺少a这个片段范围的槽不可用。

12、Redis的String最大多大?

512M

13、Redis哈希槽是啥

Redis 集群没有使用一致性hash,而是引入hash槽概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放在哪个槽,集群的每个几点负责一部分Hash槽。

14、Redis集群的主从复制

为了使集群在部分节点无法通信情况下集群仍然可用,所以集群会使用主从复制模型,每个几点都会有1-n个从节点。

15、Redis集群最大节点数是多少?

16384个

16、Redis的连通性是怎么测试的?

ping的方式

17、Redis集群会有写操作丢失吗?

Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
例如:key过期;内存不足时触发过期策略清除key,;网络不稳定导致主从切换,切换期间数据丢失。

18、缓存雪崩,缓存穿透,缓存击穿,缓存预热

1、缓存雪崩:

同一时刻出现大规模key过期失效,导致请求全都访问数据库,给数据库CPU和内存造成很大压力,严重的造成数据库宕机。导致服务不可用。

解决方案
缓存设计时候,尽量缓存过期时间分散开,避免同一时刻大量缓存过期失效。
应用设计时候,考虑加锁或者队列的方式避免会有大量请求落在底层系统上。

缓存穿透

查询缓存和数据库都没有的数据,导致查询直接落到数据上。

解决方案
1、简单粗暴的就是查询返回为空的数据也加入缓存,但是key的过期时间要设置短一些,不要超过五分钟。
2、使用布隆过滤器,将所有可能存在的数据hash到一个足够大的bitmap中,一个一定不存在的key 会被拦截掉。

布隆过滤器:

  1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数
  2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
  3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
  4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为可能在集合中。如果不都是1 那么可定不在集合中。

缓存击穿

热点key失效,导致大量请求怼到数据上,给数据库造成很大压力。

解决方案
1、热点key设置永久有效。
2、加互斥锁,一个请求过来后加锁并把数据加入到缓存,其他请求进来时候发现有锁了,则直接返回。等第一个请求执行完成后,缓存中就有数据了。其他请求直接就会读取缓存。

缓存预热

系统上线后,将相应的要缓存的数据加入缓存,这样避免请求上来就查询数据库。

解决方案

1、直接写个缓存页面,上线时手动操作。
2、数据量不大的,项目启动时候自动加载。
3、定时刷新缓存。

19、用作分布式锁

利用setnx命令,如果key已存在则不做任何操作(相当于加锁)。然后再用expire加上过期时间(防止忘记释放锁,导致死锁)。但是如果执行setnx后服务宕机了,没有加上过期时间,还是会导致死锁。
用set命令把setnx和expire合成一条命令。

set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds: 为键设置秒级过期时间。
px milliseconds: 为键设置毫秒级过期时间。
nx: 键必须不存在, 才可以设置成功, 用于添加。
xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。

20、怎么批量查找某些固定开头的key?

使用keys命令

keys *key*
keys *

有3个通配符 *, ? ,[]
*: 通配任意多个字符
?: 通配单个字符
[]: 通配括号内的某1个字符

但是这个命令有个问题就是 keys 会一次性遍历整个数据库来获取匹配的 key,另外Redis是单线程,会导致线程被阻塞,服务会停一段时间。这是很不好的。这时候redis给我们提供了一个 scan 命令(2.8.0以后的版本),这个命令以渐进的方式,分多次遍历整个数据库,并返回匹配的key,但是这个key会有可能重复,所以我们代码要做一下去重的操作。
在这里插入图片描述

KEYSSCAN
处理方式一次 遍历整个数据库并返回结果每次只遍历部分键,并返回一部分结果
是否阻塞服务器可能会不会
是否出现重复值不会可能会
复杂度O(N)每次执行复杂度为O(1), 遍历整个数据库复杂度为O(N)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值