redis

  1. 验证

    1
    2
    3
    4
    5
    ps -ef | grep redis

    netstat -antpl | grep redis

    redis-cli -h ip -p port ping
  2. 动态参数启动redis
    redis-server –port 6380

  3. 创建软连接
    ln -s redis-3.0.7 redis

编译: make 安装: make install

redis hash数据结构

  1. 哈希键值结构

  2. 特点
    filed不能相同,value可以相同

redis hash api

hget、hset、hdel o(1)
哈希命令都以H开头
hget key field
获取hash key所对应的field的value
hset key field value
设置hash key对应的field的value
hdel key field
删除hash key对应field的value

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
使用hset设置key和field
127.0.0.1:6379> hset user:1:info name zhaoyu
(integer) 1
127.0.0.1:6379> hget user:1:info name
"zhaoyu"
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "zhaoyu"
hgetall 获取对应key的所有的属性和值
127.0.0.1:6379> hset user:1:info age 20
(integer) 1
127.0.0.1:6379> hget user:1:info age
"20"
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "zhaoyu"
3) "age"
4) "20"
使用hdel删除对应的key
127.0.0.1:6379> hdel user:1:info name
(integer) 1
其中 hdel 删除的时候可以指定多个field一起删除
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "20"

hexists 和 hlen

hexists key field
判断hash key 是否有 field
hlen key
获取hash key field的数量

例子:

1
2
3
4
5
6
7
8
9
10
先用hgetall 获取对应key的所有的属性和值
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "20"
127.0.0.1:6379> hexists user:1:info age
(integer) 1 值存在时返回1
127.0.0.1:6379> hexists user:1:info name
(integer) 0 值不存在时返回0
127.0.0.1:6379> hlen user:1:info
(integer) 1 key的属性的数量为1,目前只有一个属性

hmget、hmset
hmget key field1 field2… fieldN o(n)
批量获取hash key的一批field所对应的值
hmset key field1 value1 field2 value2… o(n)
批量设置hash key的一批field value

例子:

1
2
3
4
5
6
7
8
127.0.0.1:6379> hmset user:2:info age 20 name zhaoyu sex boy
OK
127.0.0.1:6379> hlen user:2:info
(integer) 3
127.0.0.1:6379> hmget user:2:info age name sex
1) "20"
2) "zhaoyu"
3) "boy"

hgetall key
返回hash key对应所有的field和value
hvals key
获取hash key对应所有的field的value
hkeys key
获取hash key对应的所有的field

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> hkeys user:2:info
1) "age"
2) "name"
3) "sex"
127.0.0.1:6379> hvals user:2:info
1) "20"
2) "zhaoyu"
3) "boy"
127.0.0.1:6379> hgetall user:2:info
1) "age"
2) "20"
3) "name"
4) "zhaoyu"
5) "sex"
6) "boy"

注意:hgetall如果属性非常多的话,会执行时间较久,时间复杂度o(n),生产环境不建议使用

hsetnx、hincrby、hincrbyfloat o(1)
hsetnx key field value
设置hash key对应的field的value(如field已存在则失败)
hincrby key field intCounter
hash key 对应的field的value自增intCounter
hincrbyfloat key field floatCounter
hincrby 浮点数版

总结:

命令 复杂度
hget hset hdel o(1)
hexists o(1)
hincrby o(1)
hgetall hvals hkeys o(n)
hmget hmset o(n)

redis list 列表

列表数据结构

列表的操作有:

  1. 左边添加弹出 lpush、lpop
  2. 右边添加弹出 rpush、rpop
  3. 获取子列表 lrange 2 3
  4. 获取列表长度 llen
  5. 获取列表中的指定元素 lindex 4
  6. 删除列表中指定元素 lrem 1 b

特点:

  1. 有序
  2. 可以重复
  3. 左右两边弹出

列表操作api

rpush key value1 value2 … valueN o(1~n)
从列表右端插入值(1-N个)
lpush key value1 value2
从列表左端插入值(1-N个)

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> rpush mylist a b c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lpush mylist 0
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"

linsert key before | after value newValue o(n)
在list指定的值前|后插入newValue

例子:

1
2
linsert listkey before b java
linsert listkey after b php

删除:

lpop key o(1)
从列表左侧弹出一个item
rpop key o(1)
从列表右侧弹出一个item
lrem key count value o(n)
根据count值,从列表中删除所有value相等的项
(1) count > 0, 从左至右,删除最多count个value相等的项
(2) count < 0, 从右到左,删除最多Math.abs(count)个value相等的项
(3) count = 0, 删除所有value相等的项

例子:

1
2
3
4
5
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"

修剪列表:

ltrim key start end o(n)
按照索引范围修剪列表

获取list列表

lrange key start end (包含end) o(n)
获取列表指定索引范围所有的item

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
取六个item
127.0.0.1:6379> lrange listkey 0 6
1) "c"
2) "java"
3) "b"
4) "php"
5) "a"
获取整个列表 0 -1
127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "java"
3) "b"
4) "php"
5) "a"

lindex获取指定索引的item

lindex key index
获取列表指定索引的item

例子:

1
2
3
4
5
6
获取第一个item
127.0.0.1:6379> lindex listkey 0
"c"
获取最后一个元素
127.0.0.1:6379> lindex listkey -1
"a"

llen 获取列表的指定长度

llen ley O(1)
获取列表长度

例子:

1
2
127.0.0.1:6379> llen listkey
(integer) 5

修改list指定索引的item的值

lset key index newValue O(n)
设置列表指定索引值为newValue

例子:

1
2
3
4
5
6
7
8
127.0.0.1:6379> lset listkey 0 newval
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "newval"
2) "java"
3) "b"
4) "php"
5) "a"

列表应用:

  1. LPUSH + LPOP = stack
  2. LPUSH + RPOP = Queue
  3. LPUSH + LTRIM = 可控容量大小的集合
  4. LPUSH + BRPOP = Message Queue 消息队列

redis集合Set

set 数据结构

特点:
无序、无重复元素、集合间操作(交集、并集、全集)

集合添加或删除

sadd key element O(1)
向集合key添加element(如果element已经存在,添加失败,不会抛异常,返回结果为0)
srem key element O(1)
将集合key中的element移除掉

scard、sismember、srandmember、smembers

scard key计算集合大小
sismember key element 判断元素是否在集合中
srandmember key count 从集合中随机挑count个元素, 不会破坏集合数据
spop key 从集合中随机弹出一个元素
smembers 从集合中取出所有的元素(无序),小心使用,可以使用sscan替代

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> sadd user:1:follow it news his sports
(integer) 4
127.0.0.1:6379> smembers user:1:follow
1) "his"
2) "news"
3) "sports"
4) "it"
127.0.0.1:6379> spop user:1:follow
"sports"
127.0.0.1:6379> smembers user:1:follow
1) "his"
2) "news"
3) "it"
127.0.0.1:6379> scard user:1:follow
(integer) 3
127.0.0.1:6379> sismember user:1:follow java
(integer) 0

sdiff、sinter、sunion

sdiff user:1:follow user:2:follow 差集
sinter user:1:follow user:2:follow 交集
sunion user:1:follow user:2:follow 并集

sdiff|sinter|sunion + store destkey 将差集、交集、并集结果保存在destkey中

tips:
SADD = Tagging
SPOP/SRANDMEMBER = Random item
SADD + SINTER = Social Graph

redis有序集合zset

有序集合结构

集合VS有序集合

集合 <=> 有序集合
无重复元素 <=> 无重复元素
无序 <=> 有序
element <=> element + score

列表VS有序集合

集合 <=> 有序集合
可以有重复元素 <=> 无重复元素
有序 <=> 有序
element <=> element + score

zadd添加、删除

zadd key score element(element可以重复) O(logN)
添加score和element
zrem key element(可以是多个) O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zadd program 150 GO 145 JAVA 140 NODE 130 javascript 120 php
(integer) 5
127.0.0.1:6379> zrem program javascript
(integer) 1
127.0.0.1:6379> zrange program 0 -1 withscores
1) "php"
2) "120"
3) "NODE"
4) "140"
5) "JAVA"
6) "145"
7) "GO"
8) "150"

zscore 获取分数

zscore key element

1
2
127.0.0.1:6379> zscore program JAVA
"145"

zincrby计数

zincrby key incrScore element O(1)
增加或减少元素的分数

返回元素个数

zcard key O(1)

1
2
127.0.0.1:6379> zcard program
(integer) 4

获取范围内的元素

zrange key start end [WITHSCORES] O(log(n)+m)
返回指定索引范围内的升序元素[分值]

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zrange program 0 -1 withscores
1) "php"
2) "120"
3) "NODE"
4) "140"
5) "JAVA"
6) "145"
7) "GO"
8) "150"

zrangebyscore

zrangebyscore key minScore maxScore[WITHSCORES] O(log(n)+m)
返回指定分数范围内的升序元素[分值]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> zrange program 0 -1 withscores
1) "php"
2) "120"
3) "NODE"
4) "140"
5) "JAVA"
6) "145"
7) "GO"
8) "150"
127.0.0.1:6379> zrangebyscore program 100 140 withscores
1) "php"
2) "120"
3) "NODE"
4) "140"

zcount

zount key minScore maxScore O(log(n)+m)
返回有序集合内在指定分数范围内的个数

例子:

1
2
127.0.0.1:6379> zcount program 120 140
(integer) 2

zremrangebyrank

zremrangebyrank key start end O(log(n)+m)
删除指定排名内的升序元素

例子:

1
2
3
4
5
127.0.0.1:6379> zremrangebyrank program 0 1
(integer) 2
127.0.0.1:6379> zrange program 0 -1
1) "JAVA"
2) "GO"

zremrangebyscore

zremrangebyscore key minScore maxScore O(log(n)+m)
删除指定分数内的升序元素

主从复制

  1. 一个master可以有多个slave
  2. 一个slave只能有一个master
  3. 数据流向是单向的,master到slave