1. redis 的5种结构
结构类型 | 结构存储的值 | 结构的读写能力 |
STRING | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作 |
LIST | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素 |
SET | 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二、各不相同的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对; 获取所有键值对 |
ZSET(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
注:集合(SET)内元素不可重复, 列表内元素可以重复
散列的键值对不可重复
有序集合的成员不可重复
2. redis命令
类别 | 命令 | 行为 |
字符串命令 | GET |
获取存储在给定键中的值 |
SET | 设置存储在给定键中的值 | |
DEL | 删除存储在给定键中的值(这个命令可以用于所有类型) | |
INCR | INCR key-name------将键存储的值加上1 | |
INCRBY | INCRBY key-name-------将键存储的值减去1 | |
DECRBY | DECRBY key-name amount------将键存储的值减去整数amount | |
INCRBYFLOAT | INCRBYFLOAT key-name amount------将键存储的值加上浮点数amount, 这个命令在Redis 2.6或以上的版本可用 | |
列表命令 | LRANGE | LRANGE key-name start end-----获取列表在给定范围上的所有值 |
LPUSH(RPUSH) | LPUSH key-name value [value...]将给定值推入列表的左端(右端) | |
LINDEX | LINDEX key-name offset ---- 获取列表在给定位置上的的那个元素 | |
LPOP(RPOP) | LPOP key-name------从列表的左端(右端)弹出一个值,并返回被弹出的值(被弹出的远处将不在列表中) | |
LTRIM | LTRIM key-name start end 对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会被保留 | |
集合命令 | SADD | sadd key item [item...] 将给定元素添加到集合 |
SMEMBERS | smembers 返回集合包含的所有元素 | |
SISMEMBER | sismember key-name item ----- 检查给定元素是否存在于集合中 | |
SREM | srem key-name item [item ....] -----如果给定的元素存在于集合中,那么移除这个元素 | |
SCARD | scard key-name 返回集合包含元素的数量 | |
SRANDMEMBER | SRANDMEMBERkeyname[count]——从集合里面随机地返回一个或多个元素。当count为正数时,命令返回的随机元素不会重复;当count为负数时,命令返回的随机元素可能会出现重复 | |
SPOP | spop key-name ----- 随机地移除集合中的一个元素,并返回被移除的元素 | |
SMOVE | smove source-key dest-key item------如果集合sourcekey包含元素item,那么从集合sourcekey里面移除元素item,并将元素item添加到集合destkey中;如果item被成功移除,那么命令返回1,否则返回0 | |
SDIFF | SDIFF key-name[key-name...]——返回那些存在于第一个集合、但不存在于其他集合中的元素(数学上的差集运算 | |
SDIFFSTORE | SDIFFSTORE dest-key key-name[key-name...]——将那些存在于第一个集合但并不存在于其他集合中的元素(数学上的差集运算)存储到destkey键里面 | |
SINER | siner key-name [key-name]-----返回哪些同时存在于所有集合中的元素(数学上的交集运算) | |
SINTERSTORS | SINTERSTORE dest-key key-name[key-name...]——将那些同时存在于所有集合的元素(数学上的交集运算)存储到dest-key键里面 | |
SUNION | SUNIONkeyname[keyname...]——返回那些至少存在于一个集合中的元素(数学上的并集计算) | |
SUNIONSTORE | SUNIONSTOREdestkeykeyname[keyname...]——将那些至少存在于一个集合中的元素(数学上的并集计算)存储到destkey键里面 | |
散列命令 | HSET | 在散列里面关联起给定的键值对 |
HGET | 获取指定散列键的值 | |
HGETALL | 获取散列包含的所有键值对 | |
HDEL | 如果给定键存在于散列里面,那么移除这个键 | |
HLEN | hlen key-name-----返回散列包含的键值对数量 | |
HMGET | HMGET key-name key [key...]——从散列里面获取一个或多个键的值 | |
HMSET | HMSET key-name key [key...]-----HMGET key-name key[key...]——从散列里面获取一个或多个键的值 | |
HEXISTS | HEXISTS key-name key——检查给定键是否存在于散列中 | |
HKEYS | hkeys key-name----获取散列包含的所有键 | |
HVALS | hvals key-name-----获取散列包含的所有值 | |
HINCRBY | hincrby key-name key increment----将键key存储的值加上整数increment | |
HINCRBYFLOAT | hincrbyfloat key-name key increment-----将键key存储的值加上浮点数increment | |
有序集合 | ZADD | zadd key-name score member [score member...] 将一个带有给定分值得成员添加到有序集合里面 |
ZRANGE | zrange key-name start stop [withscores ]根据元素在有序排列中所处的位置,从有序集合里面获取多个元素 | |
ZRANGEBYSCORE | ZRANGEkeynamestartstop[WITHSCORES]——返回有序集合中排名介于start和stop之间的成员,如果给定了可选的WITHSCORES选项,那么命令会将成员的分值也一并返回 | |
ZREM | zrem key-name member[member...] 如果给定成员存在于有序集合,那么移除这个元素 | |
ZCARD | ZCARD key-name----返回有序集合包含的成员数量 | |
zincrby | zincrbu key-name increment member-----将member成员的分值加上increment | |
zcount | zcount key-name min max------返回分值介于min和max之间的成员数量 | |
zrank | zrank key-name member-----返回成员member在有序集合中的排名 | |
zscore | zscore key-name member-----返回成员member的分值 | |
ZREVRANK | ZREVRANK key-name member----返回有序集合里成员member的排名,成员按照分值从小到大排列 | |
ZREVRANGE | ZREVRANGE key-name start stop [WITHSCORES]——返回有序集合给定排名范围内的成员,成员按照分值从大到小排列 | |
ZRANGEBYSCORE | ZRANGEBYSCORE key min max[WITHSCORES][LIMIToffsetcount]——返回有序集合中,分值介于min和max之间的所有成员 | |
ZREVRANGEBYSCORE | ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIToffsetcount]——获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回它们 | |
ZREMRANGEBYRANK | ZREMRANGEBYRAN Kkey-name start stop——移除有序集合中排名介于start和stop之间的所有成员 | |
ZREMRANGEBYSCORE | ZREMRANGEBYSCORE key-name min max——移除有序集合中分值介于min和max之间的所有成员 | |
ZINTERSTORE | ZINTERSTORE dest-key key-count key[key...] [WEIGHTS weigh t[weight...]][AGGREGATESUM|MIN|MAX]——对给定的有序集合执行类似于集合的交集运算(使用的是默认的聚合函数sum) | |
ZUNIONSTORE | ZUNIONSTORE dest-key key-count key[key...][WEIGHTS weight[weight...]][AGGREGATE SUM|MIN|MAX]——对给定的有序集合执行类似于集合的并集运算(使用的是min函数) | |
通用 | SORT | SORT source-key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern...]][ASC|DESC] [ALPHA] [STORE dest-key]——根据给定的选项,对输入列表、集合或者有序集合进行排序,然后返回或者存储排序的结果 |
事务 | MULTI和EXEC | |
WATCH | 对键进行监视,如果在用户执行exec命令的时间内,有其他客户端抢先对被监视的键进行了替换、更新或删除等操作,那么用户尝试执行exec命令时会失败并返回错误 | |
UWATCH | unwatch命令可以在watch命令执行之后,multi命令执行之前对连接进行重置 | |
discard | ||
处理过期时间 | PERSIST | PERSIST key-name-----移除键的过期时间 |
TTL | TTL key-name-----查看给定键距离过期还有多少秒 | |
EXPIRE | EXPIRE key-name seconds-----让给定键在指定的秒数之后过期 | |
EXPIREAT | EXPITEAT key-name timestamp-----将给定键的过期时间设置为给定的UNIX时间戳 | |
PTTL | PTTL key-name-----查看给定键距离过期时间还有多少毫秒 | |
PEXPIRE | PEXPIRE key-name milliseconds----让给定键在指定的毫秒数之后过期,这个命令在Redis 2.6或以上版本可用 | |
PEXPIREAT | PEXPIRE key-name timestamp-milliseconds----将一个毫秒级精度的UNIX时间戳设置为给定键的过期时间 |
2.2 扩展
3. 启动redis 命令
服务端:redis-server
客户端:redis-cli
4.redis发布和订阅
命令 | 用例和描述 |
SUBSCRIBE | SUBSCRIBE channel [channel ...]----订阅给定的一个或多个频道 |
UNSUBSCRIBE | UNSUBSCRIBE [channel [channel ...]] ----退订给定的一个或多个频道, 如果执行时没有给定任何频道,那么退订所有频道 |
PUBLISH | PUBLISH channel message----向给定频道发送信息 |
PSUBSCRIBE | PSUBSCRIBE pattern [pattren ...]-----订阅与给定模式相匹配的所有频道 |
PUNSUBSCRIBE | PUNSUBSCRIBE [pattern [pattren ...]]-----退订给定的模式,如果执行时没有给定任何模式,那么退订所有模式 |
5. 快照持久化
命令 | 用例和描述 |
SAVE | 创建一个快照(同步)在快照创建完毕前,不再响应任何其他命令 |
BGSAVE | 创建快照(异步), 调用fock创建一个子进程,然后子进程负者将快照写入硬盘, 父进程继续处理命令请求 |
5.1. 个人开发
5.2. 对日志进行聚合计算
6. AOF持久化
AOF持久化通过appendonly yes配置选项来打开
6.1 appendfsync选项及同步频率
选项 | 同步频率 |
always | 每个Redis写命令都要同步写入硬盘. 这样做会严重降低Redis的速度 |
everysec | 每秒执行一次同步,显示地将多个写命令同步到硬盘 |
no | 让操作系统来决定应该何时进行同步 |
7. 复制
8. 事务
redis 事务是通过MULTI为开始,以EXEC为结束。
9. 分布式锁
9.1 乐观锁:
在其他客户端对数据修改,则告诉执行锁的客户端数据被修改了,但不或阻止其他客户端对数据的修改
9.2 细粒度锁
10. 哨兵机制
10.1 多个哨兵可以提高读的性能
10.2 数据分区
10.2.1 数据分区,redis-集群配置步骤
- 配置文件redis-{port}.conf
文件内容
port 6379
logfile 6379.log
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-6379.conf
- 启动节点 :redis-server redis-6379.conf
- 节点握手 cluster meet 127.0.0.1 6380
- 分配槽 cluster addslots 1 2 3
- 主从复制 cluster replicate <masterid>
10.2.2 ruby创建集群
redis-trib.rb create --replocas 1 127.0.0.1:6379 127.0.0.1:6380 ......
11. 降低内存占用
11.1 短结构
11.1.1 压缩列表
rpoplpush
11.2 分片式散片
CRC32进行分片
11.3 打包存储二进制位和字节
12.redis 扩展
12.1 扩展读性能
1. 主从复制树
2. ssh隧道进行加密压缩
11.2 扩展写性能和内存容量
12.3 扩展搜索查询量
slave-read-only 控制redis是否为只读服务器
摘抄自《redis实战》