分布式缓存redis,看这一篇就够了
redis是什么?
简单来说
redis
是一个开源的使用
ANSI C语言编写的内存数据库,使用
key-value的数据结构。支持数据持久化到硬盘,支持多种api语言的连接。通常当做缓存处理。
安装redis- redis官网:https://redis.io 英语好的看官网,下载linux版本redis
- redis for windows: https://github.com/MicrosoftArchive/redis/releases ,windows版下载到本地直接安装即可使用。
![分布式缓存redis,看这一篇就够了](https://img.it610.com/image/info9/5b7c800a82fd4eeda1e46b45ae6b9ee8.jpg)
文章图片
windows版本下载安装完成之后,在services.msc里面能看到redis服务。
![分布式缓存redis,看这一篇就够了](https://img.it610.com/image/info9/f860c27526584eaa91eb768ca39852da.jpg)
文章图片
springboot集成redis
我们使用redisson框架集成,新建工程,pom中添加如下依赖:
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
org.redisson
redisson
3.15.0
修改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 map = redissonClient.getMap(MAP_KEY);
map.put("a","hello redis");
return "ok";
}@GetMapping("get")
public String get(){
RMap map = redissonClient.getMap(MAP_KEY);
return map.get("a");
}
}
先用postman请求
http://localhost:8080/demo/put
将数据放进去,然后找一个redis的ide工具(本文用的是redis studio)查看redis中的数据![分布式缓存redis,看这一篇就够了](https://img.it610.com/image/info9/7c5c9ad0da444043b1c09797f69493ad.jpg)
文章图片
数据是放进去了,而且使用
http://localhost:8080/demo/get
也能将数据拿出来,不过用redis的ide工具怎么那么不形象呢,不好看。。。那是因为你在使用redissonClient的时候没有指定序列化方式。修改代码如下:RMap map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
【分布式缓存redis,看这一篇就够了】再试下看看redis studio怎么显示的:
![分布式缓存redis,看这一篇就够了](https://img.it610.com/image/info9/a65cec47908843cda2f0971fd5a5f68d.jpg)
文章图片
怎么样,清晰了吧。那RMap只能放基本数据对象吗》能不能放自定义对象?建一个dto:
@Data
public class UserDto implements Serializable {
private String username;
private Integer age;
private Date birthday;
private List fav;
}
新增rest方法:
@GetMapping("put2")
public String put2(){
RMap 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 map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
UserDto userDto = map.get("userDto");
return userDto;
}
按套路出牌,自己postman请求,然后看redis studio的数据:
![分布式缓存redis,看这一篇就够了](https://img.it610.com/image/info9/6cdccee1e8324d3e91da3013a83a7fa7.jpg)
文章图片
怎么样,舒服了吧,对象都被你存进去了,而且还能从redis里面拿出来自己转换成UserDto对象!!!
好了,以上是RMap对象,下面的list和set我就不细解说了,直接上代码。
@GetMapping("put3")
public String put3(){
RSet set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
set.add(System.currentTimeMillis());
return "ok";
}@GetMapping("get3")
public String get3() throws InterruptedException {
RSet set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
Iterator iterator = set.iterator();
String result = "";
while (iterator.hasNext()){
result +=","+iterator.next();
}
return result;
}@GetMapping("put4")
public String put4(){
RList list = redissonClient.getList(LIST_KEY, JsonJacksonCodec.INSTANCE);
list.add(1L);
return "ok";
}@GetMapping("get4")
public String get4() throws InterruptedException {
RList 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 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
推荐阅读
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 深入浅出谈一下有关分布式消息技术(Kafka)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- springboot使用redis缓存
- 缓存有关的配置和属性
- (1)redis集群原理及搭建与使用(1)
- KubeDL HostNetwork(加速分布式训练通信效率)
- springboot结合redis实现搜索栏热搜功能及文字过滤
- Redis——发布订阅/消息队列
- redis|redis 常见问题一