16、redis缓存
问题
- 存储层与缓存层数据不一致问题
- 代码的维护加大,运维成本加大
场景
mysql开销大的复杂运算
粒度划分问题
如:一张表中有100个字段,redis怎么去缓存这些数据呢!
如果缓存所有字段,会有如下问题:
- 消耗更多的空间
- 查询数据,将结果返回时会占用更多的网络消耗
- 序列化与反序列化的cpu消耗
如果只缓存热点数据,会有以下问题:
- 通用性比较低,如果要有查询的字段没在缓存中,需要重新缓存
- 代码维护较为复杂,如上
多级缓存
好处:
- 提速
- 减少服务器压力
- 提升系统并发
一级缓存:
客户端,浏览器缓存
二级缓存:
nginx.conf
1
|
lua_shared_dict_dis_cache 5m;
|
三级缓存:
redis等
需要借助OpenResty,可以构造出足以胜任10k乃至1000k以上的并发连接响应的高性能web应用系统。
需要写lua脚本
key设计
1
2
3
4
5
6
|
product:id:1:name # 可以很清楚看出是存储的是商品,id为1的商品名
order:uid:1:info # 可以很清楚的看到是存储的用户id为1的订单的信息
#以上还有一个好处就是,可以使用变量
$uid = get name:snailsir:id
$info = get order:uid:$uid:info
|
http://www.cs-cjl.com/
缓存数据
1
2
3
4
5
6
7
8
9
10
11
12
|
# 单值缓存
set loginCode 736345
get loginCode
# 对象缓存
set user:1 {name:snailsir,age:3}
#批量添加缓存
mset user:1:name snailsir user:1:age 2
#获取单个缓存
get user:1
#批量获取缓存
mget user:1 user:2
|
hash缓存
1
2
3
4
5
|
hset user:1 name snailsir
hset user:1 sex 1
hmset user 1:name snailsir 1:balance 1888
hmget user 1:name 1:bakance
|