redis 学习
redis
验证
1
2
3
4
5ps -ef | grep redis
netstat -antpl | grep redis
redis-cli -h ip -p port ping动态参数启动redis
redis-server –port 6380创建软连接
ln -s redis-3.0.7 redis
编译: make 安装: make install
redis hash数据结构
哈希键值结构
特点
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
8127.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
15127.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 列表
列表数据结构
列表的操作有:
- 左边添加弹出 lpush、lpop
- 右边添加弹出 rpush、rpop
- 获取子列表 lrange 2 3
- 获取列表长度 llen
- 获取列表中的指定元素 lindex 4
- 删除列表中指定元素 lrem 1 b
特点:
- 有序
- 可以重复
- 左右两边弹出
列表操作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
19127.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
2linsert 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
5127.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
2127.0.0.1:6379> llen listkey
(integer) 5
修改list指定索引的item的值
lset key index newValue O(n)
设置列表指定索引值为newValue
例子:1
2
3
4
5
6
7
8127.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"
列表应用:
- LPUSH + LPOP = stack
- LPUSH + RPOP = Queue
- LPUSH + LTRIM = 可控容量大小的集合
- 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
17127.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
2127.0.0.1:6379> zcount program 120 140
(integer) 2
zremrangebyrank
zremrangebyrank key start end O(log(n)+m)
删除指定排名内的升序元素
例子:1
2
3
4
5127.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)
删除指定分数内的升序元素
主从复制
- 一个master可以有多个slave
- 一个slave只能有一个master
- 数据流向是单向的,master到slave