文章目录

  • Redis用来做什么?
  • Redis为什么这么快?
  • Redis有哪些数据结构
  • 字符串strings
  • 散列 hashes
  • 列表 lists
  • 集合sets
  • 有序集合sorted sets
  • 什么是epoll模型
  • Redis怎么实现分布式锁
  • Redis是二进制安全得吗
  • 你了解Redis遍历时候的索引吗
  • Redis的管道连接
  • Redis的发布订阅
  • Redis事务
  • Redis缓存击穿怎么解决?
  • 缓存和数据库的区别
  • Redis的key有效期
  • Redis怎么淘汰过期的key
  • Redis淘汰策略
  • Redis的持久化


Redis用来做什么?

redis是一种基于内存的非关系型数据库。在公司中主要用来做数据存储,和数据缓存,消息中间件。

Redis为什么这么快?

Redis底层是单线程模型,非阻塞模型,主要是存储key-value的形式,使用IO多路服用的epoll模型。
redis是基于内存的,普通的数据库是基于磁盘的,内存的速度是磁盘速度的上万倍。

Redis有哪些数据结构

字符串strings

字符类型:set ,get,append,setrane,strlen
数值类型: incr 实现点赞功能,秒杀
bitmaps:setbit,bitcount,bitpos,bitop 实现某个时间段某个用户在线多少天

散列 hashes

对field进行数值计算
点赞,收藏,详情页
map(key-value)

列表 lists


队列
数组

集合sets

无序
随机性
去重
可以用来抽奖

有序集合sorted sets

有一个分值,根据分值大小排序
取并集,交集
排序通过跳跃表实现增删改更快

范围查询 bitmaps,hyperloglogs
地理空间 geospatial

什么是epoll模型

bat脚本登陆redis执行命令 redis batch_redis


linux系统分为用户态和内核态。

客户端发送连接,redis用户态会有一个线程专门负责轮询去监听连接状态。epoll会直接返回哪些文件有事件发生,然后去建立连接。

Redis怎么实现分布式锁

redis在设置key的事件加ex,当可以存在的事件就会设置key失败,类似于一个锁的功能。可以通过expire设置key过期时间,以做到释放锁。或者手动删除key。

Redis是二进制安全得吗

redis是二进制安全的,redis底层是c语言实现的,结束符是\0,如果字符串中包含\0就会截断字符串,二进制就不安全了,redis的结构体中包含了字符串的长度len和剩余空间free,保证了二进制安全。

你了解Redis遍历时候的索引吗

正向索引就是从0开始递增的下标 0,1,2,3.。。。
反向索引就是最后一位是-1,往前依次是-2,-3,-4

Redis的管道连接

echo -e “set k1 qq \n incre k1” | nc localhost 6379
通过管道符连接一个管道,把一串命令一起执行,命令之间在linux系统中用\n分割,windows中用\r\n

Redis的发布订阅

publish ooxx “hello” 发布通道
subscribe ooxx 订阅通道,订阅之后线程阻塞,有消息生产就会收到
只有订阅之后才能看到数据

Redis事务

redis的事务中是没有回滚的,redis追求高性能,速度快
mutli命令 ,开启事务
del key
exec 命令,执行事务,
多个事务提交的时候,哪个exec先到达就先执行哪个事务,因为redis是单线程模型。

Redis缓存击穿怎么解决?

缓存击穿就是用户刻意的去查询数据库中没有的数据,这样请求会直接打到DB上,对数据库造成巨大的压力。
解决方案:布隆过滤器
布隆过滤器就是需要知道数据库中有什么,把数据库中的数据映射到bitmap中,存在就用二进制1表示。当请求过来的时候先经过布隆过滤器,只有存在才会让他通过。
因为数据映射的时候可能存在碰撞,所以布隆过滤器存在概率性问题,会有一部分缓存击穿。

缓存和数据库的区别

1 缓存不是全量数据
2 缓存存的是热数据

Redis的key有效期

1 当再次访问设置过期key的时候,有效期会延长吗? 不会
2 写操作的时候会剔除key的过期时间,变成-1
3 定时过期 expireAt key timestamp
4 ttl查看剩余过期时间

Redis怎么淘汰过期的key

1 被动:过期的key不删除,等再次访问的时候删除
2 主动: 轮询(每个10秒一次)
随机取20个key,有百分之25过期,则删除过期的key,然后重复此操作。

Redis淘汰策略

1 noeviction:内存达到阈值,引起申请内存的命令会报错。(默认)
2 allkeys-lru:优先移除最近未使用的key
3 volatile-lru:在设置过期时间的key中,优先移除最近未使用的key
4 allkeys-random:随机移除某个key
5 volatile-random:在设置过期时间的key中,随机移除某个key
6 volatile-ttl:在设置过期时间key中,更早过期的key优先移除

Redis的持久化

RDB:存储的是快照,副本的方式,父进程调用fork产生一个子进程去复制当前时间点的数据,此时父进程在写入不会影响子进程,线程直接隔离。RDB记录的是时间点。
通过save命令生成当前时间点的rdb文件,关机维护的时候调用
bgsave fork出一个子进程
配置文件中: save 900 1 意思是900秒中内有一次修改就进行一次save
缺点: 会缺少数据,不支持拉链,需要定期存储,只有一个rdb文件
优点:类似于java的序列化,恢复速度快

AOF:日志存储,会记录每条命令。
在redis4.0以前,aof重写,会把重复的命令进行优化
在redis4.0以后,aof重写,会将老数据rdb写到aof中,剩下的以增量append到aof中。
aof的写io操作:1 no(交给内核处理)
2 每次命令都存储 always
3 每秒中存储一次(默认)