Redis从入门到高可用,分布式实践

第一章

编译安装:

  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

  1. lpush + lpop = stack 站
  2. lpush + rpop = queue 队列
  3. lpush + ltrim = capped collection 固定数量列表
  4. lpush + brpop = message queue 消息队列
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容