1.为什么要用Redis
Redis 基于内存,可持久化的key-value数据库,它支持的存储类型相对较多,包括string,list, set,zset, hash类型。
优势在于:
速度快,性能极高,可持久化,丰富的数据类型,支持数据的备份
Redis 是单线程
2.为什么说Redis快
1. 完全基于内存,数据存在内存中。
2.专门的数据结构设计。
3.采用单线程,避免了不必要的上下文切换和竞争条件。
4.IO多路复用。
3. Redis 5种数据类型的底层实现。
1. 简单的动态字符串SDS和C语言自带的字符串有什么不同
SDS保存了字符串的长度
避免了缓冲区溢出
减少了修改字符串内存的重新分配
二进制安全
部分兼容C字符串的函数
redis字典的底层实现hashTable的相关问题
(1) 解决冲突: 连地址法,与java的hashmap一样
(2) 扩容:
渐进式ReHash:
当数据量特别大时,进行一次reHash操作会使得Redis一段时间内不能进行其他操作,所以再渐进式rehash期间,字典的删除查找跟新操作可能会在两个Hash表上进行。
压缩链表
zset底层跳表原理( 为什么不用红黑树)
跳表的本质是多级链表,并有序
(1) Hash表只能做单个key的查找,不适用于范围查找
(2) 跳表的范围查找比红黑树更快
4.Redis中过期策略和缓存淘汰机制
1.策略分为定期删除+懒惰性删除
2.redis内存淘汰机制
当内存不足以容纳新写入的数据时,新写入操作会错误。
当内存不足以容纳新写入的数据时,移除最近最少使用的key
5. Redis中持久化机制
Redis 的持久化有两种机制,一种是RDB,也就是快照。快照就是一次全量的备份,会把所有Redis的内存数据进行二进制的序列化存储到硬盘(Redis 会Fork一个子进程, 快照的持久化就交给子进程去处理,而父进程继续处理线上业务的请求)
另一种是AOF日志,AOF日志记录的是数据操作修改的指令记录日志
Redis 4.0之后,引入了新的持久化模式,混合持久化
6. Redis集群的主从复制
1. 采用完整重同步和部分重同步两种模式
(1)完整同步用于处理初次复制情况
(2)部分重同步用于处理断线后重复制的情况。
7. 缓存雪崩和缓存穿透问题
1. 缓存雪崩
缓存同一时间大面积失效,后面的请求都会落到数据库上,造成数据库短时间内承授大量的请求而崩掉。
解决办法:
缓存数据的过期时间设置为随机
设置热点数据永远不过期。
2. 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,发起id为-1或id为特别大的请求。
从缓存取不到数据,从数据库中也没有取到,这是可以将key-value设置为key-null,缓存有效时间设置段一些
常见的Linux命令
tail -n 5 xxx: 显示最后5行
tail -n +1000 xxx 从1000行开始,显示1000行以后的
tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
以上命令常被用来查日志使用。
用sed命令查看中间几行
sed -n '5,10p' filename 查看文件的5到10行
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
top 命令:动态显示总的cpu和内存的使用请求,以及每个进程cpu和内存的重用率。
ps:查看当前运行的进程。
netstat: 观察端口的占用,加上grep过滤端口
netstat -apn | grep 8080
df: 查看硬盘使用情况。
du: 查看当前指定文件或目录占用磁盘空间的大小。
lsof: 查看一个进程打开了哪些文件。