本文仅作知识自检使用,持续更新
如果发现对某知识点不明确,请查阅Redis官方中文文档:http://redis.cn/documentation.html
这里写目录标题
1.Redis作为缓存和数据库的区别
- 缓存数据不重要,不是全量数据,缓存应该随访问变化热数据,因为内存大小有限,这是redis的瓶颈
2. 关于key的有效期
http://redis.cn/commands/expire.html
- 有效期不会随着访问而延长
- 发生写操作时会剔除原来的有效期
- 有效期原理:主动/被动
127.0.0.1:6379> help EXPIREAT
EXPIREAT key timestamp
summary: Set the expiration for a key as a UNIX timestamp
since: 1.2.0
group: generic
3. 什么是缓存穿透、缓存击穿、缓存雪崩
1. 缓存穿透
- key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
- 比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
2. 缓存击穿
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
3. 缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
4. Redis为什么是二进制安全的
Redis使用字符流/字节流,数值类型也使用字符流存储,计算时再转换成数值,Redis的key有type和encoding两个属性,用去区分value的类型和编码,redis的编码依赖于外部设置的编码格式
5. Redis应用
- 用户系统,统计用户登录天数,且窗口随机:每个用户一个bitmap,bitmap共365位,46字节
- 电商做活动,需要被火,需要备多少货 -> 找出活跃用户,如何统计活跃用户:
每个日期一个bitmap,每位代表一个用户(用户id),1代表当天在线,0代表当天不在线
127.0.0.1:6380> setbit 20201029 1 1
(integer) 1
127.0.0.1:6380> setbit 20201030 182379 1
(integer) 1
127.0.0.1:6380> setbit 20201030 324 1
(integer) 1
127.0.0.1:6380> bitop or dest 20201029 20201030
(integer) 22798
127.0.0.1:6380> bitcount dest 0 -1
(integer) 3
- 抽奖程序,可以设置重复或不重复抽奖:
- @SET
SRANDMEMBER
,正负参数可以设置重复或者不重复
127.0.0.1:6379> sadd user tom jerry jack john yamy peper boke
(integer) 7
127.0.0.1:6379> srandmember user 3
1) "john"
2) "tom"
3) "jerry"
127.0.0.1:6379> srandmember user -3
1) "jerry"
2) "jerry"
3) "peper"
- 使用
spop
,取出一个
127.0.0.1:6379> sadd user tom jerry jack john yamy peper boke
(integer) 7
127.0.0.1:6379> spop user
"yamy"
127.0.0.1:6379> spop user
"jack"
127.0.0.1:6379> spop user
"boke"
127.0.0.1:6379> spop user
"john"
127.0.0.1:6379> spop user
"jerry"
127.0.0.1:6379> spop user
"peper"
127.0.0.1:6379> spop user
"tom"
127.0.0.1:6379> spop user
(nil)
- 音乐排行榜,更新热度,显示前三名 @SORTED_SET
127.0.0.1:6379> zadd music 10 "lost yourself" 9 "bad guy" 8 "another one bites the dust" 7 "dont cry" 6 "sweet dream"
(integer) 5
127.0.0.1:6379> zrevrange music 0 2
1) "lost yourself"
2) "bad guy"
3) "another one bites the dust"
6. Sorted set 排序是如何实现的?
使用skip list 跳表,增删改查综合效率最优
7. Redis作为数据库和缓存的区别
- 缓存
- 缓存的数据相比于数据库中的数据来说没那么重要,不是全量数据,存放的数据应该随访问变化,是热数据
- redis数据都在内存中,所以内存大小是瓶颈,应该只保存热数据,随着访问变化,淘汰冷数据
redis作为LRU算法的缓存:http://redis.cn/topics/lru-cache.html
- 数据库
数据库的数据绝对不能丢失,redis做数据库要同时考虑速度和持久性(redis+mysql,rdb,aof),因为redis掉电易失
8. RDB v.s AOF
1. RDB
弊端
- 不支持多个RDB文件,每个redis进程只有一个RDB文件
- 丢失数据相对较多,时点与时点间的窗口数据易丢失
优点
- 类似Java中的序列化,数据恢复速度较快
2. AOF
优点
- 丢数据相对较少
- redis中RDB和AOF可以同时开启,如果开启了AOF,就只会使用AOF进行数据恢复,4.0版本后,AOF中可以包含一个RDB全量,在其后追加操作记录
弊端
- 体量无限变大,数据恢复慢 -----> 4.0之前重写AOF(整合命令),4.0之后重写时将老数据存到RDB,增量数据append到AOF