这里记录一个写购物车数据到redis,即普通的方式写入key,value数据格式被覆盖问题。
先说明一下SpringRedisTemplate写入Redis是正常的字符串;RedisTemplate写入到redis是byte串,需要对RedisTemplate进行转化。
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 600, redisFlushMode = RedisFlushMode.IMMEDIATE)
public class RedisSingleConfig {
@SuppressWarnings("rawtypes")
@Bean(name = "redisTemplate")
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(factory);
return template;
}
}
存数据:
写入数据到redis的写法一:
/**
*String.format(CART_REDIS_KEY_TEMPLATE,uid是生成的redisKey
*gson.toJson(new Cart(product.getId(),quantity,cartAddForm.getSelected()))是value
*也就是可以简化为redisTemplate.opsForValue().set(redisKey,value)
*/
redisTemplate.opsForValue().set(String.format(CART_REDIS_KEY_TEMPLATE,uid),
gson.toJson(new Cart(product.getId(),quantity,cartAddForm.getSelected())));
上述的redisKey是拼接的用户id生成的,value是新加入的购物车数据,那么第二次加入购物车时,因为key相同,数据是会覆盖的。
解决上面的问题写法二:
把数据存在map,也就是redis里面的hash
HashOperations<String,String,String> opsForValue=redisTemplate.opsForHash();
// redis中的key
String redisKey=String.format(CART_REDIS_KEY_TEMPLATE,uid);
// 此处可忽略,只是为了下面的数量变动
String value=opsForValue.get(redisKey,String.valueOf(product.getId()));
Cart cart;
if (StringUtil.isEmpty(value)){
// 没有该商品,新增
cart=new Cart(product.getId(),quantity,cartAddForm.getSelected());
}else {
// 已经存在,数量+1
cart=gson.fromJson(value,Cart.class);
cart.setQuantity(cart.getQuantity()+quantity);
}
// 存入数据
opsForValue.put(redisKey,String.valueOf(product.getId()),gson.toJson(cart));
?cart_1:redisKey
key:此处为商品id
value:是写入的数据
读取数据:
// 从redis查到数据
HashOperations<String,String,String> opsForValue=redisTemplate.opsForHash();
String redisKey=String.format(CART_REDIS_KEY_TEMPLATE,uid);
Map<String, String> entries = opsForValue.entries(redisKey);
// entries 的值为 {27={"productId":27,"quantity":2,"productSelected":true},26={"productId":26,"quantity":1,"productSelected":true}}
log.info(entries+"---------------------------------------");
for (Map.Entry<String,String> entry: entries.entrySet()) {
// productId
Integer productId =Integer.valueOf(entry.getKey()) ;
// 得到cart对象
Cart cart=gson.fromJson(entry.getValue(), Cart.class);
}
参照上面redis里面数据的结构更容易理解
|