避免 DB 重用
避免多个应用使用同一个 Redis 实例。
原因:Key 淘汰规则的存在,多个应用的 Key 会相互影响,导致缓存命中率的下降。同时,若多个应用中有部分存在大量访问,也会影响其他应用的正常使用。
建议:将不相干的业务进行拆分,公共数据做服务化。
使用连接池
Redis 整个访问的时间包含几个部分:网络连接时间、命令解析时间、命令实行时间。使用带有连接池的数据库,可节约网络连接时间,加快访问 Redis 的效率,并且可高效控制连接数量。连接资源池关键配置参数包括:连接池最大连接数、最大空间连接数、最小空闲连接数,这三个参数建议配置为相同的数值。具体大小,请业务侧根据实际情况进行评估。
连接池最大连接数:即控制业务并发量。当连接池中的连接数达到最大连接数时,连接池将不再创建新的连接。这有助于确保连接池不会占用过多的系统资源。
连接池最大空闲连接数:是指连接池中允许保持空闲的最大连接数。当连接池中的连接数超过最大空闲连接数时,多余的连接将被关闭并从连接池中移除,从而释放系统资源。这有助于确保连接池不会占用过多的系统资源,同时也有助于提高应用程序的性能和可伸缩性。
连接池最小空闲连接数:指连接池中必须保持的最小空闲连接数。如果连接池中的空闲连接数低于此值,连接池将创建新的连接以满足此要求。这有助于确保在高负载情况下,连接池中始终有足够的可用连接,
除了以上所描述的参数配置之外,不同语言连接池的队列连接方式采用了热连接的方式,需要对应修改代码。具体信息,请参见下表:
多语言类型 | 问题及建议 | 代码示例 |
golang go-redis 连接池 | 连接池库,建议连接用完放入队尾,而获取连接从队头拿取,避免总是获取热连接。 | 队列连接方式相关代码,如下所示:
更多信息,请参见 go-redis 连接池官网示例。v8.11.5版本及之后的版本已经修复队列的连接方式,请确认版本及代码逻辑,避免使用热连接方式。 |
golang redigo 连接池配置 | redigo 官网提供的连接池只支持从队头拿连接,从队头放回已用连接。导致最热连接一直被使用,不轮询每一个连接,无法实现负载均衡,导致 Proxy 连接或是负载总是不均衡的现象。需修改源代码中的pool.go 文件,增加 pushBack 方法和 Lifo 成员变量。 | 代码示例,如下所示:
更多信息,请参见 Redigo 连接池使用建议。 |
java_jedis_pool | 设置连接池连接队列方式。 false:后进后出即从队头拿连接,从队尾放连接。推荐使用该方式。 true:后进先出即从队头拿连接,从头放连接,永远为最热连接,默认为该方式。 指定连接池定期检查时间,避免连接可能会被长时间占用而不释放。建议配置为3000ms,表示每3秒检测一次。
time-between-eviction-runs: 3000ms | 关键代码示例,请参见 Jedis 连接池代码示例。 完整代码示例,请参见 spring-boot-jedis-demo。 |
java_lettuce_pool | 设置连接池队列方式与java_jedis_pool 一致。 请关闭连接复用,避免出现 PipeLine。 |
|
spring_boot_redisson 连接池 | 请将连接池最大连接数、最大空间连接数、最小空闲连接数,三个参数配置为相同的值。 | 队列连接方式相关代码,如下所示:
|
增加熔断功能
高并发场景,建议客户端添加熔断逻辑功能,例如:netflix、hystrix。Redis 客户端的熔断器实时检测集群节点,当某一个 Redis 节点出现异常,便不再请求有异常的 Redis 节点,从而避免单个节点的故障导致整体系统的雪崩。
配置合理密码
数据库访问密码可以保障数据的安全性。密码复杂度要求:
字符个数为[8,30]。
至少包含小写字母、大写字母、数字和字符 ()`~!@#$%^&*-+=_|{}[]:;<>,.?/ 中的2种。
不能以"/"开头。
腾讯云支持 SSL(Secure Sockets Layer)加密认证访问,具体操作,请参见 SSL 加密。