String,Map,List,Set,Zset Redis的工作线程始终只有一个(单线程)
分布式锁为了解决无效请求和重复请求发送到数据库。这种锁是排他锁。
缓存穿透:数据库中没有当前数据,Redis中当没有该数据(在Redis库中查不到对应的key) 解决方案:在Redis中添加key,设置value为空设置该缓存的时间短点。
缓存击穿:热点key过期,或当前有大量的请求访问Redis中没有的key。缓存击穿热点key的本质就是瞬时大量重复请求访问。 解决方案:因为无法判断某个时刻瞬时的请求中查询的热点key,所有需要对重复请求使用分布式锁解决。
缓存雪崩:大量热点key同时过期或者Redis宕机,导致大量请求直接访问数据库。 解决方案:设置key的清除时间为随机时间,或者使用互斥锁。
1.定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期数据,对内存友好,但是会占用大量的CPU资源去处理过期数据,从而影响Redis的执行响应时间。 2.惰性过期:请求时会判断key是否过期,过期则删除。该策略最大化地节省CPU资源,对内存不友好,导致大量Key没有再次被访问,占用大量内存。 3.定期过期:每隔一定的时间,会扫描数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
内存空间不足时会触发淘汰机制: 1.noeviction 策略 : 当 Redis 缓存达到了 maxmemory 配置的值后,再有写入请求到来时,redis 将不再提供写入服务,直接响应错误 2.volatile-ttl 策略 : 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除 3.volatile-random 策略 : 在设置了过期时间的键值对中,进行随机删除 4.volatile-lru 策略 :使用 LRU 算法筛选设置了过期时间的键值对 5.volatile-lfu 策略 : 使用 LFU 算法选择设置了过期时间的键值对 6.allkeys-random 策略,从所有键值对中随机选择并删除数据; 7.allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。 8.allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。
1.RDB:以二进制形式保存数据。 优点: 将某个时间点redis内的所有数据保存下来,当大量数据需要恢复时速度快。 由于RDB操作是由FROK子进程进行操作,对其他给客户端提供读写服务的影响会非常小。 缺点: 大概率会丢失较长时间的数据。 同步时可能会影响redis的工作。 2.AOF:redis每次执行一个命令,都会将这个命令原本的语句记录到.aod文件当中,然后通过fsync策略,将命令执行后的数据持久化到磁盘中(不包含读命令)。 优点: 可以更好的保护数据的不丢失,一般AOF会每隔1秒,通过后台的线程去执行fsync操作,如果redis进程挂掉,最多丢失1秒的数据。 AOF是将命令直接追加在文件末尾,写入性能非常高,适合做灾难性误删除操作。 缺点: AOF文件相比RDB文件比较大。 AOF每次命令都会写入,相比RDB定时同步数据消耗性能更多。 AOF数据恢复比较慢。
1.哨兵模式:哨兵是Redis集群中非常重要的组件,主要有以下功能。
集群监控:负责监控redis master和slave进程是否正常工作。
消息通知:如果redis实例有故障,那么哨兵就会发送消息作为报警信息通知给管理员。
故障转移:如果master节点宕机,会自动将slave节点切换成master节点。
配置中心:如果发生故障转移,就会将新的master节点通知给客户端。
2.Redis Cluster是一种服务端Sharding技术,采用slot(槽)的概念,一共分为16384个槽,将请求发送到任意节点,接收请求的节点会将请求发送到正确的节点上执行。
通过哈希的方式,将数据分片,对保存数据的key进行取模,每个节点均分存储一定的数据。
每份数据分片会存储在互为主从的多节点上。
数据先写入到主节点,在同步到从节点。
同一分片多个节点间的数据不保持强一致性(不保证主从已完成全部数据的同步)。
读取数据时,当前节点会自动将请求转发到正确的节点上。
全量复制:主节点进行RDB持久化(生成RDB文件),该过程会消耗大量的cpu。主节点通过网络将RDB文件发送给从节点,从节点清空原有数据,将RDB数据进行导入。
增量复制:主从节点中都会维护一个偏移量,用于标记需要复制的开始位置(以主节点的偏移量为准)。主节点内部有一个先进先出的队列的缓冲区,将缓冲区的数据复制到从节点。
Consistency(一致性):所有节点在同一时间的数据完全保持一致。 Availability(可用性):保证服务的可用状态,不出现用户操作失败或者访问超时等情况。 Partition Tolerance(分区容错性):发生网络分区时,需要继续服务,也必须保证数据的一致性。
Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。 基本可用:响应时间上有时延,系统非核心功能在访问量大的时候可能不可用。 软状态:数据同步允许一定的延迟。 最终一致性:系统中的所有数据副本,在经过一段时间的同步后,最终能够达到数据一致性的状态。
算法 1、轮询法:请求按顺序分配到后台服务器。 2、随机法:按照随机算法,根据服务器列表大小值来随机选取服务器。 3、源地址哈希法:通过根据客户端的ip地址,通过哈希函数计算得到的一个数值,用该数值取模运算,得到访问服务器的序号。 4、加权轮询法:对不同的服务器机器配置分配不同的权重,增加配置高的服务器处理请求的几率。 5、最小连接数:将请求分配到连接少的服务器上。 类型 DNS方式实现负载均衡:DNS用于域名解析,DNS可以指定访问的ip 软件负载均衡:Nginx:在应用进行负载均衡。七层负载均衡,支持HTTP、E-mail,同时支持4层负载均衡。
使用SETNX实现: 语法:setnx key value 当key不存在时,将key的值设为value,并返回1 若key存在,则SETNX不做任何操作,并返回0 本质是:利用setnx针对key是否存在会进行判断,如果key已经存在,则其他请求执行SETNX则会返回0,在业务方法中对返回值进行判断,如果返回0,则无法操作该记录。当处理redis完成后删除设置的key就可以了。
Redisson为第三方java项目。Redisson对比Redis实现的分布式锁,会在底层开启一个后台线程,该线程用于定时检测锁是否还存在。