引入相关的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency
@Autowired
private StringRedisTemplate redisTemplate;
@SpringBootTest
class Qy151RedisSpringbootApplicationTests {
//里面所有的key还是value field它的类型必须都是String类型。
//因为key和value获取field他们使用的都是String的序列化方式
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void test02(){
//对hash类型的操作。
HashOperations<String, Object, Object> forHash = redisTemplate.opsForHash();
forHash.put("k1","name","张三");
forHash.put("k1","age","15");
Map<String,String> map=new HashMap<>();
map.put("name","李四");
map.put("age","25");
forHash.putAll("k2",map);
Object o = forHash.get("k1", "name");
System.out.println(o);
Set<Object> k1 = forHash.keys("k1");
System.out.println(k1);
List<Object> k11 = forHash.values("k1");
System.out.println(k11);
//获取k1对于的所有的field和value
Map<Object, Object> k12 = forHash.entries("k1");
System.out.println(k12);
}
@Test
void contextLoads() {
//删除指定的key
// redisTemplate.delete();
//查看所有的key
// redisTemplate.keys()
//是否存在指定的key
// redisTemplate.hasKey()
//对字符串数据类型的操作ValueOperations
ValueOperations<String, String> forValue = redisTemplate.opsForValue();
//存储字符串类型--key value long unit setex();
forValue.set("k1","张三",30, TimeUnit.SECONDS);
//等价于setnx 存入成功返回true,失败返回false
Boolean absent = forValue.setIfAbsent("k11", "李四", 30, TimeUnit.SECONDS);
System.out.println(absent);
Integer append = forValue.append("k11", "真帅");
String key = forValue.get("k11");
}
@SpringBootTest
class Qy151RedisSpringbootApplicationTests02 {
//当你存储的value类型为对象类型使用redisTemplate
//存储的value类型为字符串。StringRedisTemplate 验证码
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test01(){
//必须认为指定序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
//对String类型操作类
ValueOperations forValue = redisTemplate.opsForValue();
//redis中key和value都变成乱码了。
//key和value都没有指定序列化方式,默认采用jdk的序列化方式。
forValue.set("k1","张三");
//value默认采用jdk,类必须实现序列化接口
forValue.set("k2",new User(1,"刘德华",22));
}
@Configuration
public class RedisConfig {
@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序列化 filed value
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(redisSerializer);
return template;
}
@Service
public class DeptService {
@Autowired
private DeptMapper deptMapper;
@Autowired
private RedisTemplate redisTemplate;
//业务代码
public Dept findById(Integer id){
ValueOperations forValue = redisTemplate.opsForValue();
//查询缓存
Object o = forValue.get("dept::" + id);
//缓存命中
if(o!=null){
return (Dept) o;
}
Dept dept = deptMapper.selectById(id);
if(dept!=null){
//存入缓存中
forValue.set("dept::"+id,dept,2, TimeUnit.HOURS);
}
return dept;
}
public int deleteById(Integer id){
redisTemplate.delete("dept::"+id);
int row = deptMapper.deleteById(id);
return row;
}
public Dept insert(Dept dept){
int insert = deptMapper.insert(dept);
return dept;
}
public Dept update(Dept dept){
ValueOperations forValue = redisTemplate.opsForValue();
forValue.set("dept::"+dept.getId(),dept,2, TimeUnit.HOURS);
int insert = deptMapper.updateById(dept);
return dept;
}
#redis??? spring.redis.port=6005 spring.redis.host=192.168.1.130 ##mysql?? spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.password=123456 spring.datasource.username=root spring.datasource.url=jdbc:mysql://localhost:3306/aaa?serverTimezone=Asia/Shanghai #sql???? mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@Service public class DeptService { @Autowired private DeptMapper deptMapper; @Autowired private RedisTemplate redisTemplate; @Cacheable(cacheNames = {"dept"},key="#id") public Dept findById(Integer id){ Dept dept = deptMapper.selectById(id); return dept; } @CacheEvict(cacheNames = {"dept"},key="#id") public int deleteById(Integer id){ int row = deptMapper.deleteById(id); return row; } public int insert(Dept dept) { int insert = deptMapper.insert(dept); return insert; } @CachePut(cacheNames = "dept",key="#dept.id") public int update(Dept dept) { int insert = deptMapper.updateById(dept); return insert; }
@Service public class ProductStockService { @Autowired private ProductStockMapper productStockDao; @Autowired private StringRedisTemplate redisTemplate; public String decreaseStock(Integer productId) { ValueOperations<String, String> forValue = redisTemplate.opsForValue(); Boolean aBoolean = forValue.setIfAbsent("aaa::"+productId,"~~~~~~~~~~~"); if(aBoolean){ try{ //查看该商品的库存数量 Integer stock = productStockDao.findStockByProductId(productId); if (stock > 0) { //修改库存每次-1 productStockDao.updateStockByProductId(productId); System.out.println("扣减成功!剩余库存数:" + (stock - 1)); return "success"; } else { System.out.println("扣减失败!库存不足!"); return "fail"; } }finally { redisTemplate.delete("aaa::"+productId); } } return "服务器正忙"; } }