共计 5516 个字符,预计需要花费 14 分钟才能阅读完成。
redis 是什么?
简略来说
redis
是一个开源的应用 ANSI C 语言编写的内存数据库,应用 key-value 的数据结构。反对数据长久化到硬盘,反对多种 api 语言的连贯。通常当做缓存解决。
装置 redis
- redis 官网:https://redis.io 英语好的看官网,下载 linux 版本 redis
- redis for windows: https://github.com/MicrosoftArchive/redis/releases,windows 版下载到本地间接装置即可应用。
windows 版本下载安装实现之后,在 services.msc 外面能看到 redis 服务。
springboot 集成 redis
咱们应用 redisson 框架集成,新建工程,pom 中增加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.15.0</version>
</dependency>
批改 application.yml 文件,增加 redis 的配置
spring:
redisson:
address: redis://127.0.0.1:6379 #redis 的地址和端口,默认端口是 6379
password: #默认没有交易
database: 0 #Redis 默认状况下有 16 个分片,这里配置具体应用的分片,默认是 0
timeout: 10000 #连贯超时工夫(毫秒)
增加配置类,映射 yml 文件中的属性
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "spring.redisson")// 获取 yml 文件中以 spring.redisson 结尾的所有数据
public class RedissonProperties {
// 映射 yml 文件外面的数据
private String address;
private String password = null;
private int database = 0;
private int timeout = 3000;
}
减少 RedissonClient 初始化类:
@Configuration
@ConditionalOnClass(RedissonClient.class)// 存在 RedissonClient 才创立该类
@ConditionalOnProperty({"spring.redisson.address"})// 存在 spring.redisson.address 配置才创立该类
public class RedissonConfig {
@Resource
private RedissonProperties properties;
@Bean(destroyMethod = "shutdown")
RedissonClient redissonClient(RedissonProperties properties) throws Exception {Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig
.setAddress(properties.getAddress())
.setDatabase(properties.getDatabase())
.setTimeout(properties.getTimeout());
// 明码不为空才设置,否则默认 yml 注入的空串会导致创立 redisson 不胜利
if(!StringUtils.isEmpty(properties.getPassword())){singleServerConfig.setPassword(properties.getPassword());
}
return Redisson.create(config);
}
}
好了,自此,筹备工作都做好了,上面就能够编码操作 redis 的数据了。
@RestController
@RequestMapping("demo")
public class DemoController {
@Resource
private RedissonClient redissonClient;
public static String MAP_KEY = "MAP";
public static String SET_KEY = "SET";
public static String LIST_KEY = "LIST";
@GetMapping("put")
public String put(){RMap<String, String> map = redissonClient.getMap(MAP_KEY);
map.put("a","hello redis");
return "ok";
}
@GetMapping("get")
public String get(){RMap<String, String> map = redissonClient.getMap(MAP_KEY);
return map.get("a");
}
}
先用 postman 申请http://localhost:8080/demo/put
将数据放进去,而后找一个 redis 的 ide 工具(本文用的是 redis studio)查看 redis 中的数据
数据是放进去了,而且应用http://localhost:8080/demo/get
也能将数据拿进去,不过用 redis 的 ide 工具怎么那么不形象呢,不难看。。。那是因为你在应用 redissonClient 的时候没有指定序列化形式。批改代码如下:
RMap<String, String> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
再试下看看 redis studio 怎么显示的:
怎么样,清晰了吧。那 RMap 只能放根本数据对象吗》能不能放自定义对象?建一个 dto:
@Data
public class UserDto implements Serializable {
private String username;
private Integer age;
private Date birthday;
private List<String> fav;
}
新增 rest 办法:
@GetMapping("put2")
public String put2(){RMap<String, UserDto> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
UserDto userDto = new UserDto();
userDto.setUsername("张三 6");
userDto.setAge(18);
userDto.setBirthday(new Date());
userDto.setFav(Arrays.asList("apple","pear"));
map.put("userDto",userDto);
return "ok";
}
@GetMapping("get2")
public UserDto get2() throws InterruptedException {RMap<String, UserDto> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
UserDto userDto = map.get("userDto");
return userDto;
}
按套路出牌,本人 postman 申请,而后看 redis studio 的数据:
怎么样,难受了吧,对象都被你存进去了,而且还能从 redis 外面拿进去本人转换成 UserDto 对象!!!
好了,以上是 RMap 对象,上面的 list 和 set 我就不细讲解了,间接上代码。
@GetMapping("put3")
public String put3(){RSet<Long> set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
set.add(System.currentTimeMillis());
return "ok";
}
@GetMapping("get3")
public String get3() throws InterruptedException {RSet<Long> set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
Iterator<Long> iterator = set.iterator();
String result = "";
while (iterator.hasNext()){result +=","+iterator.next();
}
return result;
}
@GetMapping("put4")
public String put4(){RList<Long> list = redissonClient.getList(LIST_KEY, JsonJacksonCodec.INSTANCE);
list.add(1L);
return "ok";
}
@GetMapping("get4")
public String get4() throws InterruptedException {RList<Long> list = redissonClient.getList(LIST_KEY, JsonJacksonCodec.INSTANCE);
String result="";
for (Long aLong : list) {result+=aLong;}
return result;
}
每次都要写 JsonJacksonCodec.INSTANCE 这个玩意很烦,算了,默认了吧。默认应用 JsonJacksonCodec.INSTANCE 序列化。那咱们批改下 config 好了。
@Bean(destroyMethod = "shutdown")
RedissonClient redissonClient(RedissonProperties properties) throws Exception {Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig
.setAddress(properties.getAddress())
.setDatabase(properties.getDatabase())
.setTimeout(properties.getTimeout());
// 明码不为空才设置,否则默认 yml 注入的空串会导致创立 redisson 不胜利
if(!StringUtils.isEmpty(properties.getPassword())){singleServerConfig.setPassword(properties.getPassword());
}
// 指定默认序列化
Codec codec=(Codec) ClassUtils.forName("org.redisson.codec.JsonJacksonCodec", ClassUtils.getDefaultClassLoader()).newInstance();
config.setCodec(codec);
return Redisson.create(config);
}
上面来一个不指定序列化的调用 redis 试试:
@GetMapping("test")
public String test(){RMap<String, UserDto> map = redissonClient.getMap("MAP_KEY");
UserDto userDto = new UserDto();
userDto.setUsername("张三 6d");
userDto.setAge(18);
userDto.setBirthday(new Date());
userDto.setFav(Arrays.asList("apple","pear"));
map.put("userDto",userDto);
return "ok";
}
还乱码吗?不乱码了吧。
redis 的用途远不至于此,还能够设置缓存的数据有效期,多长时间内无效,并且能够监听创立、批改、销毁数据事件,另外还有队列、公布订阅等期待大伙摸索。
总结一句,redis 当缓存很好用,然而长久化数据库就算了,他天生不是干那个的!
更多 java 原创浏览:https://javawu.com