- 数据一致性技术手段与思路
- 使用事务(MULTI - EXEC):
- 思路:在Redis中,当数据发生变化时,将相关的操作包装在一个事务内。例如,如果是对多个键值对的更新操作,使用
MULTI
命令开启事务,然后依次执行各个更新命令,最后用EXEC
提交事务。这样可以确保要么所有操作都执行成功,要么都不执行,从而保证数据的一致性。
- 示例代码(Python - redis - py):
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
pipe = r.pipeline()
pipe.multi()
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute()
- 使用Watch机制:
- 思路:在进行数据更新操作前,使用
WATCH
命令监控一个或多个键。如果在事务执行之前,被监控的键被其他客户端修改,那么当前事务会被取消。这样可以避免并发操作导致的数据不一致。
- 示例代码(Python - redis - py):
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
with r.pipeline() as pipe:
while True:
try:
pipe.watch('key_to_watch')
value = pipe.get('key_to_watch')
new_value = int(value) + 1 if value else 1
pipe.multi()
pipe.set('key_to_watch', new_value)
pipe.execute()
break
except redis.WatchError:
continue
- 实时性技术手段与思路
- 使用Pub/Sub(发布/订阅):
- 思路:客户端订阅特定的Redis频道,当数据发生变化时,服务器将更新信息发布到相应的频道。各个订阅该频道的客户端会立即收到消息,并根据消息更新展示内容。
- 示例代码(Python - redis - py):
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
pubsub = r.pubsub()
pubsub.subscribe('channel_name')
for message in pubsub.listen():
if message['type'] =='message':
data = message['data']
# 处理接收到的数据,更新展示
- 使用Redis Streams:
- 思路:Redis Streams提供了一种更高级的消息传递模型。生产者可以向流中追加消息,消费者组可以从流中消费消息。它支持消息的持久化、可靠的消息传递等特性。对于实时展示场景,可以将数据变化作为消息追加到流中,客户端从流中消费消息并更新展示。
- 示例代码(Python - redis - py):
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
# 生产者
r.xadd('stream_name', {'field1': 'value1'})
# 消费者组
r.xgroup_create('stream_name', 'group_name', id='$')
while True:
messages = r.xreadgroup('group_name', 'consumer_name', {'stream_name': '>'}, count = 1)
if messages:
for stream, message in messages:
message_id, data = message[0]
# 处理接收到的数据,更新展示
- 结合使用:
可以同时使用事务保证数据一致性,再结合Pub/Sub或者Redis Streams来保证实时性。例如,在事务执行成功后,通过Pub/Sub发布数据更新的消息,或者将更新内容作为消息追加到Redis Streams中,让各个客户端实时获取更新并展示。