1. 程式人生 > 其它 >Redis在java中的應用

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的序列化