Reids的数据结构:
数据类型 | 存储的值 | 常见操作 |
---|---|---|
STRING | 字符串、整数、浮点数 | GET,SET |
LIST | 一个链表,每个节点一个字符串 | RPUSH/LPUSH,LRANGE,LINDEX,LPOP/RPOP |
SET | 包含字符串的无序收集器 | SADD,SMEMBERS,SISMEMBER,SREM |
HASH | 无序散列表,并不支持嵌套 | HSET,HGET,HGETALL,HDEL |
ZSET | member和score之间的有序映射,排列顺序由分值决定 | ZADD,ZRANGE,ZRANG,ZREM |
下面介绍每种数据类型的操作: | ||
##STRING操作: | ||
操作 | 参数 | 解释 |
- | - | - |
INCR | key-name | 加一,注意这是原子操作 |
DECR | key-name | 减一,这也是原子操作 |
INCRBY | key-name amount | 加上整数amount |
DECRBY | key-name amount | 减去整数amount |
INCRBYFLOAT | key-name amount | 加上浮点数amount |
其中还有字串和位处理的方法: | ||
操作 | 参数 | 解释 |
- | - | - |
APPEND | key-name value | 将value追加到存储的值的末尾 |
GETRANGE | key-name start | 获取由偏移量[start,end]的字串 |
SETRANGE | key-name offset value | 将offset偏移量开始的字串设定为指定值 |
GETBIT | key-name offset | 返回偏移量为offset的二进制位的值 |
SETBIT | key-name offset value | 将偏移量为offset的二进制位设为value |
BITCOUNT | key-name [start end] | 返回[start end]范围内二进制值为1的数量 |
BITOP | [AND OR XOR NOT] dest-key key-name [key-names …] | 对key-names进行位操作 |
##LIST操作: | ||
操作 | 参数 | 解释 |
- | - | - |
RPUSH | key-name value [value…] | 将一个或多个值推入右端 |
LPUSH | key-name value [value…] | 将一个或多个值推入左端 |
RPOP | key-name | 移除并返回最右端元素 |
LPOP | key-name | 移除并返回最左端元素 |
LINDEX | key-name offset | 返回偏移量为offset的元素 |
LRANGE | key-name start end | 返回[start,end] |
LTRIM | key-name start end | 对列表进行修建,返回[start,end] |
LIST还提供了阻塞式的弹出命令: | ||
操作 | 参数 | 解释 |
- | - | - |
BLPOP | key-name [key-names…] timeout | 弹出最左边的元素,或者阻塞timeout的时间用于等待 |
BRPOP | key-name [key-names…] timeout | 从第一个非空列表中弹出位于最右端的元素,或者等待timeout |
RPOPLPUSH | source-key dest-key | 从source-key弹出最右端的元素,并推入dest-key最左端,并返回这个元素 |
BRPOPLPUSH | source-key dest-key timeout | 从source-key弹出最右端的元素,并推入dest-key最左端,并返回这个元素,如果不存在将等待timeout时间 |
##集合 | ||
操作 | 参数 | 解释 |
- | - | - |
SADD | key-name item [items…] | 将一个或者多个元素加入集合,返回本来不在集合中的元素 |
SREM | key-name item [items…] | 移除一个或者多个元素,并返回被移除元素数量 |
SISMEMBER | key-name item | 检查该元素是否位于集合 |
SMEMBERS | key-name | 返回包含的所有元素 |
SCARD | key-name | 返回该集合数量 |
SRANDMEMBER | key-name [count] | 随机返回count数量的元素,如果count为负数,那么返回的元素可能重复 |
SPOP | key-name | 随机的移除一个元素 |
SMOVE | source-key dest-key item | 如果集合source-key包含元素item,那么从source-key移除该元素,并添加至dest-key |
用于处理多个集合的操作 | ||
操作 | 参数 | 解释 |
- | - | - |
SDIFF | key-name [key-names…] | key-name出现,但key-names未出现的元素 |
SDIFFSTORE | dest-key key-name [key-names…] | 相当于将上面的结果存入dest-key中 |
SINTER | key-name [key-names…] | 返回存在于所有集合中的元素(交集运算) |
SINTERSTORE | dest-key key-name [key-names…] | 将交集的结果存入dest-key中 |
SUNION | key-name [key-names…] | 求并集 |
SUNION | dest-key key-name [key-names…] | 求并集,并将结果存于dest-key中 |
其他常用命令: | ||
##散列 | ||
操作 | 参数 | 解释 |
- | - | - |
HMEGT | key-name key [keys…] | 获取一个或者多个键的值 |
HMSET | key-name key value [key value] | 设置一个或者多对键值 |
HDEL | key-name key [keys…] | 删除散列中多个键值对 |
HLEN | key-name | 返回包含的键值对数量 |
HEXISTS | key-name key | 检查给定键是否存在于散列中 |
HKEYS | key-name | 所有包含的键 |
HVALS | key-name | 所有包含的值 |
HGETALL | key-name | 包含的所有键值对 |
HINCRBY | key-name key increment | 将key存储的值加上increment |
HINCRBYFLOAT | key-name key increment | 将key存储的值加上浮点数increment |
###有序集合 | ||
操作 | 参数 | 解释 |
- | - | - |
ZADD | key-name score member[score member…] | 添加给定分值的成员进入有序集合 |
ZREM | key-name member [members…] | 从有序集合里移除给定成员 |
ZCARD | key-name | 返回有序集合包含的成员数量 |
ZINCRBY | key-name increment member | 在member成员的分值上加上increment |
ZCOUNT | key-name min max | 分值介于min和max的成员数 |
ZRANK | key-name member | 返回成员member在有序集合中的排名 |
ZREVRANK | key-name member | 返回有序集合里成员member的排名,逆序返回 |
ZRANGE | key-name start stop [WITHSCORES] | 返回[start,stop]之间的成员,如果指定了withscore,那么会将成员分支一并返回 |
ZREVRANGE | key-name start stop [WITHSCORES] | 返回有序集合给定排名范围内的成员,逆序返回 |
ZSCORE | key-name member | 返回成员member的分值 |
与Score有关系的获取、删除、并与交 | ||
操作 | 参数 | 解释 |
- | - | - |
ZRANGEBYSCORE | key-name min max [WITHSCORES] [LIMIT offset count] | 返回分值介于min和max之间的所有成员 |
ZREVRANGEBYSCORE | key-name min max [WITHSCORES] [LIMIT offset count] | 返回分值介于min和max之间的所有成员,逆序返回 |
ZREMRANGEBYRANK | key-name start stop | 返回介于start和stop之间的所有成员 |
ZREMRANGEBYSCORE | ke-name min max | 介于min和max之间的所有成员 |
ZINTERSTORE | dest-key key-count key [keys…] [WEIGHTS weight[weight…]] [AGGREGATE SUM|MIN|MAX] | 类似于集合的交集运算 |
ZUNIONSTORE | dest-key key-count key [keys…] [WEIGHTS weight[weight…]] [AGGREGATE SUM|MIN|MAX] | 类似于集合的并集运算 |
###其他常用命令 | ||
命令 | 用例 | 描述 |
- | - | |
EXPIRE | key-name timestamp | 用于设置过期时间 |
SORT | source-key | 排序 |
TTL | key-name | 查看还有多久过期 |
发布与订阅: | ||
命令 | 用例 | 描述 |
- | - | |
SUBSCRIBE | SUBSCRIBE channel [channel…] | 订阅给定的一个或者多个频道 |
UNSUBSCRIBE | UNSUBSCRIBE channel [channel…] | 退订指定频道 |
PUBLISH | PUBLISH channel message | 向给定频道发送消息 |
PSUBSCRIBE | PSUBSCRIBE pattern [pattern…] | 订阅模式匹配的所有频道 |
PUNSUBSCRIBE | PUBSUBSCRIBE pattern [pattern…] | 退订给定模式 |
###主从复制 | ||
通过SLAVEOF host port命令,可以让服务器开始复制一个新的主服务器,他们的过程如下 | ||
步骤 | 主服务器操作 | 从服务器操作 |
- | - | - |
1 | (等待命令进入) | 连接(或者重连接)主服务器,发送SYNC命令 |
2 | 开始执行BGSAVE,并使用缓冲器记录BGSAVE之后执行的所有写命令 | 根据配置选项决定使用现有数据,还是相发送请求的客户端返回错误 |
3 | BGSAVE执行完毕,向服务器发送快照文件,并在发送期间继续使用缓冲区记录被执行的写命令 | 丢弃所有旧数据,开始载入主服务器发来的快照文件 |
4 | 快照文件发送完毕,开始向从服务器发送存储在缓冲区里面的写命令 | 完成对快照文件的解释操作,之后开始接受命令请求 |
5 | 缓冲区的写命令发送完毕,从现在每执行一个写命令,就向服务器发送相同的写命令 | 执行主服务器发送来的所有存储在缓冲区的写命令;从现在开始,接受并执行主服务器传来的每一个写命令 |
需要注意的是Redis不支持主主复制 | ||
当多个从服务器连接主服务器时,如果步骤3尚未执行,那么所有的从服务器都会接收到相同的快照文件和相同的缓冲区写命令,否则将对每一个从服务器进行步骤1-5的连接 | ||
###Redis持久化方式 | ||
两种:快照、只追加文件(AOF) | ||
快照:通过快照可以得到内存里里面的数据在某个时间点上的副本,一般通过BGSAVE命令来创建一个快照 | ||
AOF:AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录发生的变化,主要用于数据恢复,通过appendonly yes配置来打开 | ||
###批量操作 | ||
通过”流水线方式“ | ||
###事务支持 | ||
由MULTI命令和EXEC命令支持,作用是移除竞争条件和提高性能,其中提高性能的原因是通过一次发送所有消息,来减少通信时的网络延迟。其中可以通过使用watch对某个数据结构进行监听,如果发生了改变,就会报错,watch这种方法属于典型的乐观锁 | ||
###分布式锁 | ||
SETNX命令天生就适合用于实现锁的功能,锁所要做的就是将一个随机生成的128位UUID设置为键的值,为了放置程序崩溃之后锁能够被自动释放,应该通过EXPIRE命令对锁设置过期时间。 | ||
###降低内存占用 | ||
降低内存占用有诸多好处,除了存储更多的数据之外还可以: |
- 减少创建快照和加载快照所需要的时间
- 提升载入AOF和重写AOF文件的效率
- 缩短从服务器同步所需要的时间
压缩列表:对于列表来说,就是通过将双向链表的数据结构,转化为一个值表示前一个字符串的长度,一个值表示当前字符串长度,然后还有当前字符串
集合的整数集合编码:该编码有三个前提:1.整数包含的所有成员都可以被解释为十进制整数、2.所有整数都处于有符号整数范围之内、3.集合成员数量小于配置的数量。整数集合降低内存占用的代价就是每一次插入数据都有可能对数据进行移动。