Spring Boot 集成 Redis
3.1 依赖导入
Spring Boot 集成 redis 很方便,只需要导入一个 redis 的 starter 依赖即可。如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--阿里巴巴fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.35</version> </dependency>
这里也导入阿里巴巴的 fastjson 是为了在后面我们要存一个实体,为了方便把实体转换成 json 字符串存进去。
3.2 Redis 配置
导入了依赖之后,我们在 application.yml 文件里配置 redis:
spring: #redis相关配置 redis: database: 5 # 配置redis的主机地址,需要修改成自己的 host: 127.0.0.1 port: 6379 password: 123456 timeout: 5000 jedis: pool: # 连接池中的最大空闲连接,默认值也是8。 max-idle: 500 # 连接池中的最小空闲连接,默认值也是0。 min-idle: 50 # 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽) max-active: 1000 # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException max-wait: 2000
3.3 常用 api 介绍
Spring Boot 对 redis 的支持已经非常完善了,丰富的 api 已经足够我们日常的开发,这里我介绍几个最常用的供大家学习,其他 api 希望大家自己多学习,多研究。用到会去查即可。
有两个 redis 模板:RedisTemplate 和 StringRedisTemplate。
我们不使用 RedisTemplate,RedisTemplate 提供给我们操作对象,操作对象的时候,我们通常是以 json 格式存储,但在存储的时候,会使用 Redis 默认的内部序列化器;导致我们存进里面的是乱码之类的东西。当然了,我们可以自己定义序列化,但是比较麻烦,所以使用 StringRedisTemplate 模板。
StringRedisTemplate 主要给我们提供字符串操作,我们可以将实体类等转成 json 字符串即可,在取出来后,也可以转成相应的对象,这就是上面我导入了阿里 fastjson 的原因。
3.3.1 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); } }
该对象操作的是 string,我们也可以存实体类,只需要将实体类转换成 json 字符串即可。下面来测试一下:
@RestController @RequestMapping("/redis") public class RedisController { private static final Logger logger = LoggerFactory.getLogger(RedisController.class); @Resource private RedisService redisService; @RequestMapping("/setString") public String setString(){ //测试redis的string类型 redisService.setString("qq","88888888"); logger.info("我的qq号为:{}", redisService.getString("qq")); // 如果是个实体,我们可以使用json工具转成json字符串, User user = new User(1l,"㽵子", "123456"); redisService.setString("userInfo", JSON.toJSONString(user)); return "success"; } }
3.3.2 redis:hash 类型
hash 类型其实原理和 string 一样的,但是有两个 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); } }
测试一下:
User user = new User(1l,"庄子", "123456"); //测试redis的hash类型 redisService.setHash("user", "name", JSON.toJSONString(user)); logger.info("用户姓名:{}", redisService.getHash("user","name"));
3.3.3 redis:list 类型
使用 stringRedisTemplate.opsForList() 可以获取 ListOperations<String, String>
listOperations redis 列表对象,该列表是个简单的字符串列表,可以支持从左侧添加,也可以支持
从右侧添加,一个列表最多包含 2 ^ 32 -1 个元素
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); } }
可以看出,这些 api 都是一样的形式,方便记忆也方便使用。具体的 api 细节我就不展开了,大家可以
自己看 api 文档。其实,这些 api 根据参数和返回值也能知道它们是做什么用的。来测试一下:
//测试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); }