1 导言
我们常常需要在项目里做一些数据的缓存、比如存储较为静态化的数据或设计二级缓存以便来减少API接口QPS过大对服务端的压力、避免对后台数据库造成冲击甚至压垮。除了本地缓存像spring cache和guava cache外,Redis是简单的KV分布式数据库,很好的解决了单机的Java锁不能解决的问题,所以很受青睐。但怎样使用才能发挥最大效果呢?很多时候开发人员只是会用简单的增删改查操作、只了解CacheManager,遇到生产环境异常或集群故障就难以排查了。所以,对Redis和本地缓存原理的理解就非常重要,日常工作可能都偏重于使用,缺乏分析原理性。因此,考虑写这个篇章分享经验所得,期望能给到大家参考。
官方文档redis中文官方网站还是首要推荐大家去学习,只有理解了原理,才能融会贯通来设计业务和系统架构方案、用到多种场景下,发挥好多级缓存的作用。在设计时多花点心思,可以避免上线生产环境后出现很多坑。
由于Redis客户端组件有很多种包已经实现、各有优势,这里主要对多种Redis配置异同简单归纳整理出来。另外,很多开发同学对Spring本地Cache的机制不是很清晰,这里也做下源码分析,以便更好的使用spring-data和分析故障。
2 总览&目录
3 Redis多种Client配置异同
3.1 原生redis client或jedis配置
依赖主要是redis或jedis原生包。
包括redis连接(单机版本Host和Port、集群版本cluster.nodes)、常用增强配置项。
##redis数据库的相关配置
##连接地址ip
redis.addr = ip
##端口号
redis.port = 6379
##访问密码
redis.auth = 密码
##控制一个pool最多可以有多少个状态为Idle(空)的jedis实例默认值为8
redis.maxIdle = 200
##可用的最大连接实例数 默认为8
redis.maxActive = 1024
##等待可用连接的最大时间单位为毫秒 默认为-1表示永不超时,一旦超过等待时间则直接抛出
redis.maxWait = 10000
redis.timeOut = 10000
##设置为true则会在borrow一个jedis实例时,提前做validate操作
redis.testOnBorrow =true
##连接最小空闲时间(毫秒)
redis.minEvictableIdleTimeMillis=1800000
##释放连接的扫描间隔(毫秒)
redis.timeBetweenEvictionRunsMillis=30000
##每次释放连接的最大数目
redis.numTestsPerEvictionRun=1024
##最大连接数
redis.maxTotal=30
##在空闲时检查有效性, 默认false
redis.testWhileIdle=true
##连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
redis.blockWhenExhausted=false
3.2 spring框架下的redis或lettuce使用
依赖主要是spring-boot-starter-data-redis包或spring-data-redis包。
包括:连接(单机版本Host和Port、集群版本cluster.nodes)、常用增强配置项。
不同的是,前缀必须是spring.redis,lettuce可选但性能较高些、是springboot官方推荐的。
spring:
redis:
#数据库索引
database: ${REDIS_DB:0}
#host: ${REDIS_HOST:10.251.76.39} #redis单机情况
#port: ${REDIS_PORT:7001}
password: ${REDIS_PWD:mypassword}
cluster: #redis集群情况
nodes: 10.251.76.39:7001,10.251.76.21:7002,10.251.76.22:7003
#连接超时时间
timeout: 5000
lettuce:
pool:
max-idle: 1000
min-idle: 50
max-active: 2000
max-wait: 4000
好了,配置就简单列到这里,下一讲谈谈基于Redis的分布式锁 多级缓存分析篇(二) 分布式锁应用分析,欢迎来交流留言~~