愿你如阳光,明媚不忧伤。
- 1. Redis 简介
- 2. 使用 Redis
- 2.1 引入相关依赖
- 2.2 SpringBoot 中的 Redis 配置
- 3. redisTemplate 与 StringRedisTemplate
- 3.1 StringRedisTemplate与RedisTemplate区别
- 3.2 RedisTemplate 数据结构操作
- 3.3 StringRedisTemplate 数据结构操作
- 4. 使用案例
- 4.1 redis:string
- 4.2 redis:hash
- 4.3 redis:list
1. Redis 简介
Redis (Remote Dictionary Server)是一种非关系型数据库(NoSQL),NoSQL 是以 key-value 的形式存储的,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说 SQL 标准,ACID 属性,表结构等等,这类数据库主要有以下特点:非关系型的、分布式的、开源的、水平可扩展的。
NoSQL 使用场景有:对数据高并发读写、对海量数据的高效率存储和访问、对数据的高可扩展性和高可用性等等。
之前有写过,不再过多介绍 → Redis 下载及安装 Redis 入门教程 – 命令大全
2. 使用 Redis 2.1 引入相关依赖
- pom.xml
Spring Boot 集成 redis 很方便,只需要导入一个 redis 的 starter 依赖即可。
2.2 SpringBoot 中的 Redis 配置org.springframework.boot spring-boot-starter-data-redis
- application.yml
spring:
#redis相关配置
redis:
# 使用几号数据库
database: 5
# 配置redis的主机地址,需要修改成自己的
host: 192.168.***.**
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. redisTemplate 与 StringRedisTemplate
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。
StringRedisTemplate 主要给我们提供字符串操作,我们可以将实体类等转成 json 字符串,取出来后,也可以转成相应的对象。
- 两者的关系是StringRedisTemplate继承RedisTemplate。
- 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- RedisTemplate使用的是JdkSerializationRedisSerializer,存入数据会将数据先序列化成字节数组然后在存入Redis数据库。StringRedisTemplate使用的是StringRedisSerializer,
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet(); //操作set redisTemplate.opsForZSet();//操作有序set3.3 StringRedisTemplate 数据结构操作
stringRedisTemplate.opsForValue().set("test", "100", 60 * 10, TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedisTemplate.boundValueOps("test").increment(-1);//val-1
stringRedisTemplate.opsForValue().get("test");//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(1);//val+1
stringRedisTemplate.getExpire("test");//根据key获取过期时间
stringRedisTemplate.getExpire("test", TimeUnit.SECONDS);//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("test");//检查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("test_set", "1", "2", "3");//向指定key中存放set集合
stringRedisTemplate.expire("test", 1000, TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().isMember("test_set", "1");//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("test_set");//根据key获取set集合
4. 使用案例 4.1 redis:string
- RedisService.java
新建一个 RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue() 可以获取 ValueOperations对象,通过该对象即可读写 redis 数据库。
@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
public void setString(String key, String value) {
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(key, value);
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
- RedisController.java
编写测试类
@RestController
@RequestMapping("/redis")
public class RedisController {
@Resource
private RedisService redisService;
@RequestMapping("/string")
public String redisString(String key) {
redisService.setString(key, "SpringBoot集成Redis");
return redisService.getString(key);
}
}
浏览器访问:http://localhost:8080/redis/string?key=ITGodRoad
- RedisService.java
hash 类型其实原理和 string 一样的,但是有两个 key,使用 stringRedisTemplate.opsForHash() 可以获取 HashOperations对象。比如我们要存储订单信息,所有订单信息都放在 order 下,针对不同用户的订单实体,可以通过用户的 id 来区分,这就相当于两个 key 了。
@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
public void setHash(String key, String filedKey, String value) {
HashOperations hashOperations = stringRedisTemplate.opsForHash();
hashOperations.put(key, filedKey, value);
}
public String getHash(String key, String filedKey) {
return (String) stringRedisTemplate.opsForHash().get(key, filedKey);
}
}
- RedisController.java
编写测试类
@RestController
@RequestMapping("/redis")
public class RedisController {
@Resource
private RedisService redisService;
@RequestMapping("/hash")
public String redisHash(String key, String filedKey) {
redisService.setHash(key, filedKey, "SpringBoot集成Redis-Hash");
return redisService.getHash(key, filedKey);
}
}
浏览器访问:http://localhost:8080/redis/hash?key=ITGodRoadHash&filedKey=RedisHash
- RedisService.java
使用 stringRedisTemplate.opsForList() 可以获取 ListOperationslistOperations redis 列表对象,该列表是个简单的字符串列表,可以支持从左侧添加,也可以支持从右侧添加,一个列表最多包含 2 ^ 32 -1 个元素。
@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
public Long setList(String key, String value) {
ListOperations listOperations = stringRedisTemplate.opsForList();
return listOperations.leftPush(key, value);
}
public List getList(String key, Long start, Long end) {
return stringRedisTemplate.opsForList().range(key, start, end);
}
}
- RedisController.java
编写测试类
@RestController
@RequestMapping("/redis")
public class RedisController {
@Resource
private RedisService redisService;
@RequestMapping("/list")
public String redisList(String key) {
redisService.setList(key, "SpringBoot集成Redis-List1");
redisService.setList(key, "SpringBoot集成Redis-List2");
redisService.setList(key, "SpringBoot集成Redis-List3");
return redisService.getList(key,0L,-1L).toString();
}
}
浏览器访问:http://localhost:8080/redis/list?key=ITGodRoadList



