list和hash 数据结构的使用

该博客介绍了如何使用Redis解决分布式锁、分布式事务和分布式文件等核心问题,并展示了如何利用Redis的数据结构(如List和Hash)实现实时热销榜单和购物车功能。通过RedisTemplate操作,实现了从缓存中读取每日视频排行榜并更新购物车商品的数量,确保了高并发场景下的数据一致性。
摘要由CSDN通过智能技术生成

分布式三大问题:  分布式锁、分布式事务、分布式文件

 

热销榜单的实现 

@RestController
@RequestMapping("api/v1/rank")
public class RankController {

    @Autowired
    private RedisTemplate redisTemplate;

    private static final String DAILY_RANK_KEY = "video:rank:daily";

    @RequestMapping("daily_rank")
    public JsonDate videoDailyRank(){
        // 此时数据还没有插入到list中,从单元测试中插入的
        List<VideoDo> list = redisTemplate.opsForList().range(DAILY_RANK_KEY,0,-1);

        return JsonDate.buildSuccess(list);

    }
}
	@Test
	public void saveRank(){
		String DAILY_RANK_KEY = "video:rank:daily";
		VideoDo videoDo1 = new VideoDo(1, "课程1", "img", 1000);
		VideoDo videoDo2 = new VideoDo(2, "课程2", "img", 1000);
		VideoDo videoDo3 = new VideoDo(3, "课程3", "img", 1000);
		redisTemplate.opsForList().leftPushAll(DAILY_RANK_KEY, videoDo1, videoDo2, videoDo3);

        // 手动设置video为榜单中的第一个
        redisTemplate.opsForList().set(RANK_KEY,1,video);

	}

利用hash数据结构实现购物车

 一般Do是与数据库交互的一层,Vo是返回前段的一块

@RestController
@RequestMapping("api/v1/cart")
public class CartController {
   
    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private VideoDao videoDao;

    @RequestMapping("add")
    public JsonDate addCart(int videoId,int buyNum){
        // 先获取购物从,判断是否有,有就增加,没有就创建
        BoundHashOperations<String, Object, Object> mycartOps = getMycartOps();
        Object o = mycartOps.get(videoId + "");
        String res = "";
        if(o!=null){
            res = (String)o;
        }
        if(o == null){ // 购物车没有这个商品
            CartItemVO cartItem = new CartItemVO(); //将商品加入到购物车中
            VideoDo videoDo = videoDao.findDetailById(videoId);

            cartItem.setBuyNum(buyNum);
            cartItem.setPrice(videoDo.getPrice());

            mycartOps.put(videoId, JsonUtil.objectToJson(cartItem));

        }else{
            // 增加商品购买数量
            CartItemVO cartItemVO  =JsonUtil.jsonToPojo(res,CartItemVO.class);
            cartItemVO.setBuyNum(cartItemVO.getBuyNum()+buyNum);

            mycartOps.put(videoId+"",JsonUtil.objectToJson(cartItemVO));
        }
        return JsonDate.buildSuccess();


    }

    /**
     * 抽取购物车公共方法
     * @return
     */
    private BoundHashOperations<String,Object,Object> getMycartOps(){
        String key = getCartKey();
        return redisTemplate.boundHashOps(key);
    }

    private String getCartKey(){
        // 用户id,一般是直接从拦截器中或区域
        int userId = 88;

        String cartKey = String.format("video:cart:%s",userId);
        return cartKey;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zero _s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值