储存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结果。
- 如果采用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分布式缓存系列
- redis分布式缓存(一)一一 redis安装(linux和docker)
- redis分布式缓存(二)一一 RDB和AOF
- redis分布式缓存(三)一一 SpringBoot集成Mybatis-Plus,Redis和Swagger
- redis分布式缓存(四)一一 SpringCache集成Redis
- redis分布式缓存(五)一一 常用命令(String)
- redis分布式缓存(六)一一 文章的阅读量PV解决方案
- redis分布式缓存(七)一一 分布式全局id解决方案
- redis分布式缓存(八)一一 高并发原子性操作(Redis+Lua)
- redis分布式缓存(九)一一 黑客防刷攻击解决方案
- redis分布式缓存(十)一一 常用命令(Hash)
- 文章持续更新中...




近期评论