Redis面试题
1. Redis是单线程还是多线程 ?为什么这么设计 ?
2. 默认是数据库是什么 ? 有几个数据库 ?有什么数据类型 ?怎么启动 ?
3. 介绍一下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的数据类型包括String、List、Set、Hash、Zset、Geospatial、Hyperloglog、Bitmap
Redis单条命令保证原子性,事务不保证原子性,Redis事务的本质是一组命令的集合。没有隔离级别的
概念,所有的命令在事务中并没有被直接执行,只有发起执行命令(Exec)的时候才会执行。
开启事务:multi
执行事务:exec
在事务中编译时异常(命令错误),事务报错无法执行;在事务中语句异常