åè¨
redisæ¯ä¸ç§nosqlæ°æ®åºï¼ä»¥<keyï¼value>çå½¢å¼å卿°æ®ï¼å ¶éåº¦ç¸æ¯äºMySQLä¹ç±»çæ°æ®åºï¼ç¸å½äºå å读åä¸ç¡¬ç读åçå·®å«ï¼æä»¥å¸¸å¸¸ç¨ä½ç¼åãæ¥ä¸æ¥å°±åå«ççå¨springboot项ç®ä¸å¦ä½ä½¿ç¨redis
æ¬ç¯åºäºSpringBoot + Rediså®ç°æ°æ®ç¼å以åååºåå¨ï¼é¦å æä»¬è¦ç¥éï¼SpringBootæ´åRedisæä¸¤ç§æ¹å¼ï¼å嫿¯JedisåRedisTemplateï¼è¿ä¸¤è æä½åºå«ï¼
Jedisæ¯Redis宿¹æ¨èçé¢åJavaçæä½Redisç客æ·ç«¯ï¼èRedisTemplateæ¯SpringDataRedisä¸å¯¹JedisApiçé«åº¦å°è£ ãå ¶å®å¨SpringBootçå®ç½ä¸æä»¬ä¹è½çå°ï¼å®æ¹ç°å¨æ¨èçæ¯SpringDataRediså½¢å¼ï¼ç¸å¯¹äºJedisæ¥è¯´å¯ä»¥æ¹ä¾¿å°æ´æ¢RedisçJava客æ·ç«¯ï¼å ¶æ¯Jediså¤äºèªå¨ç®¡çè¿æ¥æ± çç¹æ§ï¼æ¹ä¾¿ä¸å ¶ä»Springæ¡æ¶è¿è¡æé 使ç¨å¦ï¼SpringCacheã
SpringBoot æ´åRedisï¼Jedisï¼
å ·ä½åä¸ºï¼æ·»å ä¾èµ+redisé 置信æ¯+JedisPoolå·¥å+RedisServiceï¼å å«åºååï¼
æ·»å ä¾èµ
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
<!-- ç¨æ¥åºååç -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
redisé 置信æ¯
ç»å¸¸ç¨å°çåæ°
# Redisæ°æ®åºç´¢å¼ï¼é»è®¤ä¸º0ï¼
spring.redis.database=0
# Redisæå¡å¨å°å
spring.redis.host=localhost
# Redisæå¡å¨è¿æ¥ç«¯å£
spring.redis.port=6379
# Redisæå¡å¨è¿æ¥å¯ç ï¼é»è®¤ä¸ºç©ºï¼
spring.redis.password=123456
# è¿æ¥æ± æå¤§è¿æ¥æ°ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼
spring.redis.jedis.pool.max-active=1024
# è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼
spring.redis.jedis.pool.max-wait=10000
# è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥
spring.redis.jedis.pool.max-idle=200
# è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥
spring.redis.jedis.pool.min-idle=0
# è¿æ¥è¶
æ¶æ¶é´ï¼æ¯«ç§ï¼
spring.redis.timeout=10000
è¿ä¸ªå䏿坹åº
redis.host=localhost
redis.port=6379
#è¿æ¥è¶
æ¶æ¶é´
redis.timeout=3
redis.password=123456
#è¿æ¥æ± é
ç½®
#æå¤§è¿æ¥æ°
redis.poolMaxTotal=10
#æå¤§ç©ºé²è¿æ¥æ°
redis.poolMaxIdle=10
#æå¤§çå¾
è¿æ¥æ°
redis.poolMaxWait=3
å¿ é¡»è¦åçæ¯Redisæå¡å¨å°åãè¿æ¥ç«¯å£ãè¿æ¥å¯ç
@Component
@ConfigurationProperties(prefix = "redis")
public class RedisConfig {
private String host;
private int port;
private int timeout;//ç§
private String password;
private int poolMaxTotal;
private int poolMaxIdle;
private int poolMaxWait;//ç§
//å«å¿äºå get/setæ¹æ³
}
JedisPoolå·¥å
@Service
public class JedisPoolFactory {
@Autowired
RedisConfig redisConfig;
@Bean
public JedisPool JedisPoolFactory(){
System.out.println(redisConfig.toString());
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait()*1000);
JedisPool jp=new JedisPool(poolConfig,redisConfig.getHost(),redisConfig.getPort()
,redisConfig.getTimeout()*1000,redisConfig.getPassword(),0);
return jp;
}
}
å¾å°ä¸ä¸ªJedisPool çBean
RedisService
æè¿éKeyPrefix æ¯ä¸ä¸ªkeyçåç¼ï¼é²æ¢ç¸åçkeyç»äºä¸åçå«ä¹ãå¦æåªæ¯ç¨æ¥å¦ä¹ æ´åRedisçææ¯ï¼å¨è¿éå¯ä»¥å¿½ç¥KeyPrefixï¼çåçã
æåäºå¸¸ç¨çredisæä½çgetãsetãexistsãincrãdecræ¹æ³
åºååçbeanToStringåstringToBeanæ¹æ³ï¼ç¨å°çæ¯import com.alibaba.fastjson.JSON;
@Service
public class RedisService {
@Autowired
JedisPool jedisPool;
/**
* è·åå个对象
* @param prefix
* @param key
* @param clazz
* @param <T>
* @return
*/
public <T> T get(KeyPrefix prefix,String key,Class<T> clazz){
Jedis jedis =null;
try {
jedis = jedisPool.getResource();
//çæçæ£çkey
String realKey =prefix.getPrefix()+key;
String str = jedis.get(realKey);
T t=stringToBean(str,clazz);
return t;
}finally {
returnToPool(jedis);
}
}
/**
* 设置对象
* @param prefix
* @param key
* @param value
* @param <T>
* @return
*/
public <T> boolean set(KeyPrefix prefix,String key,T value){
Jedis jedis =null;
try {
jedis = jedisPool.getResource();
String str=beanToString(value);
if (str==null||str.length()<=0)
return false;
//çæçæ£çkey
String realKey =prefix.getPrefix()+key;
int seconds=prefix.expireSeconds();
if (seconds<=0){
jedis.set(realKey,str);
} else {
jedis.setex(realKey,seconds,str);
}
jedis.set(realKey, str);
return true;
}finally {
returnToPool(jedis);
}
}
/**
* 夿æ¯å¦åå¨
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> boolean exists(KeyPrefix prefix,String key){
Jedis jedis =null;
try {
jedis = jedisPool.getResource();
//çæçæ£çkey
String realKey =prefix.getPrefix()+key;
return jedis.exists(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* å¢å å¼
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> Long incr(KeyPrefix prefix,String key){
Jedis jedis =null;
try {
jedis = jedisPool.getResource();
//çæçæ£çkey
String realKey =prefix.getPrefix()+key;
return jedis.incr(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* åå°å¼
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> Long decr(KeyPrefix prefix,String key){
Jedis jedis =null;
try {
jedis = jedisPool.getResource();
//çæçæ£çkey
String realKey =prefix.getPrefix()+key;
return jedis.decr(realKey);
}finally {
returnToPool(jedis);
}
}
private <T> String beanToString(T value) {
if (value==null)
return null;
Class<?> aClass = value.getClass();
if (aClass==int.class||aClass==Integer.class){
return ""+value;
}else if (aClass==String.class){
return (String) value;
}else if (aClass==long.class||aClass==Long.class){
return ""+value;
}else {
return JSON.toJSONString(value);
}
}
private <T> T stringToBean(String str,Class<T> aClass) {
if (str==null||str.length()<=0||aClass==null)
return null;
if (aClass==int.class||aClass==Integer.class){
return (T)Integer.valueOf(str);
}else if (aClass==String.class){
return (T)str;
}else if (aClass==long.class||aClass==Long.class){
return (T)Long.valueOf(str);
}else {
return JSON.toJavaObject(JSON.parseObject(str),aClass);
}
}
private void returnToPool(Jedis jedis) {
if (jedis!=null){
jedis.close();
}
}
}
SpringBoot æ´åRedisï¼RedisTemplateï¼
å ·ä½åä¸ºï¼æ·»å ä¾èµ+redisé 置信æ¯+RedisTemplate+åºåå+RedisService
æ·»å ä¾èµ
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${redis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.redis.version}</version>
</dependency>
redisé 置信æ¯
#Matserçipå°å
redis.hostName=localhost
#端å£å·
redis.port=6379
#妿æå¯ç
redis.password=123456
#客æ·ç«¯è¶
æ¶æ¶é´å使¯æ¯«ç§ é»è®¤æ¯2000
redis.timeout=10000
#æå¤§ç©ºé²æ°
redis.maxIdle=300
#è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ°ã设为0表示æ éå¶,妿æ¯jedis 2.4以åç¨redis.maxTotal
#redis.maxActive=600
#æ§å¶ä¸ä¸ªpoolå¯åé
å¤å°ä¸ªjediså®ä¾,ç¨æ¥æ¿æ¢ä¸é¢çredis.maxActive,妿æ¯jedis 2.4以åç¨è¯¥å±æ§
redis.maxTotal=1000
#æå¤§å»ºç«è¿æ¥çå¾
æ¶é´ã妿è¶
è¿æ¤æ¶é´å°æ¥å°å¼å¸¸ã设为-1表示æ éå¶ã
redis.maxWaitMillis=1000
#è¿æ¥çæå°ç©ºé²æ¶é´ é»è®¤1800000毫ç§(30åé)
redis.minEvictableIdleTimeMillis=300000
#æ¯æ¬¡éæ¾è¿æ¥çæå¤§æ°ç®,é»è®¤3
redis.numTestsPerEvictionRun=1024
#éåºæ«æçæ¶é´é´é(毫ç§) å¦æä¸ºè´æ°,åä¸è¿è¡éåºçº¿ç¨, é»è®¤-1
redis.timeBetweenEvictionRunsMillis=30000
#æ¯å¦å¨ä»æ± ä¸ååºè¿æ¥åè¿è¡æ£éª,妿æ£éªå¤±è´¥,å仿± ä¸å»é¤è¿æ¥å¹¶å°è¯ååºå¦ä¸ä¸ª
redis.testOnBorrow=true
#å¨ç©ºé²æ¶æ£æ¥æææ§, é»è®¤false
redis.testWhileIdle=true
å¿ é¡»è¦åçæ¯Redisæå¡å¨å°åãè¿æ¥ç«¯å£ãè¿æ¥å¯ç
RedisTemplate
@Configuration
@PropertySource("classpath:redis.properties")
@Slf4j
public class RedisConfig {
@Value("${redis.hostName}")
private String hostName;
@Value("${redis.password}")
private String password;
@Value("${redis.port}")
private Integer port;
@Value("${redis.maxIdle}")
private Integer maxIdle;
@Value("${redis.timeout}")
private Integer timeout;
@Value("${redis.maxTotal}")
private Integer maxTotal;
@Value("${redis.maxWaitMillis}")
private Integer maxWaitMillis;
@Value("${redis.minEvictableIdleTimeMillis}")
private Integer minEvictableIdleTimeMillis;
@Value("${redis.numTestsPerEvictionRun}")
private Integer numTestsPerEvictionRun;
@Value("${redis.timeBetweenEvictionRunsMillis}")
private long timeBetweenEvictionRunsMillis;
@Value("${redis.testOnBorrow}")
private boolean testOnBorrow;
@Value("${redis.testWhileIdle}")
private boolean testWhileIdle;
/**
* @auther: zhangyingqi
* @date: 17:52 2018/8/28
* @param: []
* @return: org.springframework.data.redis.connection.jedis.JedisConnectionFactory
* @Description: Jedisé
ç½®
*/
@Bean
public JedisConnectionFactory JedisConnectionFactory(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration ();
redisStandaloneConfiguration.setHostName(hostName);
redisStandaloneConfiguration.setPort(port);
//ç±äºæä»¬ä½¿ç¨äºå¨æé
ç½®åº,æä»¥æ¤å¤çç¥
//redisStandaloneConfiguration.setDatabase(database);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
jedisClientConfiguration.connectTimeout(Duration.ofMillis(timeout));
JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration,
jedisClientConfiguration.build());
return factory;
}
/**
* @auther: zhangyingqi
* @date: 17:52 2018/8/28
* @param: [redisConnectionFactory]
* @return: com.springboot.demo.base.utils.RedisTemplate
* @Description: å®ä¾å RedisTemplate 对象
*/
@Bean
public RedisTemplate functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
log.info("RedisTemplateå®ä¾åæåï¼");
RedisTemplate redisTemplate = new RedisTemplate();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* @auther: zhangyingqi
* @date: 17:52 2018/8/28
* @param: []
* @return: org.springframework.data.redis.serializer.RedisSerializer
* @Description: å¼å
¥èªå®ä¹åºåå
*/
@Bean
public RedisSerializer fastJson2JsonRedisSerializer() {
return new FastJson2JsonRedisSerializer<Object>(Object.class);
}
/**
* @auther: zhangyingqi
* @date: 17:51 2018/8/28
* @param: [redisTemplate, factory]
* @return: void
* @Description: è®¾ç½®æ°æ®åå
¥ redis çåºååæ¹å¼,å¹¶å¼å¯äºå¡
*/
private void initDomainRedisTemplate(RedisTemplate redisTemplate, RedisConnectionFactory factory) {
//妿ä¸é
ç½®Serializerï¼é£ä¹åå¨çæ¶å缺ç使ç¨Stringï¼å¦æç¨Userç±»ååå¨ï¼é£ä¹ä¼æç¤ºé误User can't cast to Stringï¼
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(fastJson2JsonRedisSerializer());
// å¼å¯äºå¡
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setConnectionFactory(factory);
}
/**
* @auther: zhangyingqi
* @date: 17:51 2018/8/28
* @param: [redisTemplate]
* @return: com.springboot.demo.base.utils.RedisUtil
* @Description: 注å
¥å°è£
RedisTemplate
*/
@Bean(name = "redisUtil")
public RedisUtil redisUtil(RedisTemplate redisTemplate) {
log.info("RedisUtil注å
¥æåï¼");
RedisUtil redisUtil = new RedisUtil();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
}
å¨è¿éå°±å¾å°äºä¸ä¸ªRedisTemplateçBean
åºåå
å¼å ¥èªå®ä¹åºååï¼é²æ¢ç¹æ®æ 嵿¥é
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class<T> clazz;
public FastJson2JsonRedisSerializer(Class<T> clazz) {
super(); this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return (T) JSON.parseObject(str, clazz);
}
}
RedisService
å¨è¿éæåªç»åºsetæ¹æ³ï¼å ¶ä½çå¯ä»¥å¯¹åºååº
@Lazy
@Component
public class RedisService{
@Autowired
private RedisTemplate redisTemplate;
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public boolean set(String key,Object value,int indexdb) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
å¿«å»æ´åèªå·±çredisï¼èªå·±é ä¸ä¸ªè½®å
