概述

SpringBoot操作Redis复杂对象,通常使用RedisTemplate,直接声明即可。

@Autowired
private RedisTemplate redisTemplate;

put、putAll

put设置对象的单个属性值
putAll设置对象的多个属性值
//设置user的name、age、sex(本文所有demo都是重新初始化该对象,后面的代码没有再贴出这一块了)

HashMap<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", "23");
map.put("sex", "男");
redisTemplate.opsForHash().putAll("user", map);
//使用entries获取整个user对象
System.out.println("user:" + redisTemplate.opsForHash().entries("user"));

输出如下:

user:{sex=男, name=张三, age=23}

再次设置部分属性,其他属性的值不会受到影响

//这次只设置name、age
HashMap<String, Object> map2 = new HashMap<>();
map2.put("name", "李四");
map2.put("age", "24");
redisTemplate.opsForHash().putAll("user", map2);
//获取user对象
System.out.println("user:" + redisTemplate.opsForHash().entries("user"));

输出如下(sex值不变):

user:{sex=男, name=李四, age=24}

其他用法

//使用put设置单个属性
redisTemplate.opsForHash().put("user", "name", "张三三");
//使用get获取单个属性
System.out.println("user name:" + redisTemplate.opsForHash().get("user", "name"));

putIfAbsent

跟put类似,区别是putIfAbsent只有当属性不存在才生效

//设置birth为当前时间
System.out.println(redisTemplate.opsForHash().putIfAbsent("user", "birth", LocalDateTime.now()));
System.out.println("birth:" + redisTemplate.opsForHash().get("user", "birth"));
//等待2秒
Thread.sleep(2000);
//再次设置birth为当前时间
System.out.println(redisTemplate.opsForHash().putIfAbsent("user", "birth", LocalDateTime.now()));
System.out.println("birth:" + redisTemplate.opsForHash().get("user", "birth"));

输出如下(第2次设置会失败,返回false,birth不变):

true
birth:2020-08-17T16:34:22.355
false
birth:2020-08-17T16:34:22.355

hasKey

判断指定的属性是否在对象中

System.out.println(redisTemplate.opsForHash().hasKey("user", "name"));;
System.out.println(redisTemplate.opsForHash().hasKey("user", "name2"));;

输出如下:

true
false

delete

删除对象的一个或多个属性

//删除age、sex
redisTemplate.opsForHash().delete("user", "age", "sex");
System.out.println("user:" + redisTemplate.opsForHash().entries("user"));

输出如下:

user:{name=张三}

keys

获取对象的所有属性名

System.out.println(redisTemplate.opsForHash().keys("user"));

输出如下:

[name, sex, age]

multiGet

获取对象的多个属性值,entries是获取对象所有属性值,两个用法不同

List<String> keyList = new ArrayList<>();
keyList.add("name");
keyList.add("age");
System.out.println(redisTemplate.opsForHash().multiGet("user", keyList));

输出如下:

[张三, 23]

Q.E.D.


生命在于折腾