redis常见数据结构?

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set(无序)
  • 有序集合 sorted set / zset(有序)

    redis在项目中的使用场景?

    redis的key 的数据结构是如何选型的
    redis的key的规范是如何设计的
    具体业务是怎么样的
    如何使用redis解决的业务

    redis具体如何使用?

    第一步:引入依赖
    第二步:配置application.yml(配置redis地址,端口号,密码,redis连接池等)
    第三步:提供配置类(配置key的序列化器)
    第四步:测试
    1. redisTemplate.opsForValue().get();
    2. redisTemplate.opsForValue().set();
    redisTemplate.opsForHash() ForList() ForSet()

    redis的事务机制的介绍?

    开启事务:multi
    命令: set name zhangsan
    执行事务: exec

Redis是支持事务的
但是Redis对于命令执行错误处理,有两种解决方式:

  • 语法错误(编译)

当出现语法错误时,执行exec后,会直接返回错误,正确的命令也不会执行。

  • 执行错误(运行)

语法本身是没有问题的,所以运行之前redis无法发现错误,但是在执行时出现了错误,因此只会错误的命令不执行, 而正确的命令仍然能够正常执行。

redis的持久化机制?

edis将数据保存在内存中。一旦服务器宕机重启,内存中的数据就会丢失。
Redis提供了两种持久化机制:RDBAOF
RDB(Redis DataBase)是Redis默认存储方式。其基于快照思想,当符合一定条件(手动或自动触发)时,Redis会将这一刻的内存数据进行快照并保存在磁盘上,产生一个经过压缩的二进制文件,文件后缀名.rdb。
因为RDB文件是保存在磁盘上的,因此即使Redis进程退出,甚至服务器宕机重启。只要RDB文件存在,就可以利用它来还原Redis数据。
RDB触发条件:

save ""  # 不使用RDB存储  不能主从

# 记忆
save 3600 1     #表示1小时内至少1个键被更改则进行快照。
save 300 100    #表示5分钟(300秒)内至少100个键被更改则进行快照。
save 60 10000  #表示1分钟内至少10000个键被更改则进行快照。

优点:

  • 基于二进制文件完成数据备份,占用空间少,便于文件传输。
  • 能够自定义规则,根据Redis繁忙状态进行数据备份。

缺点:

  • 无法保证数据完整性,会丢失最后一次快照后的所有数据。
  • bgsave执行每次执行都会阻塞Redis服务进程创建子线程,频繁执行影响系统吞吐率。

AOF
RDB方式会出现数据丢失的问题,对于这个问题,可以通过Redis中另外一种持久化方式解决:AOF
AOF(append only file)是Redis提供了另外一种持久化机制。与RDB记录数据不同,当开启AOF持久化后,Redis会将客户端发送的所有更改数据的命令,记录到磁盘中的AOF文件。 这样的话,当Redis重启后,通过读取AOF文件,按顺序获取到记录的数据修改命令,即可完成数据恢复。
AOF的触发方式有三种:alwayseverysecno。 默认使用everysec。可以通过redis.conf中appendfsync属性进行配置。
将AOF文件同步到磁盘的策略依据就是redis.conf文件中appendfsync属性值:alwayseverysecno

  • always:每次执行写入命令都会将aof_buf缓冲区文件全部内容写入到AOF文件中,并将AOF文件同步到磁盘。该方式效率最低,安全性最高。
  • everysec:每次执行写入命令都会将aof_buf缓冲区文件全部内容写入到AOF文件中。 并且每隔一秒会由子线程将AOF文件同步到磁盘。该方式兼备了效率与安全,即使出现宕机重启,也只会丢失不超过两秒的数据。
  • no:每次执行写入命令都会将aof_buf缓冲区文件全部内容写入到AOF文件中,但并不对AOF文件进行同步磁盘。 同步操作交由操作系统完成(每30秒一次),该方式最快,但最不安全。

    AOF重写优化

    为了解决AOF文件巨大的问题,Redis提供了AOF文件重写功能。 当AOF文件体积超过阈值时,则会触发AOF文件重写,Redis会开启子线程创建一个新的AOF文件替代现有AOF文件。 新的AOF文件不会包含任何浪费空间的冗余命令,只存在恢复当前Redis状态的最小命令集合。

    RDB和AOF持久化的区别?

    RDB与AOF对比
  1. RDB默认开启,AOF需手动开启。
  2. RDB性能优于AOF。
  3. AOF安全性优于RDB。
  4. AOF优先级高于RDB。
  5. RDB存储某个时刻的数据快照,AOF存储命令。
  6. RDB在配置触发状态会丢失最后一次快照以后更改的所有数据,AOF默认使用everysec,每秒保存一次,最多丢失两秒以内的数据。

    redis高可用(集群策略)?

    ```markdown 1.主从复制: 主从复制的作用:

读写分离:主写从读,提高服务器的读写负载能力

负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量

故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复

数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式

高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案 2.哨兵模式: 这就要提到哨兵机制了。在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机

制,它有效地解决了主从复制模式下故障转移的这三个问题。 哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master 注意:

哨兵也是一台redis服务器,只是不提供数据服务

通常哨兵配置数量为单数

如果配置启用单节点哨兵,如果有哨兵实例在运行时发生了故障,主从库无法正常

切换啦,所以我们需要搭建 哨兵集群 3.分片集群 分片解决了什么问题:

海量数据存储

高可用

高可扩

高可用架构总结

主从模式:读写分离,负载均衡,一个Master可以有多个Slaves

哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器

分片集群: 为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,提高并发量。 ```

redis key的过期淘汰策略?

定时删除:它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。
惰性删除:它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。
定期删除:定期删除,顾名思义,就是每隔一段时间进行一次删除。

redis 内存淘汰策略?

image.png
image.png
当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略。
如果redis内存满了怎么办?
内存淘汰策略

redis缓存穿透的问题?

redis缓存击穿的问题?

redis缓存雪崩的问题?

redis实现分布式锁的原理?

如果redis内存满了怎么办?
内存淘汰策略