我的一些笔记,人生感悟、读后感、开箱评测等

0%

知识片段收录

1、redis能否代替etcd或者zookeeper

源自https://www.v2ex.com/t/520367 #3 @xkeyideal

简单从以下几个方面说一下redis为啥在微服务中不能取代 etcd:

  1. redis 没有版本的概念,历史版本数据在大规模微服务中非常有必要,对于状态回滚和故障排查,甚至定锅都很重要
  2. redis 的注册和发现目前只能通过 pub 和 sub 来实现,这两个命令完全不能满足生产环境的要求,具体原因可以 gg 或看源码实现
  3. etcd 在 2.+版本时,watch 到数据官方文档均建议再 get 一次,因为会存在数据延迟,3.+版本不再需要,可想 redis 的 pub 和 sub 能否达到此种低延迟的要求
  4. 楼主看到的微服务架构应该都是将 etcd 直接暴露给 client 和 server 的,etcd 的性能摆在那,能够承受多少的 c/s 直连呢,更好的做法应该是对 etcd 做一层保护,当然这种做法会损失一些功能
  5. redis 和 etcd 的集群实现方案是不一致的,etcd 采用的是 raft 协议,一主多从,只能写主,底层采用 boltdb 作为 k/v 存储,直接落盘
  6. redis 的持久化方案有 aof 和 rdb,这两种方案在宕机的时候都或多或少的会丢失数据

总结,redis从来没有想过抢 etcd 在服务注册和发现的饭碗,目前的架构来说也抢不动,在缓存方面目前在性能和功能也无出其右; etcd 只关注在服务注册与发现方面,非要当做 k/v 存储来用(丢弃 watch 特性而言)也可以用,性能也不错,但只能说你选错对象了

微服务架构中选择哪种技术,取决于技术决定人的规划理想,非要说 redis 不行当然也是错的,不考虑服务规模和性能需求,用 mongodb 也能搞,mongodb 3.6+版本也有个 oplog watch 的功能

2、redis的使用场景

摘自https://github.com/CyC2018/CS-Notes.git redis一栏

  1. 计数器:int自增自建
  2. 缓存:设置内存最大使用量和淘汰策略
  3. 查找表:DNS记录
  4. 消息队列:最好还是使用RabbitMQ或者Kafka
  5. 会话缓存:分布式session
  6. 分布式锁实现:SETNX或者RedLock
  7. 其它:set的交集并集操作实现共同好友,排行榜

3、redis的持久化

redis是具有持久化功能的,但是并不完全可靠,两种持久化方法:RDBAOF

  1. RDB持久化:

    将某个时间点的所有数据放到硬盘上,若数据大,时间很长,所以必须关闭该redis服务器,否则部分同步开始后的数据不会备份

  2. AOF持久化:

    将写命令添加到 AOF 文件(Append Only File)的末尾。

    使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项:

    选项 同步频率
    always 每个写命令都同步
    everysec 每秒同步一次
    no 让操作系统来决定何时同步
    • always 选项会严重减低服务器的性能;

    • everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;

    • no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。

随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。

4、redis的淘汰策略

可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。

Reids 具体有 6 种淘汰策略:

策略 描述
volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random 从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru 从所有数据集中挑选最近最少使用的数据淘汰
allkeys-random 从所有数据集中任意选择数据进行淘汰
noeviction 禁止驱逐数据

作为内存数据库,出于对性能和内存消耗的考虑,Redis 的淘汰算法实际实现上并非针对所有 key,而是抽样一小部分并且从中选出被淘汰的 key。

使用 Redis 缓存数据时,为了提高缓存命中率,需要保证缓存数据都是热点数据。可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。

Redis 4.0 引入了 volatile-lfu 和 allkeys-lfu 淘汰策略,LFU 策略通过统计访问频率,将访问频率最少的键值对淘汰。

5、ipv4和ipv6

ipv6的好处:

  1. 一个设备一个公网 IP,不需要穿透,同城毫秒级响应,PT 使用范围 /速度增加
  2. 可以接入教育网

坏处:

  1. 一个设备一个公网 IP(喝茶)
  2. 目前很多网站 ipv6 是单通,而且默认情况下 ipv6 优先级高,所以目前很多情况下启用 ipv6 对网络体验是负优化
  3. ipv6 路由震荡得厉害,尤其出国,今天美国绕日本,明天日本绕德国,对网络体验还是负优化

6、软链接和硬链接

主要是inode的一些特点和区别,inode会记录除了文件名以外所有的文件信息,包括引用数、权限、组、用户、大小等

1、软链接:ln -s source_file des_file;硬链接:ln source_file des_file
2、两者不管修改什么文件,都是全部修改,但是软/硬链接删除目标文件不影响源文件,删除源文件的话,软的会无效
3、inode中的引用数:硬链接两个文件都会+1,软链接不会;或者说硬链接两个维护一个inode,软链接维护两个inode
4、硬链接不能面向目录
5、硬链接不能分区,软链接可以,使用案例为将日志或者别的大文件软链接到别的硬盘上

7、mysql 为什么不推荐三张表以上的关联?

好处:减少网络io

坏处:

1、不论是几个表,什么 sql,先 show index 看看索引怎么建的,再 explain 分析一波索引命中情况怎样

2、如果条件限制宽泛的话,三张表关联产生的笛卡儿积非常庞大,缓存机制什么的可能扛不住啊,得用 explain 来分析一下了

3、耦合高

4、数据一多,服务器直接GG

打赏一杯咖啡