技术分享之redis高级讲义

前言:

    有段时间没做技术分享了,这次抽时间给大家分享下redis的高级技巧。  记得两年前在公司做过一场redis的源码实现及设计。 这次想继续这个话题,讲下redis集群的具体实现。 但周边人对这个不敢兴趣,毕竟大家是开发人员,反而对redis应用层的使用更敢兴趣。 


    我个人接触redis很久了,熟悉我博客的朋友知道,我基本每隔一段时间就会写有关redis的话题。 到现在为止,源码虽然粗略的看过,但也仅限于数据结构及server部分。redis cluster的实现有些复杂,代码看不进去,用同事的话来说,不敢触碰…   这次分享我会尽量把自己的redis使用经验和一些实际的场景分享出来。

分享的pdf 我扔到github了,下载地址:  https://github.com/rfyiamcool/share_ppt 

https://github.com/rfyiamcool/share_ppt/blob/master/redis_advance.pdf


下面是pdf的几个截图:



内容摘要:

 Redis高级讲义 峰云就她了
xiaorui.cc github.com/rfyiamcool
 key的规范
加入业务的前缀 长度控制在30个字符以内 一级key不要超过千万 同样ziplist类型的hash比strings省内存
    
 Value的规范
选择合适的数据结构
长字符压缩存取 (snappy, msgpack, more...) 避免big key ( 删除和迁移时阻塞)
避免hot key (单点性能)
    
 优化慢请求
避免使用O(n)的指令 (keys *, hgetall, smembers, sunion ...)
使用scan, hscan, sscan, zscan 业务层规避这类设计
   
 提高吞吐
使用pipeline批量传输, 减少网络RTT 使用多值指令 (mset, hmset) 使用script lua
干掉aof ?
    
 (big key) or (hot key)
big key
scan / small range get
del > unlink (redis 4.0 async del) hash shard
hot key
hash shard
      
 不推荐使用命令
pub sub
redis transction more ...
   
 redis lua
减少RTT消耗 保证多指令原子性 自定义指令
   
 lua 场景
zset的zpop semphore分布式锁 自增id生成器
   
 redis module
注册新指令 性能比redis lua更强劲 redis 4.0 以上
   
 1w 的稳定长连接 9w TPS
队列千万级别 百万数量key
   
经历过的性能指标
      
 单机进化到多实例
什么是多实例
为什么要多实例化
多实例化需要注意什么?
     
     
 what 多实例
6379 6380 6381 ++
redis1 redis2 redis3 more
            
 最大程度的使用内存 避免单实例RDB时
被kernel oom 使用swap造成阻塞.
单实例启动太慢
扩展, 迁移, 内存随便整理
why 多实例
      
 copy on write will block 绕开redis单工作线程的问题
阻塞指令
busy event hashcrc more ...
      
 How 多实例 128G 总内存.
11G 为一个实例, 启动个10实例. 空出18G做缓冲.
后台脚本来触发bgsave. 启动时也是一个个的启动
     
 vip多线程版 twemproxy codis
redis cluster
  
简约集群
     
 codis vs redis cluster cluster
      y
中心化
client move order
y
y
hash_tag
design
pipeline
slot
多租户 性能
code
范围
high
复杂 广
codis
y 去中心化 支持
y
y
this < cluster 简单 也有不少大厂
        
 redis cluster
 
 codis-proxy
codis-proxy
codis
      zookeeper
   redis-m
主机组
redis
 redis-s
 redis 使用的高级场景 定时器
去重优先级fifo队列 分布式锁
More ...
    
 定时器
zset (score = timestamp, value=task)
sadd zpop
       Feeds
任务去重 comsumer
    Feeds
lua zpop func
comsumer
   
 token bucket
zset (score = timestamp, value=token)
     sadd
allow burst
zpop
comsumer
    Feeds
comsumer
   
 req rate limiter
   client
True
diff_ts := now - ts if diff_ts > period {
return wait }
return pass
prefix period ts prefix counter ts
       client
False
 
 伪ack队列
zset (score = timestamp, value=task)
  4. ack
  pop, ack by lua !!!
1. push
producter
3. add in zset
list
        2. pop
comsumer comsumer
  
 去重优先级的FIFO队列 set ( 作为去重特性 )
queue_1 queue_2 queue_3
redis lua 封装增删改查
         
 安全可靠
say no
可重入锁
say yes
公平调度
say hard
分布式锁
lua make ( compare and set ) !!!
set + nx + ex
client_1 true Redis
{ bll_lock_key: ident }
           client_2
set + nx + ex false
 排查问题
redis-cli monitor
内部
keyspace slow log
外部
     
 内存碎片
- - bigkeys
string, bytes空间
set, list, zset, hash, 元素个数 rdb tool
具体占用空间
      
 监控
info -> instantaneous_ops_per_sec info -> used_memory_human /proc/{pid}/smaps connected_clients
    
 项目分享
https://github.com/rfyiamcool/go_redis_semaphore https://github.com/rfyiamcool/zset_zpop https://github.com/rfyiamcool/redis_unique_queue https://github.com/rfyiamcool/redis_modules_ackqueue https://github.com/rfyiamcool/go_redis_lock https://github.com/rfyiamcool/kvdis
      
 other ext
redis 多线程方案 去除cow机制的rdb,进化binlog模式 redis rocksdb的持久化方案
more ...
    
 “ 别说话 ! ” –峰云就她了


END.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc