Redis
远程字典服务器(redis)是由Salvatore Sanfilippo编写的键值存储系统。它是一个跨平台的非关系数据库。
Redis是一个用ANSI C语言编写的开源键值数据库,符合BSD协议,支持网络,可以基于内存、分布式和可选持久性,并提供多种语言的API。
Hash
Redis hash是字符串类型的字段和值的映射表。哈希特别适合存储对象。
redis中的每个哈希可以存储232-1个键值对(超过40亿)。
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
pub/sub
Redis发布/订阅(pub/sub)是一种消息通信模式:发送方(pub)发送消息,订阅者(sub)接收消息。
Redis客户端可以订阅任意数量的频道。
下图显示了通道1与订阅此通道的三个客户端client2、client5和client1之间的关系:
当通过publish命令将新消息发送到通道1时,该消息将发送到订阅该消息的三个客户端:
Redis 事务
Redis事务可以一次执行多个命令,有以下三个重要保证:
批处理操作在发送exec命令之前放入队列缓存。
收到exec命令后,输入事务执行。事务中任何命令的执行都失败,其余命令仍在执行。
在事务执行期间,其他客户端提交的命令请求不会插入到事务执行命令序列中。
交易从开始到执行经历以下三个阶段:
启动事务。
命令加入团队。
执行交易。
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
单个redis命令的执行是原子的,但redis没有添加任何机制来维护事务的原子性,因此redis事务的执行不是原子的。
事务可以理解为打包的批处理执行脚本,但批处理指令不是原子化操作。中间指令的故障不会导致前一条指令回滚,也不会导致后续指令不回滚。