数据类型
| string |
|
| 命令 |
set、get、mset、mget、setnx、incr、decr、incrby、decrby、getset |
| 数据格式 |
sds 动态字符串 |
| hash |
|
| 命令 |
set、get、mset、mget、setnx、incr、decr、incrby、decrby、getset |
| 数据格式 |
HashMap 字典 |
| list |
|
| 命令 |
set、get、mset、mget、setnx、incr、decr、incrby、decrby、getset |
| 数据格式 |
链表 |
| set |
|
| 命令 |
sadd、sismember、smembers、scard、srem |
| 数据格式 |
HashSet 集合 |
| zset |
|
| 命令 |
set、get、mset、mget、setnx、incr、decr、incrby、decrby、getset |
| 数据格式 |
SortedSet+HashSet 跳跃列表 |
事务
不支持回滚
事务命令
| 命令 |
描述 |
| multi |
开启事务 |
| exec |
执行事务 |
| watch |
监控一个key |
| dicard |
清除命令集合 |
事务错误处理
语法错误 事务里的语句全部不执行
> multi
> set a 3
> sets d 3 #不存在的命令
> set a 4
> exec
(error) EXECABORT Transaction discarded because of previous errors.
类型错误 事务里正确的语句都会被执行
> multi
> set a 2
> lpush a 3 4
> set a 3
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
# 第1和第3执行成功 第2个执行失败
分布式锁
概念
| 特性 |
描述 |
| 互斥性 |
在任意时刻,只有一个客户端能持有锁 |
| 同一性 |
加锁解锁都要是同一客户端 |
| 避免死锁 |
因意外没有释放锁,保证后续其他客户端也能获得锁 |
php实现分布式锁
http://ifeve.com/redis-lock/
composer require ronnylt/redlock-php
redis执行lua脚本
php实现
$script = '
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
';
return $instance->eval($script, [$resource, $token], 1);