客户端程序设计准则

最近更新时间: 2024-06-12 15:06:00

避免db重用

避免多个应用使用同一个 Redis 实例。

  • 原因:Key淘汰规则的存在,多个应用的 Key会相互影响,导致缓存命中率的下降。同时,若多个应用中有部分有大量访问,也会影响其他应用的正常使用。

  • 建议:将不相干的业务进行拆分,公共数据做服务化。

使用连接池

Redis 整个访问的时间包含几个部分:网络连接时间、命令解析时间、命令实行时间。使用带有连接池的数据库,可节约网络连接时间,加快访问Redis的效率,并且可高效控制连接数量。其标准使用方式如下所示。

Jedis jedis = null;
try {
    jedis = jedisPool.getResource();
    //具体的命令
    jedis.executeCommand()
} catch (Exception e) {
    logger.error("op key {} error: " + e.getMessage(), key, e);
} finally {
    //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
    if (jedis != null)
        jedis.close();
}

其参数配置如下所示。

server:
  port: 8989 
spring:
  redis:
    database: 0
    host: 172.17.0.43
    port: 6379
    # 密码 没有则可以不填
    password: abc123QWE
    # 连接超时时间,单位毫秒
    timeout: 1000
    # 如果使用的jedis 则将lettuce改成jedis即可
    lettuce:
      pool:
        # 获取连接池中的连接,最大等待时间 ms
        max-wait: 1000ms
        # 最大活跃链接数 默认8
        max-active: 2000
        # 最大空闲连接数 默认8
        max-idle: 1000
        # 最小空闲连接数 默认0
        min-idle: 500
        time-between-eviction-runs: 3000ms
        # 设置连接池连接队列方式,false:后进后出即从队头拿连接,从队尾放连接;true:后进先出,即从队头拿连接,从头放连接,永远拿的是最热连接
        lifo: false

增加熔断功能

高并发下建议客户端/应用添加熔断功能,当下游的服务因为某种原因导致服务不可用或响应慢时,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回。当下游服务恢复后,上游服务会恢复调用。若当下游的服务不可用或响应慢时业务不断重试会引起雪崩,业务根据访问结果进行预期调整访问频率或者降级访问是业务逻辑上处理故障时的自适应措施。

配置合理密码

因为CRedis作为缓存时,一般是缓存了数据库中的数据,所以设置密码可以保障数据的安全性。密码要求:长度大于8位,同时大写字母,小写字母,数字,特殊字符中至少包含两种。具体复杂度要求如下所示。

  • 字符个数为[8,30]。

  • 至少包含小写字母、大写字母、数字和字符 ()`~!@#$%^&*-+=_|{}[]:;<>,.?/ 中的2种。

  • 不能以"/"开头。