1. 设置、查询、获取过期时间;
set key value
get key
ttl key
2. 缓存穿透:设置空键;
- 先从redis取,没取到再数据库取,再没取到设置默认值
- 如果是默认缓存,到一定次数不让再刷
expire
3. 封杀单ip;
- 对于单独ip,开辟一个 key value,key = 前缀 + ip
4. 封杀ip段;
- list 类型,列表,可以塞入字符串,可以按顺序也可直接插入奥列表头部尾部
lpush key value
llen
lpush users hua
lpush users zhang
lrange users 0 -1
del users
rpush users zhang
rpush users hua
lrange users 0 -1
- 实战:ip前三段,装入list。ip段数量到阈值,整段被禁止
5. 缓存预热;
set users hua EX 200
ttl users
6. 使用 hash 数据类型保存新闻的缓存,增加点击量;
- 当缓存拥有多个独立字段,且会发生变化时,单纯的string就不适合了
- hash数据类型,常用于商品缓存
hset key field value
hget key field
hset news101 news_id 101
hset news101 news_title testtitle
hget news101 news_id
hgetall news101
hgetall key
hkeys key
hvals keys
hmset news102 news_id 102 news_title testtitle2
hmget news102 news_id news_title
hincrby news102 views 1
7. Sorted set(有序集合) 分离新闻缓存内容和新闻点击量、排行榜、预热新闻;
- 之前还有个 set 类型
- Sorted set 自带一个 score,适合排行榜
zadd key score member
zadd news 19 news101:
zadd news 12 news101
zadd news 31 news102
zrange news 0 -1
zrange news 0 2
zrange news 0 -1 withscores
zrank news news101
zrevrange news 0 -1 with score
zincrby news 1 news101
zscore news news101
zrange news 0 -1
zrangebyscore news 15 22
zrevrangebyscore news 22 15
8. 缓存超时策略:手动清除分体式新闻策略,入门订阅发布事务;
subscribe news
publish news content
zadd newscache xxxx 101
zadd newscache xxxx 102
zadd newscache xxxx 103
zadd newscache xxxx 104
9. 缓存超时策略:缓存过期自动触发;
- 开启 redis 配置:notify-keyspace-events “Ex”
- 目前统一对数据库0进行操作
- 找个客户端订阅:subscribe keyevent@0:expired
- 另外开一个客户端:setnx name 10 hua
- 10 秒过后,订阅端就会收到消息
10. 缓存中锁的应用:库存锁,防止库存变负数;
zadd stock 12 prod101
setnx
while(!setnx("lock", "xx")) {
usleep(100000)
}
del("lock", "xx")
11. 缓存中锁的应用2:初步防止死锁的发生,set方法的参数;
set name hua EX 30 NX
12. 缓存中锁的应用:其它;
- 上面的问题:
- 如果卡顿时间超过了设置锁的时间(30秒),那么锁就会自动解除,锁就被下一个人拿走了
- 别人操作完成后,你这边不卡顿了,继续执行下方的,又会出现负库存
- 同样,锁被人拿走后,你很可能删掉别人创建的锁
- 追加事务:
multi exec discard watch
- 这次使用到 watch:监控一个或者多个key,一旦其中有一个 key 被修改,删除,覆盖,接下来如果执行multi。。exec就会失败
- 监控一直到exec执行成功就取消监听(所有被watch的key)断开当前链接也会关闭监听
- 代码:
watch age
multi
set name zhang
exec