Redis

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,

  • redis支持数据的持久化,可以将内存中的数据存储到磁盘中。
  • 不仅仅支持key-value类型的数据,还支持list,set,zset,hash等数据结构
  • 支持数据的备份

redis的特点

  • 极高的性能,读取速度可达110000次/s;写的速度高达81000次/s
  • 支持多种数据类型
  • 所有操作都是原子性的(包括多步操作)
  • 其它特性

redis的数据类型和相关命令

  • string 字符串

一个键最大可以存512mb

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
26
27
//存入
set mykey "hello word"
//取出
get mykey
//返回key中的字符串的子字符串
getrange key start end
// 将key的值设为value并返回旧值
getset key value
//对key所存储的字符串,获取指定偏移量上的位
getbit key offset
//获取所有给定key的值
mget key1 [key2...]
//对所有key存储的字符串,设置或清除指定偏移量上的位
setbit key offset value
//将值value关联到key,并将key的过期时间设为seconds
setex key seconds value
//只有在key不存在时设置key的值
setnx key value
//返回key所存储的字符串的长度
srtlen key
//将key中存储的值加一
incr key
//将key所存储的值加上给定的增量值
incrbyfloat key increment
//在key后面追加字符串
append key value

  • hash 哈希
    适合存储对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 存入
hmset myhash mykey01 "hello"
//取出
hget myhash mykey01
// 获取存储在哈希表中指定key的所有字段和值
hgetall key
//为哈希表key中的指定字段的整数值加上增量increment
hincrby key field incremtn
//获取所有哈希表中的字段
hkeys key
//获取哈希表中字段的数量
hlen key
// 将哈希表key中的字段field的值设为value
heset key field value
//只有在字符按field不存在时,设置哈希表字段的值
hsetnx key field value
// 获取哈希表中所有的值
hvals ksy


  • list 列表
    列表是字符串列表,按照存入顺序排序
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
26
27
28
29
30
31
32
33
34
35
36
37
//从头部插入
lpush mylist hello
//从尾部追加
rpush mylist word
//列出
lange mylist 0 10
//移除并获取第一个元素 ,如果没有元素会阻塞列表直到等待超时会发现可弹出的元素为止
blpop key1 [key] timeout
//移除并获取列表的最后一个元素。如果没有元素则会阻塞列表,直到等待时间超时,或发现可弹出的元素为止。
brpop key1 [key2] timeout
//从列表中弹出一值,并将弹出的元素插入到另一个列表中并返回它;如果没有元素则会阻塞直到超时,或发现可以弹出的元素
brpoplpush source destination timeout
//通过元素的索引获取列表中的元素
lindex key index
//获取列表的长度
llen key
//移除列表的第一个原元素
lpop key
//将一个值插入到已存在的列表的头部
lpushx key value
//获取列表指定范围内的元素
lrange key start stop
//移除列表元素
lrem key count
//通过索引设置列表元素的值
lset key index value
//让列表只保留指定区间的元素
Ltrim key start stop
//移除列表的最后一个元素
rpop key
//移除列表的最后一个元素,并将该元素添加到另一个列表并防护
rpoplpush source destination
//为列表章添加多个值
rpush key value1 [value2]
//为已存在的列表添加值
rpushhx key value

  • set 集合
    是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//加入
sadd myset aaa
sadd myset bbb
//列出
smembers myset
//获取结合的成员数
scard key
//返回指定结合的差集
sdiff key1 [key2]
//返回给定集合的差集并存储在destination中
sinterstore destionation key1 [key2]
//判断memeber元素是否是集合key的成员
sismember key member
//将member从source结合移动到destination集合
smove source destionation member
//移除并返回集合中的一个随机元素
spop key
//返回集合中的一个或多个随机数
srandmember key [count]
//返回给定集合的并集
sunion key1 [key2]

  • zset 有序集合
    不允许重复的成员,每个成员都关联一个double类型的分数。按分数,从小到大排序
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//加入
zadd mysset 0 aaa
zadd mysset 1 bbb
//列出
zrangebysocre mysset 0 10

//向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]

//获取有序集合的成员数
ZCARD key

//计算在有序集合中指定区间分数的成员数
ZCOUNT key min max

//有序集合中对指定成员的分数加上增量 increment
ZINCRBY key increment member

//计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
ZINTERSTORE destination numkeys key [key ...]

//在有序集合中计算指定字典区间内成员数量
ZLEXCOUNT key min max

//通过索引区间返回有序集合成指定区间内的成员
ZRANGE key start stop [WITHSCORES]

//通过字典区间返回有序集合的成员
ZRANGEBYLEX key min max [LIMIT offset count]

//通过分数返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

//返回有序集合中指定成员的索引
ZRANK key member

//移除有序集合中的一个或多个成员
ZREM key member [member ...]

//移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYLEX key min max

//移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYRANK key start stop

//移除有序集合中给定的分数区间的所有成员
ZREMRANGEBYSCORE key min max

//返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREVRANGE key start stop [WITHSCORES]

//返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANGEBYSCORE key max min [WITHSCORES]

//返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZREVRANK key member

//返回有序集中,成员的分数值
ZSCORE key member

//计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZUNIONSTORE destination numkeys key [key ...]

//迭代有序集合中的元素(包括元素成员和元素分值)
ZSCAN key cursor [MATCH pattern] [COUNT count]

redis键的管理

  • 删除key

    del key

  • 序列化指定的key,并返回被序列化的值

    dump key

  • 检查给定的ksy是否存在

    exists key

  • 给指定的key设置过期时间(秒)

    expire key seconds

  • 给指定的key设置过期时间戳

    expireat key timestamp

  • 查找符合给定模式的key

    keys pattern

  • 移动key到指定的数据库

    move key db

  • persist key

    移除key的过期时间

  • 以毫秒为单位返回key的剩余的过期时间

    pttl key

  • 以秒为单位返回key的剩余的过期时间

    ttl key

  • 修改key的名称

    rename key newkey

  • 只当newkey不存在的时候改名

    renamenx key newkey

  • 返回key所存储的值的类型

    type key

Redis HyperLogLog

用来做基数统计。其优点在于当数据数据的量或体积很大的时候,计算基数的空间是固定的,并且是很小的。

1
2
3
4
5
6
7
8
//添加指定元素到 HyperLogLog 中。
PFADD key element [element ...]

//返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]

//将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]

发布订阅

redis发布订阅是一种消息通信模式;发送者发送消息,接受者接收消息。redis客户端可以订阅任意数量的频道。
Az13Xd.png

redis事务

一个事务从开始到执行会经历以下三个阶段

  • 开始事务
  • 命令入队
  • 执行事务

以multi开始一个事务,以exec结束一个事务。

相关的事务命理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//取消事务
discard

//执行事务块内的命令
exec

//标记一个事务块的开始
multi

//取消watch命令对所有key的监视
unwatch

//监视指定的key,如果在执行事务之前这些key被其它命令改动则事务被打断
watch

redis连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//验证密码是否正确
auth password

//打印字符串
echo message

//查看服务是否运行
ping

//关闭当前连接
quit

//切换到指定的数据库
select index