事务
multi
...
exec
watch
过期时间
在关系型数据库中一般需要一个额外的字段记录到期时间,然后定期检查,删除过期数据。在redis中可以使用expire命令设置一个键的过期时间,到时间后redis会自动删除它。
set key value
expire key time 设置过期时间,返回1表示成功;0表示键不存在或设置失败
ttl key 返回键的剩余时间,单位是秒。当键不存在时,返回-2。-1表示永久键。
persist key 取消过期时间,将键改为永久键。使用set和getset赋值的同时也可以清楚过期时间。
对应的还有另外一组设置毫秒时间的
pexpire
pttl
过期时间实现访问频率限制
- 利用过期时间,每分钟设置一个key,incr到指定数量时,拒绝。过期后重新计数。
- 用列表存储,每个新请求,判断列表是否到达最大长度,若未到达,直接加入;否则,与最早的时间比较,看时间间隔是否大于1分钟,若大于,将最早的时间删除,新时间插入;否则拒绝。
过期时间实现缓存。限制redis占用的最大内存,不设置过期时间,而让redis通过一定的规则淘汰不需要的缓存键。修改maxmemory参数,设置maxmemory-policy。eg. allkeys-lru
排序
127.0.0.1:6379> sadd posts 2 6 12 26
(integer) 4
127.0.0.1:6379> smember posts
(error) ERR unknown command 'smember'
127.0.0.1:6379> smembers posts
1) "2"
2) "6"
3) "12"
4) "26"
127.0.0.1:6379> hset post:2 time 1352619200
(integer) 1
127.0.0.1:6379> hset post:6 time 1352619600
(integer) 1
127.0.0.1:6379> hset post:12 time 1352610100
(integer) 1
127.0.0.1:6379> hset post:26 time 1352612000
(integer) 1
127.0.0.1:6379> sort posts
1) "2"
2) "6"
3) "12"
4) "26"
## 这里by的感觉很像是表连接
127.0.0.1:6379> sort posts by post:*->time desc
1) "6"
2) "2"
3) "26"
4) "12"
通过sort命令的get参数,该参数不影响排序,作用是似的sort命令的返回结果不再是元素自身的值,而是get参数中指定的键值。
127.0.0.1:6379> sort posts by post:*->time desc get post:*->title
1) "66666"
2) "windows 8"
3) "262626"
4) "121212"
## 一个sort也可以带有多个get参数(但by只能有一个)
sort posts by post:*->time desc get post:*->title get post:*->time get #
1) "66666"
2) "1352619600"
3) "windows 8"
4) "1352619200"
5) "262626"
6) "1352612000"
7) "121212"
8) "1352610100"
get # 会返回元素本身。
store参数保存排序结果
sort posts by post:*->time desc get post:*->title get post:*->time get # store sort.result
(integer) 12 ## 保存的键类型是列表类型,返回值为结果个数
127.0.0.1:6379> lrange sort.result 0 -1
1) "66666"
2) "1352619600"
3) "6"
4) "windows 8"
5) "1352619200"
6) "2"
7) "262626"
8) "1352612000"
9) "26"
10) "121212"
11) "1352610100"
12) "12"
sort对性能的影响
O(n+mlog(m)),n为待排序列表中元素个数,m为排序结果返回的个数。
- 尽量减少待排序键中元素的数量(减少n)
- 使用limit只获取需要的数据(减少m)
- 尽量使用store参数缓存
消息通知
订阅功能,将用户邮箱存储在集合中,当新增文章后,就向集合中的邮箱地址发送通知邮件。
当页面需要进行如发送邮件、复杂数据运算等耗时较长的操作时会阻塞页面的渲染,为了避免用户等待太久,应该使用独立的线程来完成。
松耦合,生产者和消费者无需知道彼此的实现细节。易于扩展,消费者可以有多个,分布在不同机器中,轻松降低单台服务器的负载。
结合lpush和rpop,往列表左侧添加,右侧取出,模拟消息队列。同时redis提供brpop命令,当没有元素可以取出时,brpop命令将会阻塞,直到油新元素加入。
brpop key timeout
其中time为超时时间,0表示不限制等待时间,即将一直等待下去。
brpop key [key ...] timeout 可以实现优先队列,当多个key对应的列表都有数据可以取出的时候,按从左到右的列表顺序
管道
当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出,从简降低往返时延累计值。