问:为什么使用 Redis?
答:因为 高性能 和 大并发
如果在大并发的情况下,所有的请求都直接打到数据库上,那么再好的数据库也扛不住疯狂打击。
1、maven
<!--集成redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置参数
@Data
@Component
public class MSysPropertyBean {
//是否使用redis
@Value("${app.module.sys.redis.useRedis:true}")
private boolean useRedis;
//redis服务器地址
@Value("${app.module.sys.redis.hostName:127.0.0.1}")
private String redisHostName;
//redis服务器端口号
@Value("${app.module.sys.redis.port:6379}")
private int redisPort;
//redis连接密码
@Value("${app.module.sys.redis.password:123456}")
private String redisPassword;
//redis使用的数据库
@Value("${app.module.sys.redis.database:0}")
private int redisDatabase;
//redis 连接池MaxIdle
@Value("${app.module.sys.redis.maxIdle:9}")
private int redisMaxIdle;
//redis 连接池MinIdle
@Value("${app.module.sys.redis.minIdle:0}")
private int redisMinIdle;
//redis 连接池最大活跃数
@Value("${app.module.sys.redis.maxActive:8}")
private int redisMaxActive;
//redis 连接最大等待时间
@Value("${app.module.sys.redis.maxWait:-1}")
private int redisMaxWait;
}
3、配置类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfiguration {
@Autowired
private MSysPropertyBean sysPropertyBean;
/**
* 注入JedisPoolConfig实例
* 工厂的池配置
*
* @return
*/
@Bean
public JedisPoolConfig poolConfig() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大空闲数
poolConfig.setMaxIdle(sysPropertyBean.getRedisMaxIdle());
// 最小空闲数
poolConfig.setMinIdle(sysPropertyBean.getRedisMinIdle());
// 连接池的最大数据库连接数
poolConfig.setMaxTotal(sysPropertyBean.getRedisMaxTotal());
// 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
poolConfig.setMaxWaitMillis(sysPropertyBean.getRedisMaxWait());
return poolConfig;
}
/**
* 注入RedisConnectionFactory实例
* 连接工厂配置类
*
* @param jedisPoolConfig
* @return
*/
@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
// 设置连接参数
jedisConnectionFactory.setHostName(sysPropertyBean.getRedisHostName());
jedisConnectionFactory.setPort(sysPropertyBean.getRedisPort());
jedisConnectionFactory.setPassword(sysPropertyBean.getRedisPassword());
// 设置此工厂的池配置
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
/**
* 注入StringRedisTemplate实例
*
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
if (!sysPropertyBean.isUseRedis()) {
return null;
}
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
}
}
4、测试类
@Component
public class RedisTest {
@Resource
private StringRedisTemplate stringRedisTemplate;
@PostConstruct
public void init(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
stringRedisTemplate.opsForValue().set("test", df.format(new Date()),60*3, TimeUnit.SECONDS); // 保存数据,并只存在3分钟
}
}
5、验证
6、五大数据类型
/**
* string
* 实现:分布式锁
* 特点:简单、方便
*/
stringRedisTemplate.opsForValue();
/**
* hash
* 实现:购物车
* 特点:key-value 结构,可操作指定key
*/
stringRedisTemplate.opsForHash();
/**
* list(双向循环链表)
* 实现:简单消息队列
* 特点:先后顺序、两端操作
*/
stringRedisTemplate.opsForList();
/**
* set
* 实现:过滤器
* 特点:自动去重、随机
*/
stringRedisTemplate.opsForSet();
/**
* zset
* 实现:排行榜
* 特点:自动去重、自定义权重排序
*/
stringRedisTemplate.opsForZSet();
7、常用操作
//向redis里存入数据并设置设置缓存时间
stringRedisTemplate.opsForValue().set("test", "我是测试数据",60*10, TimeUnit.SECONDS);
//根据key获取过期时间
stringRedisTemplate.getExpire("test");
//设置过期时间
stringRedisTemplate.expire("test",1000 , TimeUnit.MILLISECONDS);
//根据key获取过期时间并换算成指定单位
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);
//根据key获取缓存中的val
stringRedisTemplate.opsForValue().get("test");
//根据key删除缓存
stringRedisTemplate.delete("test");
//检查key是否存在,返回boolean值
stringRedisTemplate.hasKey("test");