Redis在java中的应用

1:引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>

 

 

2:编写配置文件

spring.redis.host=192.168.197.170
spring.redis.password=redis
spring.redis.port=6379

 

 

3:实际代码应用

在代码中将关键类注入

 @Autowired
    private StringRedisTemplate redisTemplate;

普通 k v插入测试

 @GetMapping("/set")
    @ResponseBody
    public TestUserEntity setToRedis(){
        redisTemplate.opsForValue().set("k1","v1");
        return null;
    }

普通k v获取测试

    @GetMapping("/get")
    @ResponseBody
    public Object get(String key){

        return redisTemplate.opsForValue().get(key);
    }

 

 

先访问set方法,然后访问get方法,结果如下

 

 

 

 

把复杂对象存入,这里使用fastjson的方式存入 这样的好处是,存储的结构和解析的结构都由我们自己掌控,否则我们存进去的一些值 其实是会被转换的,这样容易造成一些不必要的处理麻烦

引入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

 

1:造就对象存起来    这个存储结构可以理解成 Map<String, Map<String, Object>>

 @GetMapping("/setobj")
    @ResponseBody
    public TestUserEntity setObjToRedis(){
        BoundHashOperations<String, Object, Object> e = redisTemplate.boundHashOps("entity"); //这个是最外层的 key  value
        for (int i = 0; i < 5; i++) {
            TestUserEntity entity = new TestUserEntity();
            entity.setCreatetime(new Date());
            entity.setId(i);
            entity.setMark("测试传入对象模型");
            entity.setName("张三");
            entity.setPhone("110");
            entity.setPswd("adsfads45646asdf");

            e.put("k" + i, JSON.toJSONString(entity)); //这个是最外层value的k v
        }

        return null;
    }

 

先看看访问后,库里的展现形式

 

 

2:新增成功了,再来看获取,也是一个道理,获取的数据是什么类型 就用什么来序列化即可

先创建一个方法,随便get一个值试一下

    @GetMapping("/getObj")
    @ResponseBody
    public Object getObj(String key){

        BoundHashOperations<String, Object, Object> entity = redisTemplate.boundHashOps("entity");

        Object o1 = entity.get(key);


        TestUserEntity testUserEntity = JSON.parseObject(o1.toString(), TestUserEntity.class);

        return testUserEntity;
    }

 

访问结果如下 说明解析是没问题的

 

 3:如果想把数据全部拿到,根据存的时候的结构,其实它是一个list集合,集合里面是多个对象,这是一个非常简单的结构,解析也比较容易

下面方法中用了stream流,如果不熟悉,其实参照上面获取一个数据的方法,也有办法拿到所有的数据

    /**
     * 获取全部数据
     *
     */
    @GetMapping("/getObjList")
    @ResponseBody
    public Object getObjList(){

        BoundHashOperations<String, Object, Object> entity = redisTemplate.boundHashOps("entity");
        List<Object> values = entity.values();

        List<TestUserEntity> collect = values.stream().map(o -> {
            return JSON.parseObject(o.toString(), TestUserEntity.class);
        }).collect(Collectors.toList());


        return collect;
    }

 

访问一下

 

 上面描述的是redis两个比较常用的主要方法之一,当然,上面有个小点,那就是这个关键方法的类用了StringRedisTemplate,我们试着把前面的String去掉,大家就能看到区别了

//    @Autowired
//    private StringRedisTemplate redisTemplate;
    
    @Autowired
    private RedisTemplate redisTemplate;

 

把redis中数据清掉后,重新访问setobj方法,然后我们打开客户端看,就会发现如下情况

 

 

 

其实是String序列化和没有序列化的区别,解析不影响,我们可以点开源码看一下

直接打开StringRedisTemplate

 

 这个string()是啥了,在点进去

 

 没错就是熟知的UTF8编码

而不带String的,则没有实现u8的序列化 

 

posted @ 2022-05-30 15:06  鸭猪是的念来过倒  阅读(235)  评论(0编辑  收藏  举报