Redis是啥
redis: Remote Dictionary Service远程字典服务
Redis的端口为什么是6379?
这个端口号也不 是随机选的,而是由手机键盘字母MERZ的位置决定的。MERZ在 Antirez(Redis的作者)的朋友圈语言中是《愚蠢》的代名词,它源于意大利 广告女郎Alessia Merz在电视节目上说了一 堆愚蠢的话.
Redis的过期清理?
redis使用hashtable存储数据的过期时间,但不会时刻去检测数据是否过期,清理过期数据主要分两个阶段完成,第一是在定时器(serverCron)去定时清理过期数据(每隔100毫秒),另一个阶段是在用户获取数据的时候去执行(get, hget)
Redis的内存不够如何处理?
- 使用VM虚拟内存
- 为什么操作系统已经实现了虚拟内存的功能,redis还要重复造轮子: 操作系统的虚拟内存是基于页的概念,linux中每个页大小为4K, redis中大多数的对象远小于,而且redis中的list,set可能存在与多个页
- 使用内存淘汰
- 随机淘汰
- LRU淘汰算法: 删除一个最近最少访问的key
- TTL淘汰算法: 删除一个最快过期的key
Redis的命令冲突
- get与del命令冲突: 当客户端获取一个比较大的key时(无法通过一个网络IO传输完毕), 这时候另一个客户端执行del命令删除这个key,可能会导致内存段错误
解决方法: 使用引用计数器,当有客户端或其他引用的时候,计数器加一,引用失效的时候减一.当计数器为零的时候就删除这个
Redis为什么是单线程
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)。
Redis的主从同步原理
- slave服务器连接到master,发送SYCN请求同步数据
- master将数据备份到rdb文件,然后传输到slave服务器
- slave服务器先清空数据库,然后再把rdb文件数据导入
- 之后master服务器每次数据更新会通过命令形式转发到slave,slave去执行
如何设置主从同步: slave服务器配置文件中新增 slaveoff127.0.0.2 6379