SpringBoot使用redis
Linux安装redis
- 下载
windows环境下载地址: http://www.redis.cn/
可直接在linux上下载:执行wget http://download.redis.io/releases/redis-5.0.5.tar.gz - 安装
解压完文件
tar -zxvf redis-5.0.5.tar.gz
来到
yum install gcc ##安装c编译库,如果有就不需要安装了
yum install gcc-c++ ##安装c++编译库
make
make install
cd redis-5.0.5
安装后执行文件在src目录下,配置文件redis.conf就在安装文件下,为了方便管理,可以将它们放在新的文件目录中。
- 修改redis.conf配置文件
vi redis.conf
#bind127.0.0.1 ##注释这个配置,可通过/bind命令按n查找
protected-mode no ##原来默认是yes,可通过/protected-mode命令按n查找
这两个配置的作用是让redis可以远程访问
- 启动Redis
./redis.server ../redis.conf ##来到src目录下执行
- 测试
可以使用内置的客户端与Redis进行交互:
$ ./redis.cli
redis> set redis helloRedis
OK
redis> get redis
"helloRedis"
- 测试远程访问6379端口
默认没关闭防火墙,远程无法访问,需要开放端口或者直接关闭防火墙,这里我选择开放端口
firewall-cmd --add-port = 6379/tcp --permanent ##永久添加6379端口
firewall-cmd --reload ##重新载入配置
iptables -L -n ##查看规则
从远程调用端测试6379端口是否可以访问telnet <ip> 6379
Springboot配置使用Redis
- 依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
- application.yml配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos配置
profiles:
active: dev
application:
name: redis-test
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/redistest?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
redis: #redis配置
host: 123.22.22.22 #服务器ip
port: 6379 #redis端口
database: 0
timeout: 1800000 #超时时间
lettuce:
pool:
max-active: 20
max-wait: -1
max-idle: 5
min-idle: 0
- Springboot启动类
@SpringBootApplication
@EnableDiscoveryClient //nacos注册发现
@ComponentScan(basePackages = {"com.redistext"})
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication .class,args);
}
}
没有什么需要开启的
- 配置类
@Configuration
@EnableCaching //开启缓存
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))//数据过期时间
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
- 使用方法
- @Cacheable用法
@Cacheable(key = "'selectAllBanner'",value = "banner")
public List<CrmBanner> selectAllBanner() {
QueryWrapper<CrmBanner> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
//last可以拼接spl语句
wrapper.last("limit 2");
List<CrmBanner> list = baseMapper.selectList(wrapper);
return list;
}
重点是@Cacheable注解,会在redis中生成key为:banner::selectAllBanner
,value为:list
内容的键值对。
- @CacheEvict
@CacheEvict(value = "banner",allEntries = true)
public List<CrmBanner> selectAllBanner() {
QueryWrapper<CrmBanner> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
//last可以拼接spl语句
wrapper.last("limit 2");
List<CrmBanner> list = baseMapper.selectList(wrapper);
return list;
}
在使用@CacheEvict注解设置allEntries = true会清空banner缓存。
- RedisTemplate使用
@Autowired
private RedisTemplate<String,String> redisTemplate;
public void testRedis(String phoneNumber,String code){
//存入数据,设置有效时间5分钟
redisTemplate.opsForValue().set(phoneNumber,code,5, TimeUnit.MINUTES);
}