Redis在java中的應用
阿新 • • 發佈:2022-05-30
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") @ResponseBodypublic 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的序列化