对Hashmap的操作
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void saveUserRedis(){
String tokenkey = "login:user:" + 1;
User user = new User(1, "张三", 20);
Map<String, Object> map= BeanUtil.beanToMap(user,new HashMap<>(),
CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName,fieldValue) -> {
if (fieldValue == null){
fieldValue = "0";
}else {
fieldValue = fieldValue.toString();
}
return fieldValue;
}
));
获取 map转对象
@Test
public void getHash(){
String tokenkey = "login:user:" + 1;
Map<Object, Object> userMap = redisTemplate.opsForHash().entries(tokenkey);
User user = BeanUtil.fillBeanWithMap(userMap, new User(), false);
System.out.println(user);
}
// setIgnoreNullValue(true) 我们设置忽略空值了,但是我们的属性为空的还会报空指针异常
原因:
1.setFieldValueEditor优先级要高于ignoreNullValue导致前者首先被触发,因此出现空指针问题。你在setFieldValueEditor中也需要判空。
2.这么设计的原因主要是,如果原值确实是null,但是你想给一个默认值,在此前过滤掉就不合理了,而你的值编辑后转换为null,后置的判断就会过滤掉。
对String的操作
//设值
@Test
public void testString(){
redisTemplate.opsForValue().set("login:code:"+"15959400832","616999",2, TimeUnit.MINUTES);
}
//取值
@Test
public void getString(){
String s = redisTemplate.opsForValue().get("login:code:" + "15959400832");
System.out.println(s);
}
对象
//设置值
@Test
public void testStringUser(){
User user = new User(1, "zhangsan", 3);
String jsonUser = JSONUtil.toJsonStr(user);
redisTemplate.opsForValue().set("login:user:1",jsonUser,2, TimeUnit.MINUTES);
}
//获取值
@Test
public void getStringUser(){
String json = redisTemplate.opsForValue().get("login:user:1");
System.out.println(json);
User user = JSONUtil.toBean(json, User.class);
System.out.println(user);
}
对set的操作
@Test
public void test() throws InterruptedException {
String key="blog:dianzan:1";
redisTemplate.opsForSet().add(key,"用户id1","用户id2"); //添加
Boolean flag = redisTemplate.opsForSet().isMember(key, "用户id1");//判断是否存在
System.out.println(flag);
TimeUnit.SECONDS.sleep(30);
redisTemplate.opsForSet().remove(key,"用户id1"); //删除
}
//共同关注
@Test
public void testString(){
String key="guanzhu:user";
String key1="beiguanzhu:user";
redisTemplate.opsForSet().add(key,"1","2","3");
redisTemplate.opsForSet().add(key1,"11","2","31");
Set<String> intersect = redisTemplate.opsForSet().intersect(key, key1); //取交集
intersect.stream().forEach(System.out::println); //2
}
对Zset的操作
@Test
public void test() throws InterruptedException {
String key = "zset:dianzan:1";
redisTemplate.opsForZSet().add(key, "用户1", System.currentTimeMillis()); //添加
redisTemplate.opsForZSet().add(key, "用户2", System.currentTimeMillis() + 1); //添加
redisTemplate.opsForZSet().add(key, "用户3", System.currentTimeMillis() + 2); //添加
Double user3 = redisTemplate.opsForZSet().score(key, "用户2"); //判断是否存在
if (user3 == null) {
System.out.println("不存在");
}
System.out.println(user3); //1.682406322163E12
//redisTemplate.opsForZSet().remove(key,"用户1"); //移除
Set<String> range = redisTemplate.opsForZSet().range(key, 1, 2); //从0开始 0 1 2...
if (range == null || range.isEmpty()){
System.out.println(Collections.emptyList());
}
List<String> collect = range.stream().map(String::valueOf).collect(Collectors.toList());
System.out.println(collect); //[用户2, 用户3]
}
对bitMap的操作
@Test
public void testString() {
LocalDateTime now = LocalDateTime.now();
String format = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key="user:sign"+format;
int dayOfMonth=now.getDayOfMonth(); //这个月的第几天
//写入redis setbit ket offset 1
redisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);
Boolean bit = redisTemplate.opsForValue().getBit(key, dayOfMonth - 1);
System.out.println(bit);//true
List<Long> longs = redisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));
System.out.println(longs.get(0)); //返回十进制的数
}