Redis 作为基于内存的 Key-Value 数据库,用来作缓存服务器性价比至关高。php
官方推出的面向 Java 的 Client Jedis,提供了不少接口和方法,可让 Java 操做使用 Redis。java
Spring 团队对 Jedis 进行了封装,独立为 spring-data-redis 项目,配合 spring 特性并集成 Jedis 的一些命令和方法。redis
本文重点描述集成过程,能让你迅速的经过 spring-data-redis 将 redis 集成到 spring 项目中,毕竟你们都忙的。spring
<!--redis 缓存--> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.4.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <description>redis 相关类 Spring 托管</description> <!--载入 redis 配置文件--> <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/> <!-- 配置 JedisPoolConfig 实例 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}"/> <property name="maxTotal" value="${redis.maxActive}"/> <property name="maxWaitMillis" value="${redis.maxWait}"/> <property name="testOnBorrow" value="${redis.testOnBorrow}"/> </bean> <!-- 配置JedisConnectionFactory --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"/> <property name="port" value="${redis.port}"/> <property name="password" value="${redis.pass}"/> <property name="database" value="${redis.dbIndex}"/> <property name="poolConfig" ref="poolConfig"/> </bean> <!-- 配置RedisTemplate --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory"/> </bean> <!-- 配置RedisCacheManager --> <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg name="redisOperations" ref="redisTemplate"/> <property name="defaultExpiration" value="${redis.expiration}"/> </bean> <!-- 配置RedisCacheConfig --> <bean id="redisCacheConfig" class="com.rambo.sdh.common.util.RedisCacheConfig"> <constructor-arg ref="jedisConnectionFactory"/> <constructor-arg ref="redisTemplate"/> <constructor-arg ref="redisCacheManager"/> </bean> </beans>
JedisConnectionFactory 为 Jedis 链接工厂,配置由单独抽象的 JedisPoolConfig 提供。数据库
若是你熟悉 Spring 的 JdbcTemplate 对象的话,这里大概能猜出来 RedisTemplate 的做用,RedisTemplate 对 RedisConnection 进行了封装。缓存
提供链接管理,序列化等功能,它对 Redis 的交互进行了更高层次的抽象,极大的方便和简化了 Redis 的操做。性能优化
RedisCacheManager 作为 redis 统一的调度和管理者,有兴趣能够反编译源码看看。bash
继承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 并实现 org.springframework.cache.CacheManager。服务器
#============================# #==== Redis settings ====# #============================# #redis 服务器 IP redis.host=127.0.0.1 #redis 服务器端口 redis.port=6379 #redis 密码 redis.pass=redis#2017 #redis 支持16个数据库(至关于不一样用户)可使不一样的应用程序数据彼此分开同时又存储在相同的实例上 redis.dbIndex=0 #redis 缓存数据过时时间单位秒 redis.expiration=3000 #控制一个 pool 最多有多少个状态为 idle 的jedis实例 redis.maxIdle=300 #控制一个 pool 可分配多少个jedis实例 redis.maxActive=600 #当borrow一个jedis实例时,最大的等待时间,若是超过等待时间,则直接抛出JedisConnectionException; redis.maxWait=1000 #在borrow一个jedis实例时,是否提早进行alidate操做;若是为true,则获得的jedis实例均是可用的; redis.testOnBorrow=true
固然配置文件你也能够硬编码到程序中,只是在参数发生改变的时候比较痛苦一点而已。架构
其中大部分配置项都是围绕着 jedisPool ,若是你对数据库链接池比较熟,你会发现它俩的配置项有点类似。
当系统 redis 遇到问题出现故障时,理解这里的选项是个不错的选择。
@Configuration @EnableCaching public class RedisCacheConfig extends CachingConfigurerSupport { protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class); private volatile JedisConnectionFactory mJedisConnectionFactory; private volatile RedisTemplate<String, String> mRedisTemplate; private volatile RedisCacheManager mRedisCacheManager; public RedisCacheConfig() { super(); } public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String, String> mRedisTemplate, RedisCacheManager mRedisCacheManager) { super(); this.mJedisConnectionFactory = mJedisConnectionFactory; this.mRedisTemplate = mRedisTemplate; this.mRedisCacheManager = mRedisCacheManager; } public JedisConnectionFactory redisConnectionFactory() { return mJedisConnectionFactory; } public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { return mRedisTemplate; } public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) { return mRedisCacheManager; } @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) { StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append(method.getName()); for (Object obj : objects) { sb.append(obj.toString()); } return sb.toString(); } }; } }
该配置类继承自 org.springframework.cache.annotation.CachingConfigurerSupport 并实现 org.springframework.cache.annotation.CachingConfigurer 的方法。
通俗一点,该类告诉 spring 当前使用的缓存服务为 redis 并自定义了缓存 key 生成的规则。
缓存通常使用在服务层,在你想缓存的方法上面添加相应的注解便可,下面三个缓存的注解你得掌握。
在业务规则比较复杂的状况下,缓存 key 的设计至关重要,设计出色可使你的应用飞起来。
整个集成工做就结束了,是否是很简单,上述算是 redis 的冰山一角,还有不少像 redis 路由/分布式/集群….,有机会实践慢慢体会。
这里推荐一下个人JAVA架构学习交流群:614478470 点击加入,想要学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频都有整理,送给每一位JAVA小伙伴,有想学习JAVA架构的,或是转行,还有工做中想提高本身能力的,正在学习的小伙伴欢迎加入学习。