Spring Boot 对 Redis 的支持已经非常完善,丰富的 API 足够我们日常的开发,这里我介绍几个最常用的供大家学习,其他 API 希望大家自己多学习,多研究,用到会去查即可。
目前有两个 Redis 模板:RedisTemplate 和 StringRedisTemplate。这里不推荐使用 RedisTemplate,因为 RedisTemplate 提供的是操作对象,我们通常以 JSON 格式存储该对象,存储时,会使用 Redis 默认的内部序列化器,易导致存储内容出现乱码。当然了,我们可以自定义序列化,但比较麻烦。所以多会使用 StringRedisTemplate 模板。StringRedisTemplate 为我们提供了字符串操作,将实体类转换成 JSON 字符串进行存储,等取出来后,再将其转换成相应的对象,这也就是我在上面导入了阿里巴巴 Fastjson 的原因。
Redis:String 类型
新建一个 RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue()
可以获取 ValueOperations<String, String>
对象,通过该对象即可读写 Redis 数据库。
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* set redis: string类型
* @param key key
* @param value value
*/
public void setString(String key, String value){
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(key, value);
}
/**
* get redis: string类型
* @param key key
* @return
*/
public String getString(String key){
return stringRedisTemplate.opsForValue().get(key);
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Course14ApplicationTests {
private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
@Resource
private RedisService redisService;
@Test
public void contextLoads() {
//测试Redis的string类型
redisService.setString("weichat","程序员私房菜");
logger.info("我的微信公众号为:{}", redisService.getString("weichat"));
// 如果是个实体,我们可以使用json工具转成json字符串,
User user = new User("CSDN", "123456");
redisService.setString("userInfo", JSON.toJSONString(user));
logger.info("用户信息:{}", redisService.getString("userInfo"));
}
}
Redis:Hash 类型
Hash 类型的原理其实和 String 一样,但 Hash 有两个 Key,使用 stringRedisTemplate.opsForHash()
可以获取 HashOperations<String, Object, Object>
对象。比如我们要存储订单信息,所有订单信息都放在 order 下,针对不同用户的订单实体,可以通过用户的 id 来区分,这就相当于两个 Key 了。
@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* set redis: hash类型
* @param key key
* @param filedKey filedkey
* @param value value
*/
public void setHash(String key, String filedKey, String value){
HashOperations<String, Object, Object> hashOperations = stringRedisTemplate.opsForHash();
hashOperations.put(key,filedKey, value);
}
/**
* get redis: hash类型
* @param key key
* @param filedkey filedkey
* @return
*/
public String getHash(String key, String filedkey){
return (String) stringRedisTemplate.opsForHash().get(key, filedkey);
}
}
测试:
@SpringBootTest
public class Course14ApplicationTests {
private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
@Resource
private RedisService redisService;
@Test
public void contextLoads() {
//测试Redis的hash类型
redisService.setHash("user", "name", JSON.toJSONString(user));
logger.info("用户姓名:{}", redisService.getHash("user","name"));
}
}
Redis:list 类型
使用 stringRedisTemplate.opsForList()
可以获取 ListOperations<String, String> listOperations
Redis 列表对象,该列表是个简单的字符串列表,可以支持从左侧添加,也可以支持从右侧添加,一个列表最多包含 232−1232−1 个元素。
@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* set redis:list类型
* @param key key
* @param value value
* @return
*/
public long setList(String key, String value){
ListOperations<String, String> listOperations = stringRedisTemplate.opsForList();
return listOperations.leftPush(key, value);
}
/**
* get redis:list类型
* @param key key
* @param start start
* @param end end
* @return
*/
public List<String> getList(String key, long start, long end){
return stringRedisTemplate.opsForList().range(key, start, end);
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Course14ApplicationTests {
private static final Logger logger = LoggerFactory.getLogger(Course14ApplicationTests.class);
@Resource
private RedisService redisService;
@Test
public void contextLoads() {
//测试redis的list类型
redisService.setList("list", "football");
redisService.setList("list", "basketball");
List<String> valList = redisService.getList("list",0,-1);
for(String value :valList){
logger.info("list中有:{}", value);
}
}
}
总结:
在实际项目中,通常都将 Redis 作为缓存,在查询数据库的时候,会先从 Redis 中查找,如果有信息,则从 Redis 中取;如果没有,则从数据库中查,并且同步到 Redis 中,这样下次再访问 Redis 时就有数据了。更新和删除也是如此,都需要同步到 Redis。Redis 在高并发场景下运用得较多。