1.五种类型
字符串基本形态:key value key value key value
Hash表基本形态:hash field value field value
List基本形态:key value value value
Set基本形态:key member member member
Sorted set 基本形态: key score member score member score member
1.1字符串String指令
Setex key seconds value | 设置过期时间,秒;若存在,则覆盖 |
Setnx key value | 只有键不存在时,才可以进行操作 |
Psetex key milliseconds value | 设置过期时间,毫秒 |
Getset key value | 将key 的值设为 value,返回键key在被设置之前的旧值。 |
Get key | 返回与键 key 相关联的字符串值。 |
Getset key value | 将key值设为value,返回key的旧值 |
Strlen key | key的字符串的长度 |
Append key value | key如有值,末尾追加;如无,设为其值。返回长度。 |
Setrange key offset value | 使用value替换key中第offset位的值 |
Getrange key start end | 返回key的值的指定部分,start<= 需要的 <=end -1表示最后一位,-2表示倒数第二位 |
Incr key | 为a存储的数字值加1 |
Incrby key increment | 为key存储的数字值加上增量increment |
Incrbyfloat key increment | 为key存储的数字值加上浮点数增量increment |
Decr key | 为key存储的数字值减去1 |
Decrby key decrement | 为key存储的整数值减去decrement |
Mset key value[key value...] | 同时为多个键设置值 |
Msetnx key value [key value...] | 当且仅当所有给定键都不存在时,为所有给定键设置值; 即使只有一个给定键已经存在,也会拒绝所有设置 |
Mget key [key ...] | 返回给定的一个或多个字符串的值。 |
1.2 哈希表Hash指令
Hset hash field value | 将哈希表hash中域field的值设为value |
Hsetnx hash field vaule | 当且仅当域field尚未存在于哈希表的情况下,将其设为value。 |
Hget hash field | 返回给定域的值。 |
Hexists hash field | 检查给定域field是否存在于hash中 |
Hdel hash field [field...] | 删除hash中的一个或多个指定域, |
Hlen hash | 返回哈希表hash中域的数量 |
Hstrlen hash field 3.2.0.以上版本 | 返回hash中,field对应的值的字符串长度 |
Hincrby hash field increment | 为hash中的域field的值加上增量increment 增量可为负数 |
Hincrbyfloat hash field increment | 为hash的域field的值加浮点数增量 |
Hmset hash field value [field value...] | 同时将多个field-value对设置到hash中 |
Hmget hash field [field...] | 返回hash中,一个或多个给定域的值 |
Hkeys hash | 返回hash中的所有域 |
Hvals hash | 返回hash中所有域的值 |
Hgetall hash | 返回hash中,所有的域和值 |
Hscan hash cursor [match pattern] [count count] | 具体信息参考scan cursor [match pattern] [count count] |
1.3 List指令
Lpush key value [value...] | 将一个或多个值value插入到列表key的表头(左) |
Lpushx key value | 将值value插入到列表key的表头, 当且仅当key存在且是一个列表 |
Rpush key value [value...] | 将一个或多个值value插入到列表key的表尾(右) |
Rpushx key value | 将值vaule插入到列表key的表尾, 当且仅当key存在并且是一个列表 |
Lpop key | 移除key的头元素并返回其值 |
Rpop key | 移除key的尾元素并返回其值 |
Rpoplpush source destination | 将source的尾元素取出,作为头元素插入到destination中 |
Lrem key count value | 移除和value相等的值,个数为count的绝对值 Count > 0:从表头向表尾搜索; Count < 0:从表尾向表头搜索; Count = 0:移除所有与value相等的值。 |
Llen key | 返回key的长度 |
Lindex key index | 返回key中下标为index的元素,0第一个; -1最后一个;-2倒数第二个 |
Linsert key before|after pivot value | 将value插入到列表key中的pivot值之前或者之后 |
Lset key index value | 将key中第index个的元素的值设置为value |
Lrange key start stop | 返回列表key中第start个元素到第stop个元素之间的元素,包括这俩 |
Ltrim key start stop | 将key中除start和stop范围之间的元素都删除,范围内的保留 |
Blpop key [key...] timeout | 阻塞。依次查找各个key,取出并返回第一个不为空的key的头元素,返回结果为相对的key名称和头元素值。如果一直找不到,则等待。等待时间为timeout。 |
Brpop key [key...] timeout | 同blpop,区别在于此指令查找和返回的是尾元素 |
Brpoplpush source destination timeout | rpoplpush的阻塞版本 |
1.4 Set 集合指令
Sadd key member [member...] | 将各个member的值加入到集合key中,不允许重复值 |
Sismember key member | 判断member元素是否是key集合的成员,是返回1,否则0 |
Spop key | 移除并返回集合中的一个随机元素 |
Srandmember key [count] | 如果只有key参数:返回集合key中的一个随机元素 如有count参数: Count > 0:返回含count个元素的数组,元素不同 Count < 0: 返回count绝对数个元素的数组,元素可能相同 |
Srem key member [member...] | 移除key中的一个或多个member元素 |
Smove source destination member | 将source中的元素member取出并存储到destination中 |
Scard key | 返回集合key的基数,即集合中元素的数量 |
Smembers key | 返回集合key中的全部成员 |
Sscan key cursor [match pattern] [count count] | 详细信息参考scan cursor [match pattern] [count count] |
Sinter key [key...] | 返回几个集合的交集的元素列表,即几个集合中都有的元素 |
Sinterstore destination key [key...] | 将几个集合的交集保存至destination集合中,返回元素数量 |
Sunion key [key...] | 返回几个集合的并集的元素列表,即这些集合的所有元素 |
Sunionstore destination key [key...] | 将几个集合的并集保存至destination集合中,返回元素数量 |
Sdiff key [key...] | 返回第一个key与其他key所形成的差集的所有元素 |
Sdiffstore destination key [key...] | 求差集并将结果存储至destination中 |
1.5 Sorted set有序集合指令
Zadd key score member [[score member] [score member]] | 将一个或多个member元素及其score加入到有序集key中,返回为成功添加的数量,不包括已存在的(哪怕被更新) |
Zscore key member | 返回key中,member的score值 |
Zincrby key increment member | 为key中的member的score加上increment |
Zcard key | 返回key的基数,即member的个数 |
Zcount key min max | 返回key中,score值在min 和max之间的member数量 |
Zrange key start stop [withscores] | 返回key中start和stop之间的成员,返回值按分数从小到大排序;如有with scores,同时返回分数 |
Zrevrange key start stop [withscores] | 同zrange,区别在于本命令按scores从大到小 |
Zrangebyscore key min max [withscores] [limit offset count] | 返回key中score介于min和max的成员,按score从小到大排列。Withscores表示是否显示score值。Limit 部分表示将符合条件的成员以下标0为开始,重新排下标值。然后将这些成员从第offset位开始,选择count 个成员,返回之。 |
Zrevrangebyscore key max min [withscores] [limit offset count] | 同zrangebyscore,区别在于按score从大到小排列。 |
Zrank key member | 返回member在key中的排名,按score从小到大排序,排名以0为首位。 |
Zrevrank key member | 同zrank,区别在于按score从大到小排序 |
Zrem key member [member...] | 移除key中一个或多个member |
Zremrangebyrank key start stop | 将member按照score从小到大排序,移除序号在start和stop之间的member。 |
Zremrangebyscore key min max | 移除key中所有score值介于min和max之间的member |
Zrangebylex key min max [limit offset count] | 通过member的字符进行排序,选择出字符在min和max之间的成员。Min和max是从a到z的字符,长度可根据需要指定。比如member中有一个为: 10 zhang ; 如果需要包含该member,可以设计为max是zzzzz。且字符前要有[ 或者(,[表示包括min或max,(表示不包括。 Limit部分表示,从选择得到的member中,选择从offset位开始的count个member,并返回。 |
Zlexcount key min max | 返回member名字在min和max范围内的member的个数 |
Zremrangebylex key min max | 移除key中成员名介于min和max之间的member |
Zscan key cursor [match pattern] [count count] | 详细信息参考 zscan key cursor [match pattern] [count count] |
Zunionstore destination numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max] | 将numkeys个key一起做并集,即囊括所有成员,并将其结果保存至destination中。对于member名字相同的成员,将其score相加,得到保存的新的score。 Weights可以指定两个key一起合并各自的比重是多少。比如 1:2的话就是第一个key的score*,第二个key的score*2;再进行union。默认是1比1。 Aggregate指多个key之间按什么方式聚合,默认是score值相加,还可以设置为选择最小值,或者选择最大值。 |
Zinterstore destination numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max] | 同zunionstore,无别在于该命令为交集。 |
2. Redis过期策略和内存淘汰机制
Redis采用的是定期删除+惰性删除策略 。
由于定时删除需要定时器来负责监视key,占用太多的CPU资源,所以不采用定时删除。
定期删除:redis默认每100ms检查是否有过期的key,有过期则删除。该检查并不是全部检查,而是随机抽查。
惰性删除:在使用或者获取某个key时,redis去检查之,如果已经到达过期时间却未删除,则先删除。即薛定谔的猫式。当你没有使用这个key时,你永远不知道它是过期以删除还是过期未删除。
3. 实现Redis高可用机制的一些方法
3.1 redis主从复制
主从复制的作用:数据备份、读写分离、分布式集群、实现高可用、宕机容错机制等。
一个master,多个slave。
Master可读可写,主要处理写操作。当发生写操作时,自动将数据同步到slave。
Slave只能处理读操作。
将master数据同步到slave时,可以分为两种:全量同步和增量同步。全量同步将master上的所有数据都复制一份到slave。增量同步是master每执行一个写命令就会向slave进行相应的备份。
3.2 Redis持久化机制
Redis持久化是将内存数据保存到硬盘,redis持久化存储分为AOF和RDB两种模式,默认RDB。
·RDB
在某个时间点将数据写入一个临时文件dump.rdb。持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复,采用二进制文件形式存储。RDB使用单独子进程进行持久化,主进程不进行IO操作,保证redis高性能。但其缺点是持久化之间会间隔一段时间,如果中间发生故障,会发生数据丢失。所以这种方式适合数据要求不严谨的时候。
·AOF
将操作+数据以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入)才进行实际的数据变更。“日志文件”保存了历史所有的操作过程,当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠。AOF可以保持更高的数据完整性,由追加file的时间决定。如果日志写入不完整,支持redis-chenk-aof来进行日志修复。aof文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令。其缺点是AOF比RDB文件大,且回复速度慢。
在架构良好的环境中,master通常使用AOF,slave使用RDB。具体的选择可以根据网络情况和业务情况。
3.3 哨兵(sentinel)机制
哨兵用于管理多个redis服务器,主要执行以下任务:
·监控:哨兵会不停检查master和slave是否工作正常;
·提醒:当被监控的redis出现问题时,哨兵可以通过api向管理员或其它应用程序发送通知。
·自动故障迁移:当master不能正常工作时,哨兵将失效master的某个slave升级为新的master,并更改相关配置。
一个架构中运行多个哨兵,这些进程使用流言协议来接收master是否下线的消息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个slave作为新的master。单个哨兵认为master宕机,认为是主观宕机sdown,如果多个哨兵认为master宕机,则认为是客观宕机,odown。然后使用投票算法,选择新的master并进行配置。
3.4 Keepalived
自动重启
是一种实现IP漂移的方法,基于VRRP(虚拟路由冗余协议)来实现LVS服务高可用方案。
对于master和slave,如果master宕机,备份服务器会接管虚拟IP,当作master。此时,keepalived将宕机服务器从集群中剔除,随后若keepalived检测到服务器正常工作后,会自动将服务器加入集群。
Keepalived主要是检查服务器状态。
关于过期部分和高可用部分参考了以下内容: