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