非关系型数据库(Redis)
1.概念:
Redis是使用内存作为存储介质,采用键值对来保存数据的NoSQL数据库,是一种非关系型数据库。性能优越(GET 读 :110000/s ;SET 写 :81000/s 【官方】)
2.应用场景:
- 缓存热点或常用数据(评论)
- 消息队列(支付)
- 高速读写场景(现场投票)
3.注意事项:
- 业务数据如果命中率很低,就没有必要写入Redis
- 业务数据操作写操作多,频繁需要写入数据,也没有必要使用Redis
- 业务数据要存储几百兆字节的文件,会给Redis带来很大的压力,也没有必要使用Redis
4.安装和配置
启动服务器:redis-server redis.windows.conf
启动客户端:redis-cli.exe
桌面管理工具:RedisDesktopManager
设置密码:redis.windows.conf配置文件中设置requirepass密码
5.五种数据类型
- String (字符串)
set 键 值
例如:set China beijing;
get 键
例如:get China
- Hash(哈希)
hset 键 字段 值
hget键 字段
hmset 键 字段1 值1 字段2 值2 字段3 值3 ... 字段n 值n
hmget 键 字段1 字段2 字段3 ... 字段n
hgetall 键
容量:每个hash可以存储4294967295键值对(2的32次方-1)
- List(列表)
lpush键 值1 值2 值3 值n
lrange 键 开始下标 结束下标
容量:每个列表可以存储4294967295键值对(2的32次方-1)
- Set(集合)
sadd 键 值1 值2 值3 ... 值n
smembers 键
- Zset(Sorted Set : 有序集合)
zadd 键 分数1 值1 分数2 值2 分数3 值3 ... 分数n 值n
zrange 键 开始下标 结束下标
zrangebyscore 键 开始分值 结束分值
6.常用命令
- 获取所有键 : keys *
- 获取键总数 :dbsize
- 查询键是否存在: exists key 键
- 删除键 :del key 键
- 查询键类型 :type 键
- 查询key的生命周期(秒)
秒语法:ttl key (-1永远不过期)
毫秒语法:pttl key (-1永远不过期)
- 设置过期时间
秒语法:expire key seconds
毫秒语法:pexpire key milliseconds
- 设置永不过期:persist 键
- 更改键名称:rename 键 新键
7.常见问题
* Redis为什么这么快?
Redis采用内存作为存储介质;存储数据采用KV键值对,KV键值对结构相对简单,不会带来额外的性能开销;单线程;使用C/C++开发,数据库操作更贴近底层。
* 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如id为 “-1”或者id为特别大而不存在的数据,这时用户很可能是攻击者,攻击会导致数据库压力过大。是一种攻击手段
解决方案:
接口层增加校验,如用户鉴权校验,id作为基础校验,id<=0的直接阻拦
从缓存和数据库都取不到的数据,可以将key-value写为 key-null,缓存有效时间可以设置短一些(设置太长会导致正常情况也没法使用)。防止攻击用户反复私用同一个id暴力攻击
* 缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据,这时由于并发用户特别多,同时读取缓存没有读到数据,又同时去数据库读取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
设置热点数据永不过期
定时任务更新缓存数据
加互斥锁
* 缓存雪崩
缓存雪崩是指缓存中数据大批量过期,同时又有特别多的并发用户,引起数据库压力过大甚至down机。和缓存基础按不同的是,缓存雪崩是不同数据都过期了,很多数据都查不到从而去数据库中查询
解决方案:
缓存数据法人过期时间设置随机,防止同一时间大量数据过期现象发生
如果缓存数据是分布式部署,将热点数据均匀分布在不同的缓存数据中
设置热点数据永不过期