java随笔

93 阅读4分钟

随笔集

1.redis集群
   客户端分片,redis3.0开始支持redis-cluster集群来配置,每个节点保存数据和几点的状态
   每个节点和其他节点都是相连的,保证高可用,客户端与集群中的任一节点相连,集群中内置了
   1600多个哈希草,所有的节点映射后进行维护
   
2.redis事务
    redis是支持事物的,但是不支持回滚,事务开始multi,结束采用exei
    
3.缓存雪崩,穿透和击穿
    雪崩:缓存大面积失效导致数据库查询压力增大,缓存预热,不同key设置不同过期时间,定期
    更新缓存
    穿透:缓存和数据库都没有相关数据,参数校验,查询空结果集也进行缓存
    击穿:缓存没有,数据库有  设置热点数据不过期,设置互斥锁来避免同一个key多次更新缓存
    
4.分布式事务
    xa理论,及开启二段提交
    事务协调者发起准备指令给参与者,参与者各自执行本地事务单不提交,然后发送ok指令给协调
    者,收到全部ok后发起commit指令,各自提交事务并返回确认给协调者,只要有一处异常就全部
    各自回滚,三段提交是在第一阶段前确保能正常连接数据库,表面由于连接异常导致的长时间阻
    塞
    
    大部分场景下不是很需要确保强一致性而是达到最终一致性即可,如果经典的锁券和扣库存操作
    可以采用先生成不可见订单,然后同步调用锁券和扣库存操作,如果发生异常就针对异常异步发
    送废单消息到mq,可以失败重试,其他系统在接收消息后各自判断是否进行回券和回库存,成功
    则订单变为可见
    
  5.优化查询
      a.关键字段建立索引,索引字段为not null
      b.管连查询代替子查询
      c.减少表关联,去除多余字段
      d.读写分离,加入缓存,主从同步
      e.分库分表
      尽量用全职索引,
      最左前缀:查询从索引的最左前列开始并且不跳过索引中的列;
      索 引列上不操作,范围之后全失效; 
      不等空值还有 OR,索引影响要注意;
      like 以通配符%开 头索引失效会变成全表扫描的操作,字符串不加单引号索引失效
      
   4.更新缓存的时候的一些操作
      互斥锁:使用setnx来获取写入缓存的锁,为true表示当前没有线程进行构建,false则表示
      当前有线程在构建,进行阻塞
      热点数据不过期:在value中设置过期时间,当前时间如果大于设置时间则获取就缓存,并使
      佣另外线程更新缓存并重新设置过期时间
      
   5.redis数据结构的常用操作
       
       hash:存储对象,可以直接获取对象的属性值 hset person name kex
       list:lrang 来获取某个闭区间的元素,redis高性能分页
               lpush rpop来做简单的队列操作(先进先出)
       set:无序不重复,可以用来全局去重 sadd
                       求交集 sinter
                       求并集 sunion
                       求差集 sdiff
       zset:排序的set,依据写入的分数进行排序
       
    6.redis过期策略
        
           
    采用定期删除策略+惰性删除策略
    定期删除策略:每个100ms随机抽取20key,删除其中过期的key,如果超过了1/4则重复之前的步骤
    惰性删除策略:redis 4.0 引入了 lazyfree 的机制 ,再删除较大的对象的时候采用异步的形式,将操作
    放到后台线程中执行,避免单线程的卡顿 unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存

    内存淘汰策略:redis.conf中的maxmemory和maxmemory-policy设置 ,常用的有
    allkeys-lru 超出后从所有的key中删除最少使用的key
    volatile-lru 超出后从设置了过期时间的key中移除最少使用的key