redis使用过程中怎么用来解决并发问题

509 阅读2分钟

概述

redis作为缓存组件,一般而言用来缓存我们程序的数据。所以并发问题可能存在两个地方,一个是redis缓存中数据并发问题,一个是业务程序数据并发问题。

redis缓存数据并发问题

场景1:
  我们做的是个博客系统,需要对每篇文章点赞数据进行收集统计,多个用户同时点赞是个并发行为,
  这个时候一般来说就有数据并发问题。初始谋篇文章点赞数量是0,这个时候张三和李四同时对一篇文章
  进行点赞,拿到的初始值都是0,点赞完都是+1,这个时候更新回去,点赞数量就是1了。
  
  解决方案:直接使用redis的incr指令统计即可。因为redis是单线程处理指令的(锁),再则这个incr指令是
          单指令读修改写会是原子的操作(可见性,原子性),所以不存在数据并发覆盖问题。
           
场景2:
  假设我们这个博客系统有推荐功能,当用户点赞后,还需要给某个用户打上喜欢某种类型博客的标签,下回
  就能给用户推荐类似的文章。这个时候涉及两个操作,点赞数+1,添加喜爱文章标签。两个数据都是临时
  放在redis中,需要两个redis指令执行。
  
  解决方案:可以使用lua脚本,将需要的redis指令写在脚本中。因为redis是单线程处理指令的(锁),
          redis会将lua脚本当做单个指令处理(可见性,原子性),所以不存在数据并发覆盖问题。
          
  总结:其实上述问题是一样的,都是数据进行-读修改写会-三个操作,如果拆成三个指令,即使是单线程去执行,
       也会有数据问题。比如6个指令顺序为读 读 修改 修改 写回 写回,那么其实最后还是发生数据覆盖。

业务程序数据并发问题

  在当前背景下,微服务已经非常盛行,一般我们服务都是多节点部署的,当多个用户通过通过不同节点要访问修改
  同一条数据时,也会发生数据覆盖或者说是并发问题。就拿java来说,普通的单机锁已经无法满足了,必须要找到
  一个中间件来存储这个锁标记,这样达到所有节点锁数据共享的目的。所以一般redis也会有作为分布式锁的场景
  使用,当然分布式锁的实现还有mysql,zookeeper等方式。

总结

可以看到,redis在我们日常开发当中运用的场景还是挺多的,可以运用redis高性能的特性做一些解决方案 来满足我们需求。