Redis 这么火,它都解决了哪些问题?( 三 )


上述数据类型中,每一个数据类型都有独立的命令来进行操作,很多情况下我们需要一次执行不止一个命令,而且需要其同时成功或者失败 。redis对事务的支持也是源自于这部分需求,即支持一次性按顺序执行多个命令的能力,并保证其原子性 。
4.3 Lua脚本
在事务的基础上,如果我们需要在服务端一次性的执行更复杂的操作(包含一些逻辑判断),则lua就可以排上用场了(比如在获取某一个缓存的时候,同时延长其过期时间) 。redis保证lua脚本的原子性,一定的场景下,是可以代替redis提供的事务相关的命令的 。相当于基于网络应用的架构风格中介绍到的远程求值(Remote Evluation = REV)的具体实现 。
4.4 管道
因为redis的客户端和服务器的连接时基于TCP的, 默认每次连接都时只能执行一个命令 。管道则是允许利用一次连接来处理多条命令,从而可以节省一些tcp连接的开销 。管道和事务的差异在于管道是为了节省通信的开销,但是并不会保证原子性 。
4.5 分布式锁
官方推荐采用Redlock算法,即使用string类型,加锁的时候给的一个具体的key,然后设置一个随机的值;取消锁的时候用使用lua脚本来先执行获取比较,然后再删除key 。具体的命令如下:
SET resource_name my_random_value NX PX 30000
if redis.call("get",KEYS[1]) == ARGV[1] then
 return redis.call("del",KEYS[1])
else
 return 0
end
总结
本篇着重从抽象层面来解释下redis的各项功能以及其存在的目的,而没有关心其具体的细节是什么 。从而可以聚焦于其解决的问题,依据抽象层面的概念可以使得我们在特定的场景下选择更合适的方案,而非局限于其技术细节 。
以上均是笔者个人的一些理解,如果不当之处,欢迎指正 。
参考
Redis 文档:https://github.com/antirez/redis-doc
Redis 简介:https://redis.io/topics/introduction
Redis 持久化(Persistence):https://redis.io/topics/persistence
Redis 发布/订阅(Pub/Sub):https://redis.io/topics/pubsub
Redis 哨兵(Sentinel):https://redis.io/topics/sentinel
Redis 复制(Replication):https://redis.io/topics/replication
Redis 集群(cluster):https://redis.io/topics/cluster-tutorial
RedIs 事务(Transaction):https://redis.io/topics/transactions
Redis 数据类型(data types):https://redis.io/topics/data-types-intro
Redis 分布式锁:https://redis.io/topics/distlock
Redis 管道(pipelining ):https://redis.io/topics/pipelining
Redis Lua Script:https://redis.io/commands/eval
 
【Redis 这么火,它都解决了哪些问题?】


推荐阅读