redis是什么?

简略来说redis是一个开源的应用ANSI C语言编写的内存数据库,应用key-value的数据结构。反对数据长久化到硬盘,反对多种api语言的连贯。通常当做缓存解决。

装置redis

  1. redis官网:https://redis.io 英语好的看官网,下载linux版本redis
  2. 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:

@Datapublic 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