Redis从入门到高可用,分布式实践
2018-06-07 本文已影响31人
銭兎孑
第一章
编译安装:
wget http://dowmload.redis.io/releases/redis-3.0.7.tar.gz 下载redis包
tar -xvf redis-3.0.7.tar.gz 解压
cd redis-3.0.7
make && make install 编译安装
|- /usr/local/bin 下生成可执行文件
启动方式1
redis-server 默认启动 (在6379端口 会走默认配置文件 不推荐)
启动方式2
redis-server --port 6380 动态启动 ( 指定redis 在某个端口启动 -- port 指定端口 不推荐)
启动方式3
redis-server /usr/local/bin/redis.conf (启动redis 并指定配置文件 推荐 配置项见附录1)
第二章
Redis API的使用和理解
type 的返回值
- string 字符串
- hash 哈希
- list 列表
- set 集合
- zset 有序集合
- none (key不存在)
附录1
redis配置项
daemonize yes/no 是否以守护进程方式启动 推荐yes 默认为no
port
6379 指定redis在哪个端口启动
dir /usr/local/var/db/redis/ redis工作目录
附录2
redis命令时间复杂度
命令 时间复杂度
通用部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
del | O(1) | del key | del hello | 删除key |
keys | O(n) | keys key | keys * | 不建议在生产环境使用 |
mget | O(n) | mget key | mget hello | 批量获取key |
mset | O(n) | mset key value | mset hello word | 批量设置key |
dbsize | O(1) | dbsize | dbsize | 计算数据库大小 |
exists | O(1) | exists key | exists hello | 判断key是否存在 |
expire | O(1) | exists key | exists hello | 设置key的过期时间 |
type | O(1) | type key | type hello | 查看数据类型 |
ttl | O(1) | ttl key | ttl hello | 查看数据过期时间 |
persist | O(1) | persist key | persist hello | 取消数据过期时间 |
字符串部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
get | O(1) | get key | get hello | 获取值 |
set | O(1) | set key value | set hello word | 存储值 |
incr | O(1) | incr key | incr hello | key自增1,如果key不存在,自增后返回get(key) = 1 |
decr | O(1) | decr key | decr hello | key自减1,如果key不存在,自减后返回get(key) = -1 |
incrby | O(1) | incrby key increment | incrby hello 10 | key 自增指定数值,如果key不存在,自增后返回get(key) = k |
decrby | O(1) | decrby key decrement | decrby hello 10 | key自减1,如果key不存在,自减后返回get(key) = k |
setnx | O(1) | setnx helo value | setnx hello1 def | key 不存在设置 |
set key value xx | O(1) | set key valye xx | set hello wordabc xx | 可以存在才会设置 |
getset | O(1) | getset key newValue | getset hello newword | set key newvalue 并返回旧的value |
append | O(1) | append key appendValue | append hello 123321 | 将value追加到旧的value(返回value长度) |
strlen | O(1) | strlen key | strlen hello | 返回字符串长度(注意中文) |
incrbyfloat | O(1) | incrbyfloat key increment | incrbyfloat hello 1.23 | 增加key对应的值 |
getrange key start end | O(1) | getrange key start end | getrange hello 1 2 | 获取字符串指定下标的所有值 |
setranget key num val | O(1) | setrange key number newValue | setrange hello 1 ab | 给指定的下标设置一个新的值 |
哈希部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
hget | O(1) | hget key field | hget hello word | 获取 hash key对应的filed的value |
hset | O(1) | hset key field value | hset hello word abc | 设置 hash key对应的filed的value |
hdel | O(1) | hdel key field | hdel hello php | 删除 hash key对应的filed的value |
hexists | O(1) | hexists key field | hexists hello php | 判断 hash filed 是否存在 |
hlen | O(1) | hlen key | hlen hello | 返回hash key filed 数量 |
hmget | O(n) | hmget key field [field ...] | hmget hello php java python | 批量获取 hash key的一批filed定义的值 |
hmset | O(n) | hmset key field value [field value ...] | hmset hello php 1 java 2 python 3 | 批量设置 hash key的一批filed定义的值 |
hincrby | O(n) | hincrby key field increment | hincrby hello newphp 1 | hash key 自增指定数值,如果 hash key不存在,自增后返回hget(hash key) = k |
hgetall | O(n) | hgetall key | hgetall hello | 返回hash key对应的所有filed 和value |
hvals | O(n) | hvals key | hvals hello | 返回hash key 对用的所有filed的value |
hkeys | O(n) | hkeys key | hkeys hello | 返回hset 对应的所有filed |
hsetnx | O(1) | hsetnx key field newValue | hsetnx hello php1 123321 | 设置hash key 对应的filed的value(如果值不存在则成功) |
列表部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
rpush | O(1~n) | rpush key value | rpush hello word | 从列表右端插入值(1~N个) |
lpush | O(1~n) | lpush key value | lpush hello word | 从列表左端插入值(1~N个) |
linsert | O(n) | linsert key befor/after value newValue | linsert mylist before word xxx linsert mylist after word xxx | 在list指定的值前 / 后插入newValue |
lpop | O(1) | lpop key | lpop mylist | 从列表左边弹出一个元素 |
rpop | O(1) | rpop key | rpop mylist | 从列表右边弹出一个元素 |
lrem | O(n) | lrem key count value | lrem mylist 1 word lrem mylist -1 word lrem mylist 0 word |
从列表左边删除一个元素 根据count的值,从列表中删除所有value相等的值 (1) count > 0 , 从左向右,删除最多count个value相等的项 (2) count < 0 , 从右向左,删除最多Math().abc(count)个value相等的项 (3) count = 0 , 删除所有value相等的项 |
ltrim | O(n) | ltrim mylist 0 1 | ltrim key start end | 按照索引范围修减列表 |
lrange | O(n) | lrange key start end (包含end) | lrange mylist 0 1 | 获取列表指定索引范围所有item |
lindex | O(N) | lindex key index | lindex mylist 2 | 返回列表 key 中,下标为元素下标 |
llen | O(1) | llen key | llen mylist | 获取列表长度 |
lset | O(n) | lset key index value | lset hello 1 xxx | 设置列表索引值为newValue 对头元素或尾元素进行操作,复杂度为 O(1)。其他情况下,为 O(N), N 为列表的长度。 |
blpop | O(1) | blpop key timeout | blpop mylist 1 | lpop阻塞版本,timeout 是阻塞超时时间,timeout=0为永不阻塞 |
brpop | O(1) | brpop key timeout | brpop mylist 1 | lpop阻塞版本,timeout 是阻塞超时时间,timeout=0为永不阻塞 (从右侧获取) |
集合部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
sadd key element | O(1) | sadd key value [value ...] | sadd hello 1 2 3 | 向集合key添加element(如果element已经存在 ,添加失败) |
srem key element | O(1) | srem key member | srem hello 1 | 将集合key中的element移除掉 |
scard key | O(1) | scard key | scard hello | 计算集合大小 |
sismember key element | O(1) | sismember key member | sismember hello 2 | 判断element 是否在集合中 |
srandmember key count | O(1) | srandmember key member | srandmember hello 2 | 从集合中随机挑选count个元素 |
spop key | O(1) | spop key | spop hello | 从集合中随机弹出一个数据 |
smembers | O(n) | smembers key | smembers hello | 返回集合中所有元素 |
sdiff | O(N) | sdiff key value | sdiff hello word | 返回一个包含差集成员的列表 |
sinter | O(n * m) | sinter key value | sinter hello word | 返回一个包含交集成员的列表 |
sunion | O(n) | sunion key value | sunion hello word | 返回一个包含并集成员的列表 |
sdiffstore | O(n) | sdiffstore destination key [key ...] | sdiffstore diffarray abc abc1 | 将两个集合的差集保存到一个新的集合中 |
sinterstore | O(n * m) | sinterstore destination key [key ....] | sinterstore sinterarray abc abc1 | 将两个集合的交集保存到一个新的集合中 |
sunionstore | O(n) | sunionstore destination key [key ...] | sunionstore sunionarray abc abc1 | 将两个集合的并集保存到一个新的集合中 |
有序集合部分
命令 | 时间复杂度 | 命令 | 例子 | 建议 |
---|---|---|---|---|
zadd | O(logN) | zadd key score member | zadd hello 1 abc | 添加score(可以重复) 和element(不可以重复) |
zrem | O(1) | zrem key member | zrem hello abc | 删除元素 |
zscore | O(1) | zscore key member | zscore hello abc | 返回元素的分数 |
zincrby | O(1) | zincrby key increment member | zincrby hello 1 word | 增加或减少元素的分数 |
zcard | O(1) | zcard key | zcard hello | 返回元素总格式 |
zrank | O(1) | zrank key member | zrank hello word | 返回当前元素在集合中的排名(升序) |
zrange | O(log(n)+m) | zrange key start stop [withscores] | zrange hello 0 2 | 返回指定索引范围内的升序元素[分值] |
zrangebyscore | O(log(n)+m) | zrangebyscore key min max [withscores] | zrangebyscore hello 0 3 | 返回指定分数范围内的升序元素[分值] |
zcount | O(log(n)+m) | zcount key min max | zcount hello 0 2 | 返回有序集合内在指定分数返回的元素个数 |
zremrangebyrank | O(log(n)+m) | zremrangebyrank key start stop | zremrangebyrank hello 0 1 | 删除指定排名内的升序元素 |
zremrangebyscore | O(log(n)+m) | zremrangebyscore key min max | zremrangebyscore hello 0 1 | 删除指定分数内的升序元素 |
zrevrank | O(log(N)) | zrevrank key member | zrevrank hello word | 返回当前元素在集合中的排名(降序) |
zrevrange | O(log(n)+m) | zrevrange key start stop | zrevrange hello 0 -1 | 返回指定索引范围内的降序序元素[分值] |
zrevrangebyscore | O(log(n)+m) | zrevrangebyscore key max min | zrevrangebyscore hello +inf -inf | 返回指定分数范围内的降序元素[分值] |
zinterstore | O(NK)+O(Mlog(M)) | zinterstore destination numbers key [key ...] | zinterstore sum_point 2 mid_test fin_test | 返回多个集合的交集保存到新的集合中 数字为集合的数量 |
zunionstore | O(NK)+O(Mlog(M)) | zunionstore destination numbers key [key ...] | zunionstore sum_point 2 mid_test fin_test | 返回多个集合的并集保存到新的集合中 数字为集合的数量 |
一些对比
集合 | 对比 | 有序集合 |
---|---|---|
无重复元素 | <一> | 无重复元素 |
无序 | <一> | 有序 |
element | <一> | element+store |
列表 | 对比 | 有序集合 |
---|---|---|
可以重复元素 | <一> | 无重复元素 |
有序 | <一> | 有序 |
element | <一> | element+store |
附录3
tips
- lpush + lpop = stack 站
- lpush + rpop = queue 队列
- lpush + ltrim = capped collection 固定数量列表
- lpush + brpop = message queue 消息队列