1.怎么查看当前进程? 怎么执行退出? 怎么查看当前路径?
ps: -axu 显示当前进程的快照
查看Java进程: ps -axu | grep java
查看MySQL进程 ps - axu | grep mysql
执行退出: exit
查看当前路径: pwd
2.复制文件用哪个命令? 如果需要连同文件夹一块复制呢? 如果需要有提示功能呢?
格式为: cp 被复制文件 目标文件
连同文件夹一起复制: cp -r
需要有提示功能 : cp -v
3.删除文件用哪个命令? 如果需要连目录及目录下文件一块删除呢? 删除空文件夹用什么命令?
删除文件:rm
连同目录及目录下文件删除:rm -r
删除空文件夹: rmdir
4.Linux 下命令有哪几种可使用的通配符? 分别代表什么含义?
“?”可替代单个字符。
“*”可替代任意多个字符。
方括号“[charset]”可替代 charset 集中的任何单个字符,如[a-z],[abABC]
5.介绍一下 redis 的 sorted set
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
6.简述 Redis 的持久化
RDB持久化
指在指定的时间间隔内将内存中的数据集快照写入磁盘,(实际操作过程fork一个子进程,快照持久化完全交给子进程处理,父进程继续处理客户端请求。子进程刚产生时,子进程和父进程共享内存里面的代码段和数据段。先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。)
AOF持久化
AOF 持久化记录服务器执行的所有写操作命令(AOF日志存储redis服务器的顺序指令序列,只记录对你存进行修改的指令记录),并在服务器启动时,通过重新执行这些命令来还原数据集。
以日志的形式记录服务器所处理的每一个写删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细操作记录。
Redis 还可以同时使用 AOF 持久化和 RDB 持久化。
重启Redis时,很少用rdb恢复内存状态(会丢失大量数据),通常使用AOF日志重放,但是很慢。所以使用混合持久化:重启时先加载rdb的内容,然后重放增量AOF日志
在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
7.Redis 的哨兵机制
哨兵模式:给集群分配一个站岗的。
哨兵有两个作用
1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
2.当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
哨兵的作用就是对Redis系统的运行情况监控,它是一个独立进程,它的功能:
- 监控主数据库和从数据库是否运行正常;
- 主数据出现故障后自动将从数据库转化为主数据库;
哨兵模式的原理:哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
8.redis cluster 集群原理
redis-cluster架构图:
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测有效时整个集群才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
总之:
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
上文描述的示意图:
9.缓存的穿透、击穿和雪崩问题,是如何解决的?
正常情况下:
缓存雪崩:
指缓存由于某些原因(比如宕机、cache服务挂了或者不响应)整体crash掉了,导致大量请求到达后端数据库,从而导致数据库宕机,造成系统的崩溃。
比较致命的缓存雪崩,是缓存服务器某个节点宕机或断网。
缓存雪崩示意图:
解决缓存雪崩:
1.分析用户的行为,不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀(热门的商品缓存时间久一点,冷门的商品缓存时间短一点)
2.创建多个集群实例防止集群宕机。
3.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。(比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。但是缓存重建期间,会导很多请求阻塞,用户请求等待超时)
缓存穿透:
缓存穿透, 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。请求绕过缓存直接查数据库。
解决缓存穿透:
①如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴
②把空结果,也给缓存起来,这样下次同样的请求就可以直接返回空了,既可以避免当查询的值为空时引起的缓存穿透。
③也可以单独设置个缓存区域存储空值,对要查询的key进行预先校验,然后再放行给后面的正常缓存处理逻辑。(接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截)
缓存击穿:
缓存击穿,是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决缓存击穿:
①使用锁,单机用synchronized,lock等,分布式用分布式锁。
②缓存过期时间不设置(设置热点数据永远不过期),而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存。
10.redis 是单线程执行的,为什么性还高?
Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
10单线程 Redis 为什么性能高?
①Redis 的大部分操作在内存上完成
②采用了高效的数据结构
③采用了多路复用机制使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率
11 有人说Redis只适合用来做缓存,当数据库来用则不合适,你怎么看?
Redis能否做数据库用取决于以下几个条件:
1.数据量: redis是内存数据库,要受限于内存的容量。
2. 数据的结构:是否能够将关系型数据结构都转换成key/value的形式
3. 查询的效率:对范围查询等,是否能转换为高效的hash索引查询
Redis能不能用来当数据库,取决于你想要存储什么数据:
如果你打算存储一些临时数据,数据规模不大,不需要太复杂的查询,但是要求性能比较高,这种情况下是可以当数据库使用的。
能否用来做数据库,要看具体的需求:
1.redis的持久化有问题,如果使用的是aof模式,并且设置的是fsync always方式,那么性能会很低,如果数据结构非常适用于适用redis存储并且对性能要求不高,或者对性能要求很高但允许一定程度的丢失数据,则可以。
2.redis数据都是存储在内存中的,如果内存满了,数据就不会存储到硬盘上了。
redis是一种key/value的内存数据库,项目里基本上都是用来做缓存的,可以对数据设置过期时间,时间到了之后就会被清理掉。