redis分布式缓存(十一)一一储存javabean对象

储存java bean对象业务剖析

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

java对象常用String存储,为什么还用hash?

Redis存储java对象,一般是String或Hash两种,那到底什么时候用hash? 什么时候用String?

  • String日常应用在频繁读操作的场景,它的存储格式是json,即把java对象转换为json,然后存入redis.
  • Hash日常应用在频繁写操作的场景,当对象的某个属性频繁修改时,采用hash可以减少大对象对于网络资源的消耗,我们只修改某个属性就行,而采用string数据结构,每次修改都需要把整个对象传给redis服务器,再转换为json存储,如果string特别大,相比hash消耗更多的网络资源
    • 如果采用hash,就可以针对某个属性单独修改,不用序列号去修改整个对象。例如,商品的库存、价格、关注数、评价数经常变动时,就使用存储hash结果。

案例实战:存储商品数据

场景1:创建商品

商品数据需要经常修改,所有采用hash结构。

@Autowired
private RedisTemplate redisTemplate;

@PostMapping(value = "/create")
public void create(Product obj) {
    //TODO 先进db
    //创建商品,先把数据添加到数据库,再存入redis
    String key="product:"+1000;
    //将Object对象里面的属性和值转化成Map对象
    Map<String, Object> map=this.objectToMap(obj);
    //批量put操作 putAll 等于 hmset命令
    this.redisTemplate.opsForHash().putAll(key,map);
    //查询
    Object name=this.redisTemplate.opsForHash().get(key,"name");
    log.info("name={}",name);
    Object price=this.redisTemplate.opsForHash().get(key,"price");
    log.info("price={}",price);
    Object detail=this.redisTemplate.opsForHash().get(key,"detail");
    log.info("detail={}",detail);

}

/**
 * 将Object对象里面的属性和值转化成Map对象
 */
public  Map<String, Object> objectToMap(Object obj)  {
    Map<String, Object> map = new HashMap<String,Object>();
    Class<?> clazz = obj.getClass();
    for (Field field : clazz.getDeclaredFields()) {
        field.setAccessible(true);
        String fieldName = field.getName();
        Object value = null;
        try {
            value = field.get(obj);
        } catch (IllegalAccessException e) {
            log.error(e.getMessage());
        }
        map.put(fieldName, value);
    }
    return map;
}
复制代码

场景2:商品涨价

商品价格修改,我们只需使用hash结构,只修改价格参数即可。

@PostMapping(value = "/addPrice")
public void addPrice(int id,int price) {
    String key="product:"+id;
    //商品价格涨价 increment等于  hincrby命令
    this.redisTemplate.opsForHash().increment(key,"price",price);
    Object price2=this.redisTemplate.opsForHash().get(key,"price");
    log.info("price={}",price2);
}

复制代码

redis分布式缓存系列