Redis常见问答

本文仅作知识自检使用,持续更新
如果发现对某知识点不明确,请查阅Redis官方中文文档:http://redis.cn/documentation.html

1.Redis作为缓存和数据库的区别

  1. 缓存数据不重要,不是全量数据,缓存应该随访问变化热数据,因为内存大小有限,这是redis的瓶颈

2. 关于key的有效期

http://redis.cn/commands/expire.html

  1. 有效期不会随着访问而延长
  2. 发生写操作时会剔除原来的有效期
  3. 有效期原理:主动/被动
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应用

  1. 用户系统,统计用户登录天数,且窗口随机:每个用户一个bitmap,bitmap共365位,46字节
  2. 电商做活动,需要被火,需要备多少货 -> 找出活跃用户,如何统计活跃用户:

每个日期一个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
  1. 抽奖程序,可以设置重复或不重复抽奖:
  • @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)
  1. 音乐排行榜,更新热度,显示前三名 @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作为数据库和缓存的区别

  1. 缓存
  • 缓存的数据相比于数据库中的数据来说没那么重要,不是全量数据,存放的数据应该随访问变化,是热数据
  • redis数据都在内存中,所以内存大小是瓶颈,应该只保存热数据,随着访问变化,淘汰冷数据

redis作为LRU算法的缓存:http://redis.cn/topics/lru-cache.html

  1. 数据库

数据库的数据绝对不能丢失,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值