redis

Redis 字符串(String)

常用

  • set/get/del/append/strlen
  • incr/decr/incrby/decrby (一定要数字才可以加减,否则会报错)
  • getrange/setrange
  • setex 设置存活时间(可以使用ttl查看存活时间)/ setnx (set if not exist)
  • mset/mget/msetnx msetnx如果有部分存在,全部不成功
  • getset (先get在set)

Redis 列表(List)

字符串链表

常用

  • lpush/rpush/lrange
  • lpop/rpop
  • lindex,按照索引下标获取元素(从上到下)
  • llen
  • lrem key 删除N个values
  • ltrim 截取出来赋值给另一个key
  • rpoplpush 原列表 目标列表
  • lset key index value 设置list的值
  • linsert key before/after 值1 值2 :在值1的前或后加上值2

总结

list是一个字符串链表,left,right都可以添加;如果键不存在创建新的列表,如果键已存在新增内容,如果键全部移除,对应的键也就消失了,链表操作无论是头还是尾效率都极高,但是如果是中间元素进行操作,效率就很惨淡了。

Redis 集合(Set)

常用

  • sadd/smembers/sismember
  • scard :获取集合里有多少个元素
  • srem key value :删除集合元素
  • srandmember key N:随机出N个整数
  • spop key:随机出栈
  • smove k1 k2 在k1的某个值:将k1里的某个值赋值给k2
  • 数学集合类:
    • 差集:sdiff(在第一个set里面而不在后面任何一个set里的项)
    • 交集:sinter
    • 并集:sunion

Redis 哈希(Hash)

kv模式不变但v是一个键值对

常用

  • hset/hget/hmset/hmget/hgetall/hdel
  • hlen
  • hexists:检查key是否存在在hash里
  • hkeys/hvals:所有key和所有value
  • hincrby/hincrybyfloat:增长
  • hsetnx:不存在key即添加

Redis 有序集合(Zset)

描述

在set基础上,加上一个score值,之前set是k1 v1 k2 v2 ,现在Zset是k1 score v1 score2 v2

常用

  • zadd/zrange
  • zrangebyscore key 开始score 结束 score
    • withscores
    • ( 不包含
    • limit 作用是返回限制,limit开始下标步,多少步
  • zrem key 某score 对应的value值:作用是删除元素
  • zcard/zcount key score 区间/zrank key values 值:获得下标值/zscore key 对应值,获得分数
  • zrevrank key values 值:逆序获得下标值
  • zrevrange
  • zrevrangebyscore key 结束分数 开始分数

Redis 的配置文件

存放在

出厂默认配置在usr/local/redis,conf (拷贝出厂文件)

Units

配置单位,不区分大小写

Includes

类似struts2配置文件,可以通过Includes包含,redis,conf可以作为总阀,包含其他

genernal

  • daemonize:是否后台运行
  • pidfile:指定运行进程文件目录
  • port:指定端口
  • tcp-backlog
  • timeout:0为不设置
  • tcp-keepalive:单位为秒,0表示不会进行keepalive检查
  • loglevel
  • logfile
  • databases

  • syslog-enabled

  • syslog-ident
  • syslog-facility

Snapshotting 快照

  • save 秒钟 写操作次数

    rdb是整个内存的压缩过的Snapshot,rdb的数据结构,可以配置复合的快照触发条件

    1分钟内改了1W次

    5分钟内改了10次

    15分钟内改了1次

    禁用rdb策略的话,不设置任何save指令,给save传一个空串

  • stop-writes-on-bgsave-error

  • rdbcompression:对于存储到磁盘的快照,可以设置是否进行压缩,如果是的话,redis会采用LZF算法进行压缩,如果不想消耗CPU来进行压缩,可以设置此关闭功能

  • rdbchecksum:在存储快照后,还可以让redis使用CRC64算法来进行数据校验,这样会增加大约10%的消耗性能

  • dbfilename

  • dir

Replication复制

Append only mode 追加

  • Appendfsync
    • Always:同步持久化,每次数据变更都会写入磁盘,性能差,但是数据完整
    • EverySec:每秒,默认配置,异步操作,一秒内宕机,数据丢失
    • No
  • No-appendfsync-no-rewrite:重写时是否可以用appendfsync,默认用no,保证数据完整
  • auto-aof-write-percent:设置重写的基准值
  • auto-aof-wirte-min-size:设置重写的最小值

Security安全

设置密码

config set requirepass

Limits 限制

  • maxclients
  • maxmemory

  • maxmemory-policy(设置达到maxmemory的过期策略)

    • volatile-lru:使用lru算法移除key,只对设置了过期时间的键
    • allkeys-lru:使用lru算法移除key
    • volatile-random:在过期集合中随机移除的key,只对设置了过期时间的键
    • allkeys-random:移除随机的key
    • volatile-ttl:移除那些ttl值最小的key,即那些最近要过期的key
    • noeviction:不进行移除,针对写的操作返回错误信息
  • maxmemory-samples

Redis 持久化

rdb(redis databases)

描述

在指定时间间隔内将内存数据集快照写入磁盘,也就是snapshot,在恢复的时候将快照写入内存

fork

redis会先创建一个fork子进程来进行持久化,会将数据先写到一个临时文件,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程主进程是不需要进行IO操作的,保证了极高的性能,如果需要大规模数据的恢复,且对恢复数据不敏感,那么rdb比aop要高效,rdb的缺点是最后一次持久化的数据可能丢失。

如何触发RDB快照

  • 根据默认的配置文件
  • save或bgsave:save只管保存,全部阻塞,bgsave,redis会在后台异步进行快照操作,快照的同时可以接受数据。
  • 执行flushall也会生成,但无意义

如何恢复

将备份文件移到redis的安装目录,启动即可。

优势

适合大规模的数据,对数据完整性和一致性不高

劣势

在一定时间间隔内做一次备份,所以如果redis意外down了,就会丢失最后一次快照后的所有修改,fork的时候内存中的数据会被克隆一份,2倍的数据。

aof(append only file)

描述

以日志的形式记录每个写操作,将redis执行过的所有写指令记录下来,只允许追加文件但不可以写文件,redis启动之初会读取该文件重新构建数据,就是redis重启后根据日志文件的内容,将指令从前到后执行一次完成数据的恢复。

aof保存的是appendonly.aof

启动/恢复/修复

  • 正常恢复:打开AOF配置,设为yes,将aof文件放在redis目录下,重新启动
  • 异常恢复:备份aof文件,使用redis-check-aof –fix 文件修复,重新启动

rewrite

aof采用文件追加的方式,文件会越来越大,新增了重写机制,当aof文件的大小超过所设定的阈值时,redis就会启动aof的内容压缩,只会保留恢复数据的最小指令集,就可以使用命令bgrewriteaof

  • 重写原理:aof文件越来越大时,会fork一条进程来将文件重写(也是先写临时文件在rename),遍历新进程的内存中数据,记录的set语句。重写aof操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,和快照类似
  • 触发机制:redis会记录上一次重写时aof大小,默认配置是当aof文件大小是上一次的一倍,且文件大小大于64M时触发

劣势

  • 相同数据而言aof文件要远大于rdb,恢复速度慢于rdb
  • aof运行效率要慢于rdb,每秒同步策略要较好,不同步效率和rdb相同

Redis 事务

描述

可以一次执行多个命令,本质上是一组命令的集合,一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不允许加塞

常用

  • discard:取消事务,放弃事务块内的命令
  • exec:执行所有事务块内的命令
  • multi:标记一个事务块的开始
  • unwatch:取消对watch命令所有的key的监视
  • watch key……:监视一个或多个key,如果事务在执行之前这个key被其他命令改动,那么事务会被打断

Redis的复制(master/slave)

描述

也就是主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,master写为主,slave读为主

使用

  • 配从不配主

  • 从库配置:slave ip 端口

    每次与master断开连接后哦,需要重新连接

  • 修改配置文件

  • info replication :查看信息

  • 一主二从:如果主机断了,从机依然是从机,主机恢复依然是主机,(从机断了,恢复后变为主机,除非在配置文件中设置)

  • 薪火相传:一台主机,从机1跟主机,从机2跟从机1,这时,从机1依然是从机身份,但拥有从机2

  • 反客为主:slave no one

复制原理

  • slave启动成功后,连接到master后会发送一个sync命令
  • master接收到命令后启动后台的存盘进程,同时收集所有的用于修改的命令,在后台进程执行完毕后,master将整个数据传送给slave完成一次同步。
  • 全量复制:slave服务接收到master的数据后,将其存在内存中
  • 增量复制:master继续更新后,将新增的修改命令依次传给slave,完成同步
  • 只要有一次重连,slave都会完成一次全量复制

哨兵模式(sentinel)

  • 反客为主的自动版本,如果主机故障了,会根据投票数自动将从库升级为主库

  • 在redis目录下,生成sentinel.conf文件

    sentinel monitor 被监控的主机名 ip 端口 1

    最后的1表示,主机挂了后让slave投票谁接替成为主机,得票数多少后成为主机

  • 启动哨兵:redis-sentinel sentinel文件

  • 如果原主机掉了,剩下的从机会决策出一个主机,此后,原主机回来了,会变为新主机的从机

缺点

由于所有的写操作都在master上,然后同步到slave上,所以master到slave有一定延迟,当系统很忙的时候,延迟会更严重,slave的数量也会增加这个问题的严重性