Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis
- Redis是单线程还是多线程 ?为什么这么设计 ?
Redis一开始是纯单线程模型,在4.0之后引入了多线程,具体实现是通过多线程方式在后台删除对象、通过 Redis 模块实现的阻塞命令等。在6.0之后又在网络 IO 处理方面上也引入了多线程。
一开始使用单线程的原因是 Redis 是基于内存而且使用多路复用技术,单线程速度很快,又保证了多线程的特点。因为没有必要使用多线程。后面引入多线程的原因是读写网络的read/write系统调用在Redis执行期间占用了大部分CPU时间,如果把网络读写做成多线程的方式对性能会有很大提升,所以变成了多线程。
之前用单线程是因为基于内存速度快,而且多路复用有多路复用的作用,现在引入多线程是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。
单线程指的是工作线程 多线程说的是IO。
- 默认是数据库是什么 ? 有几个数据库 ?有什么数据类型 ?怎么启动 ?
默认是0号数据库,一共有16个数据库。
数据类型包括:
String
List
Set (查看双方共同的信息,比如共同关注的人)
Hash (储存经常变动的用户信息)
Zset (数据排序)
加分的数据类型:
Geospatial (附近的人,二者的距离)
Hyperloglog (统计排除重复的总数)
Bitmap (储存0/1,打卡统计)
启动:
redis-server redis.conf
进入客户端:
redis-cli -p 端口(默认6379)
- 介绍一下Redis( 顺带提一下Redis有没有原子性 )?
Redis的数据类型包括String、List、Set、Hash、Zset、Geospatial、Hyperloglog、Bitmap
Redis单条命令保证原子性,事务不保证原子性,Redis事务的本质是一组命令的集合。没有隔离级别的概念,所有的命令在事务中并没有被直接执行,只有发起执行命令(Exec)的时候才会执行。
开启事务:multi
执行事务:exec
在事务中编译时异常(命令错误),事务报错无法执行;在事务中语句异常
- Redis有没有乐观锁/悲观锁 ?怎么解决乐观锁的冲突 ?
乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁! 更新数据的时候去判断一下,在此期间是否有人修改过这个数据,更新的时候比较 version来判断。
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁,性能低下。
在值上加上watch开启乐观锁,先unwatch然后重新watch解决锁
- 说一下Redis持久化 ,优缺点分别是什么 ?
Redis持久化包括RDB和AOF,RDB是 Redis database的缩写,它会在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,选择RDB。
RDB的触发机制是 满足配置文件的save的规则、执行 flushall、flushdb 命令、退出redis。
优点:
1、适合大规模的数据恢复!
2、对数据的完整性要不高!
缺点:
1、需要一定的时间间隔进程操作!如果redis意外宕机了,这个最后一次修改数据就没有的了!
2、fork进程的时候,会占用一定的内容空间。
3.如果没有满足save保存规则,数据就不会被保存,该情况下会造成数据丢失问题。
AOF是以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件
但不可以