《Redis常用的5种数据结构》

• key-string:一个key对应一个值。 最常用的,一般用于存储一个值
• key-hash:一个key对应一个Map。 存储一个对象数据的
• key-list:一个key对应一个List列表。 使用list结构实现栈和队列结构
• key-set:一个key对应一个Set集合。 交集,差集和并集的操作
• key-zset:一个key对应一个有序的Set集合。 排行榜,积分存储等操作

《Redis持久化》

  1. 官方建议RDBAOF同时开启<br />RDBRedis默认的持久化机制<br />RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传输起来很方便。

AOF持久化机制默认是关闭的,
AOF持久化的速度,相对RDB较慢的,存储的是一个文本文件,到了后期文件会比较大,传输困难。
Redis官方推荐同时开启RDB和AOF持久化,更安全,避免数据丢失。

《Redis事务》

Redis的事务:一次事务操作,改成功的成功,该失败的失败。
先开启事务,执行一些列的命令,但是命令不会立即执行,会被放在一个队列中,如果你执行事务,那么这个队列中的命令全部执行,如果取消了事务,一个队列中的命令全部作废。

Redis的事务向发挥功能,需要配置watch监听机制
在开启事务之前,先通过watch命令去监听一个或多个key,在开启事务之后,如果有其他客户端修改了我监听的key,事务会自动取消。
如果执行了事务,或者取消了事务,watch监听自动消除,一般不需要手动执行unwatch

《Redis集群策略》

Redis包含三种集群策略

主从复制:

主从复制
在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。其中主从复制有如下特点:

主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
从数据库一般都是只读的,并且接收主数据库同步过来的数据
一个master可以拥有多个slave,但是一个slave只能对应一个master。

哨兵:

监控主从数据库是否正常运行
master出现故障时,自动将slave转化为master
自动故障迁移:当一个主服务器出现故障时,哨兵会开始一次自动故障迁移操作。
多哨兵配置的时候,哨兵之间也会自动监控
多个哨兵可以监控同一个redis。

集群:

使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。

Redis集群

是一个提供在多个Redis间节点间共享数据的程序集
Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。
Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

2.1、Redis集群的优势

自动分割数据到不同的节点上
整个集群的部分节点失败或者不可达的情况下能够继续处理命令

2.2、Redis集群的实现方法

有客户端分片
代理分片
服务器端分片

2.3、Redis-Cluster数据分片

Redis集群没有使用一致性hash,而是引入了 哈希槽概念

Redis集群有16384个哈希槽

每个key通过CRC16校验后对16384取模来决定放置槽

集群的每个节点负责一部分哈希槽

Redis集群(cluster模式)搭建(三主三从)

上一篇搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用。仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理策略,但也有极限,于是需要搭建redis集群,将数据分别存储到不同的redis上,并且可以横向扩展。
本节搭建三主三从,即三组一主一从。组内是主从关系,可以实现高可用;组间是集群关系,实现分工存储。[

](https://blog.csdn.net/m0_46563938/article/details/109510766)
开始搭建(2、3步所有redis节点都要做)
1、准备6台redis,都配置上 masterauth (不清楚的可参考我的另一篇博客《Redis主从、哨兵》)
2、修改核心配置 vim /usr/local/redis/redis.conf
3、删除工作空间中rdb和aof文件
4、分别启动6台redis
5、创建集群,在任一节点上执行以下命令,执行完会出现日志,6台的主从关系都会显示。
6、检查
7、可自行测试其中一台或几台挂掉是否依然可用。
至此,在保证了高可用的同时,也扩展了容量。

《Redis的过期策略》

key的生存时间到了,Redis会立即删除吗?不会立即删除。
有两种策略:
- 定期删除:Redis每隔一段时间就去会去查看Redis设置了过期时间的key,会再100毫秒的间隔中默认查看3个key。
- 惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,过期直接删除当前key,并且给用户返回一个空值。

《Redis的淘汰机制》

在Redis内存已经满的时候,添加了一个新的数据,执行淘汰机制。六种
volatile-lru:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少使用的key。
allkeys-lru:在内存不足时,Redis会再全部的key中干掉一个最近最少使用的key。
volatile-lfu:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少频次使用的key。
allkeys-lfu:在内存不足时,Redis会再全部的key中干掉一个最近最少频次使用的key。
volatile-random:在内存不足时,Redis会再设置过了生存时间的key中随机干掉一个。
allkeys-random:在内存不足时,Redis会再全部的key中随机干掉一个。

《穿透》

在查询条件时,redis中没有这条数据,数据库也没有这条数据,大量访问造成数据库和redis同时宕机。

  1. 解决<br />获取客户端ip,限制客户端ip的访问

《击穿》

在缓存中的热点数据,如果在到期的时候,大量的访问请求到数据库上,造成的数据库宕机

  1. 解决<br />在访问缓存中没有的数据的时候,添加一个锁,只让少量的请求访问到数据库中,达到避免数据库宕机的问题。

《雪崩》

在某一个时间,突然大量的redis缓存同时的到期,导致大量的数据访问数据库,造成的数据库宕机

  1. 解决<br />在设置缓存过期时间的时候,给过期时间加一个适当的随机数,来避免大量缓存同时过期的情况。

《倾斜》

热点数据放在了一个reids节点上,导致redis节点无法承受大量的请求,导致的redis宕机。

  1. 解决

可以在tomcat中做JVM缓存,在查询这个redis之前,前去查询Tomcat中的缓存。