redis基本命令

  • redis数据类型

    支持5种数据类型:string(字符串)、hash(哈希)、list(集合)、set(集合)、zset(有序集合)

  • string的基本操作命令

    #设置值
    SET key "sometext" #设置key
    MSET key value [key value ...] # 批量设置多个key的值
    SETEX key secconds value # 设置一个key,并设置过期时间(单位秒seconds),相当与:SET mykey value EXPIRE mykey seconds 
    PSETEX key secconds value # 设置一个key,并设置过期时间(单位毫秒milliseconds)
    SETNX key value #当key不存在的时候才会设置成功返回1,否则返回0
    MSETNX key value [key value ...]#批量setnx,有一个key存在则所有操作失败
    
    #获取值
    GET key #获取某个key的值
    MGET key [key ...] #批量获取多个key的值返回list
    GETSET key value #返回旧值,设置为新值
    
    #数字操作
    INCR key #数字型的key自增1
    INCRBY key 10 # 数字型的key增加制定的值(如10),可以是负数(就是减)
    INCRBYFLOAT key 10.2 #数字型的key增加一个浮点数(10.2),可以是负数(就是减)
    DECR key #数字型的key自减1
    DECRBY key value # 数字型的key自减自定值
    
    #字符串
    SETRANGE key offset value #字符串offset(包括offset位置)位置之后的值替换为value的值
    GETRANGE key 0 -1 #获取制定范围的字符,-1表示后面的全部
    STRLEN key #获取key值的长度
    APPEND key value #在制定key后面追加字符串,key不存在会新建
    
    # 位操作
    BITCOUNT key [start end] #获取key制定位置范围bit数
    BITOP AND destkey srckey1 srckey2... # 支持AND(与)、OR(或)、XOR(异或)、NOT(取反)。将srckey1和srckey2...操作的结果放入destkey
    BITPOS key bit [start] [end] #在指定范围查找给定的bit(0,1)位置,没有找到返回 -1
    GETBIT key offset #获取key指定offset的bit值
    SETBIT key offset value #设置key制定offset的bit value
    
  • hash基本操作命令
    # 设置值
    HSET key field value #设置hash中的field的value,如果hash不存在那么会新建
    HMSET key field value [field value ...] #批量 HSET
    HSETNX key field value #设置hash中的field的value,如果hash不存在那么会新建,field存在会失败返回0
    # 获取值
    HGET key field #获取hash中某个field值
    HMGET key field [field ...] #批量HGET
    HGETALL key #获取hash中所有field和value
    HSCAN key cursor #遍历hash ,从cursor=0开始
    # 数字加减
    HINCRBY key field increment #给hash中某个数字型field增加整数值
    HINCRBYFLOAT key field increment #给hash中某个数字型field增加浮点数值
    # key操作
    HKEYS key #返回hash中所有field 名称
    HVALS key #返回hash中所有value值
    HLEN key #返回hash中field的个数
    HSTRLEN key field #返回hash field 的value的length
    HEXISTS key field #判断hash中的某个field是否存在
    HDEL key field [field ...] #删除hash中的field,支持批量
    
  • list基本操作
    LPUSH key value [value ...] #left push 加入新元素到最左边
    LPUSHX key value # 相当于LPUSH,如果列表不存在则返回0,不进行任何操作
    RPUSH key value [value ...]# 从列表的右边增加元素
    RPUSHX key value #相当有RPUSH ,如果列表不存在则返回0,不进行任何操作
    LPOP key # 移除列表左边地一个元素 
    RPOP key # 移除列表右边一个元素 
    LRANGE key start stop # 取start到stop的值 
    LINDEX key index #获取队列特定index的值
    LINSERT key BEFORE|AFTER pivot value #在里面中插入
    LLEN key # 列表长度
    LREM key count value # 在列表中删除指定个数的value,count > 0 从前到后, count < 0 从后到前, count = 0 删除所有等于value的值
    LSET key index value # 设置指定index的value ,index为负,从后到前,最后一个-1
    LTRIM key start stop # 删除 start 到 stop 的值 
    RPOPLPUSH source destination # 从source右边移除 添加到destination的左边
    
    #堵塞API
    BLPOP key [key ...] timeout # LPOP的时候没有值会堵塞,直到timeout时间
    BRPOP key [key ...] timeout # RPOP的时候没有值会堵塞,直到timeout时间
    BRPOPLPUSH source destination timeout # BRPOPLPUSH source没有值会堵塞,直到timeout时间
    
  • set基本操作命令
    SADD key member [member ...] #在集合中添加元素
    SCARD key #集合中元素个数
    SDIFF key [key ...] # 前一个集合减去后一个集合(在前一个集合中不在后一个集合中的元素)
    SMEMBERS key #返回集合中的所有元素 
    SISMEMBER key #判断元素是否在集合中,返回 1或者0 
    SPOP key #随机返回集合中的一个元素
    SMOVE source destination member #把member元素从source集合移到destination集合
    SREM key member [member ...] #删除集合中的元素
    SSCAN #遍历set ,从cursor=0开始
    SINTER key [key ...]#set取交集
    SMEMBERS key #返回set中所有元素
    SRANDMEMBER key [count] #集合中随机返回count个元素
    SUNION key [key ...] #集合中取并集
    SREM key member [member ...]#删除集合元素
    SDIFFSTORE destination key [key ...]#集合的差集存入新set destination 中
    SINTERSTORE destination key [key ...]#集合的交集存入新set destination 中
    SUNIONSTORE destination key [key ...]#集合的并集存入新set destination 中
    
  • zset基本操作命令
    ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 
    # NX :  只新增,member已经存在不会更新
    # XX : 只更新,member不存在不会新增
    # CH : 返回更新和新增的影响条数之和,不加只返回新增的影响条数
    # INCR score member  #member增加score,只支持一个member操作
    ZCARD key #返回集合中元素个数
    ZCOUNT key min max #score在min和max之间的元素
    ZINCRBY key increment member #member增加score
    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] # 集合交集,见ZINTERSTORE 
    ZLEXCOUNT key min max #分值在两个成员之间的元素数量 [包括 (不包括 - 负无穷 + 正无穷
    ZRANGE key start stop [WITHSCORES] #返回start stop之间的集合,参数withscores 同时返回score
    ZRANGEBYLEX key min max [LIMIT offset count] #分值在两个成员之间的元素 [包括 (不包括 - 负无穷 + 正无穷,LIMIT 类似于MYSQL的分页LIMIT
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] #显示分值在min到max的元素 (1:不包括1 [1 包括1
    ZRANK key member #返回元素分值排名
    ZREM key member [member ...] #删除元素
    ZREMRANGEBYLEX 
    ZREMRANGEBYRANK
    ZREMRANGEBYSCORE
    ZREVRANGE
    ZREVRANGEBYLEX
    ZREVRANGEBYSCORE
    ZREVRANK
    ZSCAN key cursor [MATCH pattern] [COUNT count] #set遍历
    ZSCORE key member #获取成员分值 
    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] #集合并集操作存放到destination numkeys 操作的keys数量 
    # WEIGHTS 权重 每个集合中的元素 乘以 权重,默认为1
    # AGGREGATE 集合score方法 SUM 相加 MIN 取最小的,MAX 取最大的
    #同一个member最终score算法: (SUM|MIN|MAX) (score1 * weight ,score2*weight)
    
    

  • 通用基本操作命令

    EXISTS key #判断key是否存在
    DEL key #删除key
    EXPIRE key seconds #多少秒后过期
    EXPIREAT key timestamp #在一个时间点过期
    KEYS pattern #搜索key * 返回所有key
    TTL key #返回key的生存时间,单位秒
    PTTL key #返回key的生产时间,单位毫秒
    RENAME key newkey#key重命名,key不存在会报错,如果newkey已经存在那么,newkey原来的数据会丢失
    RENAMENX key newkey#key重命名,key不存在会报错,如果newkey已经存在那么不会成功
    TYPE key#返回key的数据类型
    

系统重构的10点经验总结

  1. 重构确定并聚焦目标
  2. 重构要有可量化的指标
  3. 重构要有更好的质量
  4. 重构之前要和业务方沟通
  5. 重构应该用迭代的方式
  6. 重构要清晰的了解旧系统
  7. 重构要提前规划系统切换方案
  8. 重构高度重视系统数据
  9. 重构要采用成熟的技术选型
  10. 重构更加关注重视团队成员

设计模式概述

设计原则:

  • 开闭原则OCP(Open Close Principle)

    扩展开放,修改关闭

  • 氏代换原则LSP(Liskov Substitution Principle)

    任何基类可以出现的地方,子类一定可以出现。子类当父类用个性被抹杀,直接使用子类,违背了面向接口编程,缺乏替代关系

  • 依赖倒转原则DIP(Dependence Inversion Principle)

    针对接口编程,依赖于抽象而不依赖于具体。避免个性子类

  • 接口隔离原则(Interface Segregation Principle)

    使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思。完全满足接口隔离原则,在部分使用场景下接口会增多。用户会实现多个自己关心的接口,增加用户使用陈本.

  • 迪米特法则(最少知道原则)(Demeter Principle)

    一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

  • 合成复用原则(Composite Reuse Principle)

    原则是尽量使用合成/聚合的方式,而不是使用继承。

设计模式:

  • 创建型(5)

    简单工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。

    • 简单工厂模式:
      工厂中的具体方法隐藏了所有实现细节

      • 普通工厂(传参数,没一个参数决定一个产品)
      • 多工厂方法(不用传参数,每个方法决定一个产品)
      • 静态工厂方法(工厂的实现方式,不用new工厂,通过工厂的静态方法创建对象)
    • 抽象工厂模式(Abstract Factory)

    工厂方法模式不满足开闭原则,抽象工厂通过增加工厂类的方法来支持开闭原则,产品族和工厂族是对等的

    之所以叫抽象工厂模式是相对于工厂方法模式的。因为该模式中对工厂进行了抽象,抽象出了和产品层级对等的工厂层级.而简单工厂模式中工厂是具体的,包含了所有实现细节

    • 单例模式

    单例对象能保证在一个JVM中,该对象只有一个实例存在

    • 饿汉式
    • 懒汉式
    • 建造者模式

    工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。

    • 原型模式(Prototype)
    • 浅复制(浅克隆shallow clone ):将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

    • 深复制(深克隆deep clone):将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。深度clone对象必须实现序列化接口 Serializable

      实现方式: 通过把对象序列化到内存,然后再读出来

      public Object deepClone() throws IOException, ClassNotFoundException {  
      
          /* 写入当前对象的二进制流 */  
          ByteArrayOutputStream bos = new ByteArrayOutputStream();  
          ObjectOutputStream oos = new ObjectOutputStream(bos);  
          oos.writeObject(this);  
      
          /* 读出二进制流产生的新对象 */  
          ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
          ObjectInputStream ois = new ObjectInputStream(bis);  
          return ois.readObject();  
      }  
      

  • 结构型模式(7)

    适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

    • 适配器模式

    在开闭原则的基础上,不修改原有代码的同时,提供满足接口需求的功能组件。

    • 类适配器

      当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

      编写适满足调用需求的适配器类,适配器类继承原类获得原类功能,适配器把被适配的接口转换成目标接口。

    • 对象适配器

      当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

      编写满足调用需求的适配器类,组合原有对象, 把原类的功能转换成目标接口接口: 目标类只想实现一个接口中的部分抽象方法。构造抽象类,抽象类实现接口中的所有方法,之所以使用抽象类,这样可以阻止对该适配器的实例化,目标类就可以继承该适配器,重写想重写的方法。

    • 接口适配器

      当不希望实现一个接口中所有的抽象方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

      个人理解:接口适配器不符合接口隔离原则,出现某个类只想实现接口中的部分接口的情况,是接口提供的太大,接口没有很好的隔离造成的。

    • 装饰器模式

    动态的为某个类增加功能,还能撤销. 装饰类和被装饰类实现相同的接口

    装饰器模式的应用场景:

    1. 需要扩展一个类的功能。
    2. 动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删)。

      缺点:产生过多相似的对象,不易排错!

    • 代理模式

    从结构上和装饰模式差不多,但是关注点不一样。装饰模式关注的是增加新功能,而代理模式关注的是对原有接口功能的控制(结果的控制)。具体的实现方法和 装饰模式差不多。

    代理模式的应用场景:

    如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

    1. 修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
    2. 就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

    使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

    • 外观模式(Facade),也称门面模式

    门面模式遵循 迪米特法则,用门面对象隐藏细小对象和复杂对象。简化客户端调用,减少客户端依赖。

    • 桥接模式
    • 组合模式

    • 享元模式

  • 行为行(11)

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    • 策略模式
    • 模板方法模式

    • 观察者模式

    • 迭代子模式

    • 责任链模式

    • 命令模式

    命令的发送者和实现者解耦

    • 备忘录模式

    把原始对象的状态记录并存储起来,原始对象状态改变以后,可以在某个时候恢复。

    • 状态模式

    当对象的状态改变时,同时改变其行为

    • 访问者模式

    • 中介者模式

    • 解释器模式

ubuntu terminal 基本操作

  • 补全 tab,按一次补全,按2次显示所以相关提示
  • 行内光标移动

    ctrl+a #当前行开始位置(最左边)ahead
    ctrl+e #当前行末尾位置(最右边)end
    ctrl+b #光标向后(左)移动一个位置 back
    ctrl+f #光标向前(右)移动一个位置 front
    

    记忆:a、e 、b、f,从左到右 ahead :最前面 end:最后面 back:回退一个位置 front:前进一个位置

  • 行内字符删除

    • 删除单个字符
      ctrl+d #删除当前字符 delete
      
    • 删除多个字符
      ctrl+u #删除光标至行首位置字符
      ctrl+k #删除光标至行尾位置字符
      

      记忆:u、k 字符删除指令,从左到右u在k的前面,所以u删除最左边的字符,k删除最右边字符

    • 删除单词

      ctrl+w #删除光标左边的单词 word
      
  • 粘贴
    ctrl+shift+v #系统剪切板到terminal
    ctrl+y #粘贴由ctrl+u,ctrl+k,ctrl+w删除的单词
    
  • 清屏
    ctrl+l
    
  • 命令搜索
    up #方向键上:上一条命令
    down #方向键下:下一条命令
    ctrl+p #上一条命令 previous
    ctrl+n #下一条命令 next
    ctrl+r #搜索前面输入的所以命令,不用不停的使用上下来查找曾经输入过的命令
    
  • 滚动屏幕
    shift+up #逐行向上滚动屏幕
    shift+down #逐行向下滚动屏幕
    shift+PgUp #向上翻页滚动
    shift+PgDn #向下翻页滚动
    
  • 关闭终端
    ctrl+d #关闭终端 shutdown
    
  • 终止
    ctrl+c #终止 close
    
  • 新开终端
    ctrl+shif+n # new 
    
  • 全屏
     ctrl+shift+f #仅限于konsole
    

软件人生必备定律

  • 墨菲定律

    “墨菲定律”是一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的。
    主要内容:

    一、任何事都没有表面看起来那么简单。

    二、所有的事都会比你预计的时间长。

    三、会出错的事总会出错。

    四、如果你担心某种情况发生,那么它就更有可能发生。

  • 康威定律

    简单来说,系统设计(产品结构)等同组织形式,每个设计系统的组织,其产生的设计等同于组织之间的沟通结构

    一、系统架构是公司组织架构的反应。

    二、应该按照业务闭环进行系统拆分/组织架构划分,实现闭环/高内聚/低耦合,减少沟通成本。

    三、如果沟通出现问题,那么就应该考虑进行系统和组织架构的调整。

    四、在合适的时间进行系统拆分,不要一开始就把系统/服务拆得非常细,虽然闭环,但是每个人维护的系统多,维护成本高。

  • 二八定律

    二八定律又名80/20定律,是20世纪初意大利统计学家、经济学家维尔弗雷多·帕累托提出的,他指出:在任何特定群体中,重要的因子通常只占少数,而不重要的因子则占多数,因此只要能控制具有重要性的少数因子即能控制全局。这个原理经过多年的演化,已变成当今管理学界所熟知的二八法则——即80%的公司利润来自20%的重要客户,其余20%的利润则来自80%的普通客户。

Linux(ubuntu)基本信息查看

  • 查看版本
    • cat /proc/version
    root@husiwei:~# cat /proc/version
    Linux version 4.4.0-85-generic (buildd@lcy01-30) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #108-Ubuntu SMP Mon Jul 3 17:24:35 UTC 2017
    
    • uname -a
    root@husiwei:~# uname -a
    Linux husiwei 4.4.0-85-generic #108-Ubuntu SMP Mon Jul 3 17:24:35 UTC 2017 i686 i686 i686 GNU/Linux
    

    显示i686说明是32位操作系统,显示 x86_64说明是64位操作系统。

    • cat /etc/issue
    root@husiwei:~# cat /etc/issue
    Ubuntu 16.04.2 LTS \n \l
    
  • 查看32位还是64位
    • getconf LONG_BIT
    root@husiwei:~# getconf LONG_BIT
    32
    
  • 查看内存
    • grep MemTotal /proc/meminfo
    root@husiwei:~# grep MemTotal /proc/meminfo
    MemTotal:        4138848 kB
    
    • free -m |grep "Mem" | awk '{print $2}'
    root@husiwei:~# free -m |grep "Mem" | awk '{print $2}'
    4041
    
  • 查看cpu数量以及类型 grep "model name" /proc/cpuinfo
    root@husiwei:~# grep "model name"   /proc/cpuinfo
    model name    : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz
    model name    : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz
    
  • 查看硬盘 df -h
    root@husiwei:~# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            2.0G     0  2.0G   0% /dev
    tmpfs           405M  2.7M  402M   1% /run
    /dev/vda1        40G  2.6G   35G   7% /
    tmpfs           2.0G     0  2.0G   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
    tmpfs           405M     0  405M   0% /run/user/0
    
  • 查看系统状态 top
    root@husiwei:~# top
    top - 09:02:06 up 3 days,  9:27,  1 user,  load average: 0.00, 0.00, 0.00
    Tasks: 105 total,   1 running, 103 sleeping,   1 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  4138848 total,  3319988 free,   238976 used,   579884 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  3483184 avail Mem 
    
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                            
    728 ntp       20   0   16056   4248   3872 S   0.3  0.1   0:11.46 ntpd                                                                               
    791 root      20   0  191628  17220  12948 S   0.3  0.4   8:24.80 xxxxx           ...                                                               
    
  • 查看网关 cat /etc/resolv.conf
    root@husiwei:~# cat /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    options timeout:1 attempts:1 rotate single-request-reopen
    nameserver 100.100.12.137
    nameserver 100.100.12.128
    
  • 查看时区 date -R
    root@husiwei:~# date -R
    Sat, 16 Sep 2017 09:08:06 +0800
    

    +0800 中国北京时间