非关系型数据库 Redis 的知识点总结
一、Redis 概述
Redis 是一种基于 内存 的分布式非关系型数据库,使用 KV键值对 来保存数据;
纯内存操作以及单线程的模型,让 Redis 具有优越的性能。
【 官方给定的读取速度为:110000 次/s ( GET ) 81000 次/s ( SET ) 】
二、安装与配置
-
启动服务器:redis-server.exe redis.windows.conf
-
启动客户端:redis-cli.exe
-
桌面管理工具:RedisDesktopManager
-
设置密码:在 redis.windows.conf 的配置文件中设置 requirepass 密码
三、Redis 的五种数据类型
(1) String(字符串)
常规的 set/get 操作,value可以是String也可以是数字,一般做一些复杂的计数功能的缓存
set 键 值
get 键
(2) Hash(哈希)
这里value存放的是 结构化 的对象,每个hash可以存储4294967295个键值对(2^31-1)
hset 键 字段 值
hmset 键 字段1 值1 字段2 值2 字段n 值n
hget 键 字段
hmget 键 字段1 值1 字段2 值2 字段n 值n
hgetall 键
(3) List(列表)
可以利用 lrange 命令,做基于redis 的分页功能;每个列表可以存储4294967295个值(2^31-1)
lpush 键 值1 值2 值3 值n
lrange 键 开始下标 结束下标
(4) Set(集合)
集合中的值不允许重复,因此可以用来实现全局去重的功能
sadd 键 值1 值2 值3 值n
smembers 键
(5)Zset(Score Set 有序集合)
Zet集合中的元素能够按score进行排列,因此可用来实现排行榜应用,取 TOP N 的操作
zadd 键 分数1 值1 分数2 值2 分数n 值n
zrange 键 开始下标 结束下标
zanngebyscore 键 开始分值 结束分值
四、Redis的常用命令
【 获取所有键 】: **keys ***
【 获取键总数 】: dbsize
【 查询键是否存在 】: exists key 键
【 删除键 】: del key 键
【 查询键类型 】: type 键
-
【 查询key的生命周期(秒)】 ( -1:永不过期 )
① 秒语法: ttl key
② 亳秒语法: pttl key
-
【 设置过期时间 】
① 秒语法: expire key seconds
② 亳秒语法: pexpire key milliseconds
【 设置永不过期 】: persist 键
【 更改键名称 】: rename 键 新键
五、常见问题
1. Redis为什么这么快?
Redis采用内存作为存储介质,纯内存操作以及单线程的模型,避免了频繁的上下文切换,减少了额外的性能开销;Redis使用C/C++开发,数据库操作更贴近底层,上述特点使得Redis具有优越的性能。
2. 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为"-1 "的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
【解决方案】
① 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
② 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null, 缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。
3. 缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
【解决方案】
① 设置热点数据永远不过期。
② 定时任务更新缓存数据
③ 加互斥锁
4. 缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
【解决方案】
① 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
② 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
③ 设置热点数据永远不过期。