RedisTemplate说明
SpringBoot针对Redis开发了一套API,将redis常规操作进行了整合.Template底层实现时将Jedis对象再次进行了封装.
导入jar包
<!--SpringBoot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
编辑YML配置文件
server:
port: 8091
servlet:
context-path: /
spring:
#数据源配置
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#配置MVC的视图解析器的前缀和后缀
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
#spring整合redis
redis:
cluster:
nodes: 192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
jedis:
pool:
max-active: 1000 #最大链接数量
max-idle: 10 #最大的空闲数量
max-wait: 3 #最大的等待链接数量3
min-idle: 3 #最小空闲数量
#mybatis-plush配置
mybatis-plus:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.jt.mapper: debug
关于配置类说明
SpringBoot自动的实例化了2个API对象.
1.RedisTemplate 可以存储任意数据类型包括对象类型
2.StringRedisTemplate 只能操作string数据类型.
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
入门案例
@SpringBootTest
public class TestRedisTemplate {
@Autowired
private StringRedisTemplate redisTemplate;//操作数据类型String
//可以操作任意类型
@Autowired
private RedisTemplate<Object,Object> template = new RedisTemplate<>();
//具体操作的值是String类型
@Test
public void test01() {
//template操作5种数据类型
redisTemplate.opsForValue(); //操作String数据结构
redisTemplate.opsForHash(); //操作hash数据结构
redisTemplate.opsForSet(); //操作Set数据结构
redisTemplate.opsForZSet(); //操作Set有序结构
redisTemplate.opsForList(); //操作List集合结构
}
//具体操作的值是String类型
@Test
public void testString() {
redisTemplate.opsForValue().set("1912", "今天结课,明天放假,好开心");
String value = redisTemplate.opsForValue().get("1912");
System.out.println("获取返回值结果:"+value);
//jedis.setEx()
redisTemplate.opsForValue().set("A", "斗地主", 10, TimeUnit.MINUTES);
//获取超时时间默认单位秒
//获取数据的超时时间 按照纳米的形式计算
Long time = redisTemplate.getExpire("A",TimeUnit.NANOSECONDS);
System.out.println(time);
//jedis.setNX 如果key不存在时,redis才会赋值.
redisTemplate.opsForValue().setIfAbsent("A", "打麻将!!!!");
String value2 = redisTemplate.opsForValue().get("A");
System.out.println("结果:"+value2);
//jedis.setXX 如果key存才时,才会赋值
redisTemplate.opsForValue().setIfPresent("A", "打扑克!!!!");
String value3 = redisTemplate.opsForValue().get("A");
System.out.println("结果:"+value3);
}
@Test
public void testItemDesc() {
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(1001L).setItemDesc("对象类型测试");
//知识回顾: 如何将对象保存到redis里
//该方法自动的将对象转化为json
template.opsForValue().set("itemDesc1", itemDesc);
ItemDesc itemDesc2 = (ItemDesc)template.opsForValue().get("itemDesc1");
System.out.println(itemDesc2);
}
}
SpringBoot缓存注解介绍
开启redis缓存
@SpringBootApplication
@MapperScan("com.jt.mapper")
@EnableCaching //让springBoot中的redis注解生效
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class, args);
}
}
缓存注解说明
@RestController //要求返回JSON
public class RedisController {
//简化操作 mapper???
@Autowired
private ItemDescMapper itemDescMapper;
/**
* 用户根据id查询商品详情信息
* @param itemId
* @return
*
*
* 形成的key= itemDesc::7
* cacheNames:业务名称
* key: 用户自己指定key,如果不写则默认使用第一个参数
* 最好通过#spel表达式动态获取数据
* #itemId 动态指定key的值
*/
@RequestMapping("/findItemDesc")
@Cacheable(cacheNames="itemDesc",key="#itemId")
public ItemDesc findItemDescById(Long itemId) {
System.out.println("查询数据库:"+itemId);
return itemDescMapper.selectById(itemId);
}
/**
* 缓存更新
* 执行业务进行更新操作,之后将返回值缓存到redis中.
*
* spel表达式可以动态获取对象中的属性值!!!!!
*
* key=itemDesc::itemDesc.getItemId()的值
*/
@RequestMapping("/updateItemDesc")
@CachePut(cacheNames="itemDesc",key="#itemDesc.getItemId()")
public ItemDesc updateItemDesc(ItemDesc itemDesc) {
//根据主键更新
itemDescMapper.updateById(itemDesc);
return itemDesc;
}
@RequestMapping("/deleteItemDesc")
@CacheEvict(cacheNames="itemDesc",key="#itemId")
public String deleteItemDesc(Long itemId) {
itemDescMapper.deleteById(itemId);
return "删除数据成功:"+itemId;
}
}