Redis 为单进程单线程模式,采用队列模式将并发访问变为串行访问。
Redis 本身没有锁的概念,Redis 对于多个客户端连接并不存在竞争, 但是在业务客户端对 Redis 进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题, 这些问题均是由于客户端连接混乱造成
以及今天要谈到的Redis并发竞争问题,这里的并发指的是多个redis的client同时set key引起的并发问题。
比如:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4, 但是由于并发设置的原因,最后顺序变成了4,3,2,最后变成的key值成了2。
采用分布式锁+数据修改的时间戳 方案来解决。
①想要向缓存中写入数据时,必须要获得分布式锁,只有获得锁了才可以去进行缓存数据的写入,写入结束释放锁。就可以保证同时只有一个客户端去写缓存。
②可是并不能保证每个客户端获取锁的顺序。但是我们要写入缓存的数据都是从数据库查询出来的,数据库都是有这种数据的创建时间的,所以可以在更新之前,先去对比自己的这条数据的时间和缓存中数据的时间,谁更新,如果自己更新则写入覆盖,否则直接放弃本次操作。
这样就可以保证并发操作时的数据顺序问题。