Redis

数据结构 c

  redis    0-15DB  -- key   --value( String  list  set   map  z-set)

  String  

    int/sds   sds.h  sds.c  

    二进制安全   sds   char[]  len  \0标记符  不计入len长度

  list  

    查找不方便 lpush  rpush   lpop rpop

    其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素。         

  redis> RPUSH mylist "one"   
  redis> RPUSH mylist "two"   

  redis> RPUSH mylist "three"   

  redis> LRANGE mylist 0 0    1) "one"   

  redis> LRANGE mylist -3 2   1) "one 2) "two" 3) "three"  

    3.2版本之前 zipList linkedlist
    3.2之后 quicklist 双向链表 有ziplist组成的双向链表
    消息队列
    栈
    生产者消费者模型

  hash(map) 

    key  field -value

    hget   hdel hset  hexists 

    ziplist数据量小

    hash    dict.h   dictEntry   dict  dictht(扩容)

  set  

    sadd    diff 

    intset   hashtable(key ,value(null))

  z-set

    score value 

    zadd  rank 9 baidu  8 google 

    zrange 

    跳跃表    t_zset.c   level  

    排行榜

命令

  http://redisdoc.com/index.html

  keys *   

  exists key

过期时间 

  命令 expire gupao 50  ttl gupao  presist  gupao   

     setnx( key, seconds,value)  

  原理  消极方法  

      积极方法  周期性从设置过期时间的key中选择一部分删除  如果 25%  重复执行

发布订阅

   publish  channel.mic  hello

      subscribe  channel.mic   不支持消息存储 

持久化 

  RDB  快照   fork子进程  dump.rdb 

    规则sava 900 1 或    save 300 10  或  save 60 1000  

    save 阻塞  bgsave 不阻塞  恢复快

  AOF appendonly.aof  日志文件  防止数据丢失

    重写aof文件  同时  重写缓冲数据   ;重写完成之后  重写缓冲 追加到aof 防止数据丢失

    appendfsync  (always)everysec(no)

  rdb 和aof 一起使用

内存回收策略

  allkeys-lru 

  allkeys-random

  volatile-random/lru/ttl   范围:设置过期时间的key

为什么单线程

  多线程 更好的使用cpu资源,计算  其他核心用不到   

  单线程 减少线程切换开销  瓶颈在于内存和网络部分   

  多路复用    非阻塞io  

    同步阻塞

    同步非阻塞

    异步阻塞

    多路复用 文件描述符  select poll epoll

LUA 脚本  原子性   pipeline 管道模型

    批量执行减少网络开销   原子性   复用性

    redis.call('set','gupao','123')

    redis.call('get','gupao')

    eval "return redis.call('get','gupao')"

    eval "return  redis.call('set',KEYS[1],ARGV[1])"   1(key的数量) mic val;

    ./redis-cli --eval hello.lua

主从结构  

  数据同步   一致性

  选主

  配置  从节点  slaveof ip port   bind   防火墙

    info relication

  ping 命令  心跳    无磁盘复制

  内部选举(zab协议)

  外部选举(哨兵)

哨兵(raft算法 leader flower  candicate  epoch  term )

  监控master  salve 是否正常  ,master故障  选举master

  哨兵节点  订阅  master节点 channel

  连接sentiel  set 才能做故障转移

cluster  无中心化架构  

  海量数据   分片  slot16000  最小6台   3主 3从   每个都是master节点    故障转移或者新增节点    从新分片

jedis/redisson

  jedis   jedisSentinelPoll.java  jedis.java  protocal.java  jedisCluster

  jedisLock   

  redission 

  RedissionClient =  Redission.create 

  getLock

  RedissionLock   lua

分布式锁

 

缓存一致性问题  

  更新 数据库   更新 缓存  MQ  或者 补偿机制

缓存雪崩

  时间离散

缓存击穿

  null 

  key值规则 过滤  布隆过滤器  压缩 空间换时间   概率性算法  误差率;

 

posted @ 2020-04-19 18:11  嘤嘤怪  阅读(128)  评论(0编辑  收藏  举报