redis
字符串(String)
设置字符串值 set 获取值get
EX 设置过期时间,秒,等同于SETEX key seconds value
PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value
NX 键不存在,才能设置,等同于SETNX key value
XX 键存在时,才能设置
设置多个键的字符串值 mset key value [key value...]
设置多少秒或者毫秒后过期 set key value ex time 或 setex key time value
查找键 keys pattern
pattern取值--------* 任意长度字符,? 任意一个字符,[] 字符集合,表示可以是集合中的任意一个
键是否存在 exists key
键重命名 rename key newkey,renamenx key new key
键删除del key [key....]
返回旧值并设置新值 getset key value(如果键不存在,就创建并赋值)
字符串长度 strlen key
获取value底层存储的数据结构类型 objec encoding key
键类型 type key
追加字符串 append key value(存在就追加,不存在就创建)
获取部分字符串 getranget key start end(负数表示倒数)
覆盖字符串 setrange key offset value
步长的增减(默认为1) incr key ,decr key
散列(hashe)
由field和关联的value组成的map键值对
field和value是字符串类型
设置单个字段 HSET key field value,HSETNX key field value,key的filed不存在的情况下执行,key不存在直接创建
设置多个字段,HMSET key field value [field value ...]
返回字段个数,HLEN key
判断字段是否存在,HEXISTS key field,key或者field不存在,返回0
返回所有的键值对 HGETALL key
返回所有字段名 HKEYS key
返回所有值 HVALS key
在字段对应的值上进行整数的增量计算
HINCRBY key field increment
在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
删除指定的字段
HDEL key field [field ...]
列表(list)
B block 块,阻塞
L left 左
R right 右
X exist 存在
左右或者头尾压入元素
左右或者头尾弹出元素LPOP key,RPOP key
LPUSH key value [value ...],LPUSHX key value
RPUSH key value [value ...],RPUSHX key value
左右或者头尾弹出元素
LPOP key,RPOP key
从一个列表尾部弹出元素压入到另一个列表的头部 RPOPLPUSH source destination
返回列表中指定范围元素 LRANGE key start stop
表示返回所有元素 LRANGE key 0 -1
从列表头部开始删除值等于value的元素count次,LIST 可以重复出现
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
集合(set)
增加一个或多个元素 SADD key member [member ...],如果元素已经存在,则自动忽略
移除一个或者多个元素 SREM key member [member ...],元素不存在,自动忽略
返回集合包含的所有元素 SMEMBERS key,如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用
随机返回集合中指定个数的 SRANDMEMBER key [count]
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 conut>=0
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count < 0 长度为count绝对值,元素可能重复
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素
返回集合中元素的个数 SCARD key
随机从集合中移除并返回这个被移除的元素 SPOP key
把元素从源集合移动到目标集合 SMOVE source destination member
sdiffstore destination key[key...] 将差集结果存储在目标key中
sunion number5 number1 number2 并集
sinter number5 number1 number2 交集
有序集合(sorted set)
类似set集合 有序,去重 元素是字符串类型
每一个元素都关联着一个浮点数分值。并按照分值从小到大的顺序排列集合中的元素,分值可以相同
zadd key socore memer [ socre member ...]增加一个或者多个元素
zrem key member[member...]移除一个或多个元素
zsocore key member 显示分值 【计算机并不能精确表达每一个浮点数,都是一种近似表达】
zincrby key increment member 增加或者减少分值【increment为负数就是减少】
zrank key member 返回元素的排名
zrevrank key member 返回元素的逆序排名
zrange key start stop [withscores] 返回指定索引区间元素默认按照score从小到大
**位图(bitmaps)**
设置某一位上的值setbit key offset value(0/1)
详述两种持久化原理
redis的持久化方式------RDB AOF
RDB
在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中
方式:产生一个RDB:
a. 阻塞方式: 客户端中执行save命令
阻塞Redis服务,创建新的dump.rdb替代旧文件
b. 非阻塞方式:bgsave
不阻塞redis服务正常接收处理客户端请求,fork()一个新的子进程来创建RDB文件,子进程处理完后会向父进程发送一个信号,通知它处理完毕。接到通知后父进程用新的dump.rdb替代旧文件。
AOF
记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库,Append only file,采用追加的方式保存。
AOF写入机制
AOF方式不能保证绝对不丢失数据
目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会直接将内容写入硬盘里面,而是先将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将储存在缓冲区里的内容真正的写入到硬盘里,未写入磁盘之前,数据可能会丢失
写入磁盘的策略
appendfsync选项,这个选项的值可以是always、everysec或者no
always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令数据
everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒钟内的执行的命令数据
no:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的
运行速度:always的速度慢,everysec和no都很快
redis哨兵要解决什么问题?原理是什么?
高可用 Sentinel(哨兵) 官方提供的高可用方案,可以用它管理多个Redis服务实例 编译后产生redis-sentinel程序文件 Redis Sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程
监控 Monitoring Sentinel会不断检查Master和Slaves是否正常 每一个Sentinel可以监控任意多个Master和该Master下的Slaves Sentinel网络 监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息 服务器下线 当一个sentinel认为被监视的服务器已经下线时,它会向网络中的其他Sentinel进行确认,判断该服务器是否真的已经下线