这里记录一个写购物车数据到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里面数据的结构更容易理解

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐