Redis集群 应用问题(下)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis集群 应用问题(下)

redis cluster 如何分配这六个节点?

一个集群至少要有三个主节点。

选项–cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。


什么是slots?


一个Redis集群包含16384个插槽(hash slot),数据库中的每个键都属于这16384个插槽的其中一个。

集群使用公式CRC16 (key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。

集群中的每个节点负责处理一部分插槽。举个例子。如果一个集群可以有主节点,其中

节点A负责处理0号至5460号插槽‘

节点B负责处理5461号至10922号插槽

节点C负责处理10923号至16383号插槽

插槽的目的:平均将数据分配到主机里面



同时加入多个值(会报错)

如何加入多个值



查询集群中的值

计算key的插槽值


计算插槽值里面有几个键



返回插槽中key值的数量



故障恢复

主机奔溃之后其后的从机来顶替,但主机故障恢复后,变为从机

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes ,那么,整个集群都挂掉

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no ,那么,该插槽数据全都不能使用,也无法存储。

redis.conf中的参数cluster-require-full-coverage。

集群的jedis开发

示例代码:

/*
* 演示redis集群操作*/
public class RedisClusterDemo {
    public static void main(String[] args) {
        //创建对象
        HostAndPort hostAndPort = new HostAndPort("192.168.80.130",6379);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        //进行操作
        jedisCluster.set("b1","value1");
        String value = jedisCluster.get("b1");
        System.out.println("value:"+value);
        jedisCluster.close();
    }
}

集群的好处

实现扩容

分摊压力

无中心配置相对简单


集群的不足

多键操作是不被支持的

多键的 Redis 事务是不被支持的。lua脚本不被支持

由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。


Redis应用问题解决

缓存穿透


1.应用服务器压力变大了

2.redis命中率降低

3.一直查询数据库
产生原因
1.redis查询不到数据库

2.出现很多非正常url
解决方案
( 1)对空值缓存∶如果一个查询返回的数据为空(不管是数据是否不存在),找们仍然把这个空结果( null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟

(2)设置可访问的名单(白名单) ∶使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的i记d进行比较,如果访问id不在 bitmaps 里面,进行拦截,不允许访问。

( 3)采用布隆过滤器∶(布隆过滤器(Bloom Filter )是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。)

将所有可能存在的数据哈希到.个足够大的 bitmaps 中,一个一定不存在的数据会被这个 bitmaps 拦截掉,从而避免了对底层存储系统的查询压力。

(4)进行实时监控:当发现Redis 的命中率开始急速降低,需要排查访回对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。


缓存击穿


1.数据库访问压力瞬间增加

2.redis里面没有出现大量key过期

3.redis正常运行
产生原因
redis某个key过期了,大量访问使用了这个key
解决方案
1.预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长

2.实时调整:现场监控哪些数据热门,实时调整key的过期时长

3.使用锁:

( 1)就是在缓存失效的时候(判断拿出来的值为空),不是立即去 load db。

(2)先使用缓存工具的某些带成功操作返回值的操作(比如Redis 的SETNX )去set—个mutex key

( 3 )当操作返回成功时,再进行 load db的操作,并回设缓存,最后删除 mutex

当操作返回失败,证明有线程在load db,当前线程睡眠一段时间再重试整个get缓存的方法。




缓存雪崩


数据库压力变大服务器崩溃

产生原因
在极少时间段,查询大量key的集中过期情况
解决方案
(1)构建多级缓存架构:nginx缓存 + redis缓存 + 其他缓存(ehcache等)

(2)使用锁或队列:用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况

(3)设置过期标志更新缓存∶

记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际key的缓存

(4)将缓存失效时间分散开:

比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
75 0
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
138 0
|
6天前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
110 1
|
3月前
|
Kubernetes NoSQL Redis
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis server
|
3月前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
508 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
|
3月前
|
NoSQL 网络协议 Shell
【Azure 应用服务】App Service 项目部署成功后,应用连接 Azure Redis时报错 Could not get a resource from the pool
【Azure 应用服务】App Service 项目部署成功后,应用连接 Azure Redis时报错 Could not get a resource from the pool
|
4月前
|
NoSQL Redis
Redis set数据类型命令使用及应用场景使用总结
Redis set数据类型命令使用及应用场景使用总结
47 1
下一篇
无影云桌面