Redis总体介绍

目录[-]


1、Redis是什么:

REmote DIctionary Server--[Redis]是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis提供了一些丰富的数据结构,包括lists,sets,ordered sets 以及hashes,当然还有和Memcacheed一样的Strings结构。

Redis当然还包括了对这些数据机构的丰富操作。

2、Redis的优点:

(1)、性能极高 – Redis能支持超过 100K+ 每秒的读写频率。

(2)、丰富的数据类型 – Redis支持二进制案例 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

(3)、原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

(4)、丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

3、数据类型:

3.1、String类型

Redis能存储二进制安全的字符串,最大长度为1GB

?
1
2
3
4
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> GET name
"John Doe"

String类型还支持批量的读写操作

?
1
2
3
4
5
redis 127.0.0.1:6379> MSET age 26 sex  "male"
OK
redis 127.0.0.1:6379> MGET age sex
1)  "26"
2)  "male"

String类型其实也可以用来存储数字,并支持对数字的加减操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
redis 127.0.0.1:6379> INCR age
(integer) 27
redis 127.0.0.1:6379> INCRBY age 4
(integer) 31
redis 127.0.0.1:6379> GET age
"31"
redis 127.0.0.1:6379> DECR age
(integer) 30
redis 127.0.0.1:6379> DECRBY age 4
(integer) 26
redis 127.0.0.1:6379> GET age
"26"

String类型还支持对其部分的修改和获取操作

?
1
2
3
4
5
6
7
8
redis 127.0.0.1:6379> APPEND name  " Mr."
(integer) 12
redis 127.0.0.1:6379> GET name
"John Doe Mr."
redis 127.0.0.1:6379> STRLEN name
(integer) 12
redis 127.0.0.1:6379> SUBSTR name 0 3
"John"

3.2、List类型

Redis能够将数据存储成一个链表,并能对这个链表进行丰富的操作。

?
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
redis 127.0.0.1:6379> LPUSH students  "John Doe"
(integer) 1
redis 127.0.0.1:6379> LPUSH students  "Captain Kirk"
(integer) 2
redis 127.0.0.1:6379> LPUSH students  "Sheldon Cooper"
(integer) 3
redis 127.0.0.1:6379> LLEN students
(integer) 3
redis 127.0.0.1:6379> LRANGE students 0 2
1)  "Sheldon Cooper"
2)  "Captain Kirk"
3)  "John Doe"
redis 127.0.0.1:6379> LPOP students
"Sheldon Cooper"
redis 127.0.0.1:6379> LLEN students
(integer) 2
redis 127.0.0.1:6379> LRANGE students 0 1
1)  "Captain Kirk"
2)  "John Doe"
redis 127.0.0.1:6379> LREM students 1  "John Doe"
(integer) 1
redis 127.0.0.1:6379> LLEN students
(integer) 1
redis 127.0.0.1:6379> LRANGE students 0 0
1)  "Captain Kirk"

Redis也支持很多修改操作

?
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
redis 127.0.0.1:6379> LINSERT students BEFORE  "Captain Kirk"  "Dexter Morgan"
(integer) 3
redis 127.0.0.1:6379> LRANGE students 0 2
1)  "Dexter Morgan"
2)  "Captain Kirk"
3)  "John Doe"
redis 127.0.0.1:6379> LPUSH students  "Peter Parker"
(integer) 4
redis 127.0.0.1:6379> LRANGE students 0 3
1)  "Peter Parker"
2)  "Dexter Morgan"
3)  "Captain Kirk"
4)  "John Doe"
redis 127.0.0.1:6379> LTRIM students 1 3
OK
redis 127.0.0.1:6379> LLEN students
(integer) 3
redis 127.0.0.1:6379> LRANGE students 0 2
1)  "Dexter Morgan"
2)  "Captain Kirk"
3)  "John Doe"
redis 127.0.0.1:6379> LREM students 1  "John Doe"
(integer) 1
redis 127.0.0.1:6379> LLEN students
(integer) 1
redis 127.0.0.1:6379> LRANGE students 0 1
1)  "Captain Kirk"

3.3、Set类型

Redis能够将一系列不重复的值存储成一个集合

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
redis 127.0.0.1:6379> SADD birds crow
(integer) 1
redis 127.0.0.1:6379> SADD birds pigeon
(integer) 1
redis 127.0.0.1:6379> SADD birds bat
(integer) 1
redis 127.0.0.1:6379> SADD mammals dog
(integer) 1
redis 127.0.0.1:6379> SADD mammals  cat
(integer) 1
redis 127.0.0.1:6379> SADD mammals bat
(integer) 1
redis 127.0.0.1:6379> SMEMBERS birds
1)  "bat"
2)  "crow"
3)  "pigeon"
redis 127.0.0.1:6379> SMEMBERS mammals
1)  "bat"
2)  "cat"
3)  "dog"

Sets结构也支持相应的修改操作

?
1
2
3
4
5
6
7
8
9
10
11
redis 127.0.0.1:6379> SREM mammals  cat
(integer) 1
redis 127.0.0.1:6379> SMEMBERS mammals
1)  "bat"
2)  "dog"
redis 127.0.0.1:6379> SADD mammals human
(integer) 1
redis 127.0.0.1:6379> SMEMBERS mammals
1)  "bat"
2)  "human"
3)  "dog"

Redis还支持对集合的子交并补等操作

?
1
2
3
4
5
6
7
8
9
10
11
redis 127.0.0.1:6379> SINTER birds mammals
1)  "bat"
redis 127.0.0.1:6379> SUNION birds mammals
1)  "crow"
2)  "bat"
3)  "human"
4)  "pigeon"
5)  "dog"
redis 127.0.0.1:6379> SDIFF birds mammals
1)  "crow"
2)  "pigeon"

3.4、Sorted Sets 类型

Sorted Sets和Sets结构相似,不同的是存在Sorted Sets中的数据会有一个score属性,并会在写入时就按这个score排好序。

?
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
redis 127.0.0.1:6379> ZADD days 0 mon
(integer) 1
redis 127.0.0.1:6379> ZADD days 1 tue
(integer) 1
redis 127.0.0.1:6379> ZADD days 2 wed
(integer) 1
redis 127.0.0.1:6379> ZADD days 3 thu
(integer) 1
redis 127.0.0.1:6379> ZADD days 4 fri
(integer) 1
redis 127.0.0.1:6379> ZADD days 5 sat
(integer) 1
redis 127.0.0.1:6379> ZADD days 6 sun
(integer) 1
redis 127.0.0.1:6379> ZCARD days
(integer) 7
redis 127.0.0.1:6379> ZRANGE days 0 6
1)  "mon"
2)  "tue"
3)  "wed"
4)  "thu"
5)  "fri"
6)  "sat"
7)  "sun"
redis 127.0.0.1:6379> ZSCORE days sat
"5"
redis 127.0.0.1:6379> ZCOUNT days 3 6
(integer) 4
redis 127.0.0.1:6379> ZRANGEBYSCORE days 3 6
1)  "thu"
2)  "fri"
3)  "sat"
4)  "sun"

3.5、Hash类型

Redis能够存储key对多个属性的数据(比如user1.uname user1.passwd)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
redis 127.0.0.1:6379> HKEYS student
1)  "name"
2)  "age"
3)  "sex"
redis 127.0.0.1:6379> HVALS student
1)  "Ganesh"
2)  "30"
3)  "Male"
redis 127.0.0.1:6379> HGETALL student
1)  "name"
2)  "Ganesh"
3)  "age"
4)  "30"
5)  "sex"
6)  "Male"
redis 127.0.0.1:6379> HDEL student sex
(integer) 1
redis 127.0.0.1:6379> HGETALL student
1)  "name"
2)  "Ganesh"
3)  "age"
4)  "30"

Hash数据结构能够批量修改和获取

?
1
2
3
4
5
6
redis 127.0.0.1:6379> HMSET kid name Akshi age 2 sex Female
OK
redis 127.0.0.1:6379> HMGET kid name age sex
1)  "Akshi"
2)  "2"
3)  "Female"

4、Publish/Subscribe:

Redis支持一种特性,可将数据推到某个信息管道中,其它人可通过订阅这些管道来获取推送过来的信息。

4.1、订阅信息管道

用一个客户端订阅管道

?
1
2
3
4
5
redis 127.0.0.1:6379> SUBSCRIBE channelone
Reading messages... (press Ctrl-C to quit)
1)  "subscribe"
2)  "channelone"
3) (integer) 1

另一个客户端往这个管道推送信息

?
1
2
3
4
redis 127.0.0.1:6379> PUBLISH channelone hello
(integer) 1
redis 127.0.0.1:6379> PUBLISH channelone world
(integer) 1

然后第一个客户端就能获取到推送的信息

?
1
2
3
4
5
6
7
8
9
10
11
redis 127.0.0.1:6379> SUBSCRIBE channelone
Reading messages... (press Ctrl-C to quit)
1)  "subscribe"
2)  "channelone"
3) (integer) 1
1)  "message"
2)  "channelone"
3)  "hello"
1)  "message"
2)  "channelone"
3)  "world"

4.2、按一定模式批量订阅

用下面的命令订阅所有channel开头的信息通道

?
1
2
3
4
5
redis 127.0.0.1:6379> PSUBSCRIBE channel*
Reading messages... (press Ctrl-C to quit)
1)  "psubscribe"
2)  "channel*"
3) (integer) 1

在另一个客户端对两个推送信息

?
1
2
3
4
redis 127.0.0.1:6379> PUBLISH channelone hello
(integer) 1
redis 127.0.0.1:6379> PUBLISH channeltwo world
(integer) 1

然后在第一个客户端就能收到推送的信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
redis 127.0.0.1:6379> PSUBSCRIBE channel*
Reading messages... (press Ctrl-C to quit)
1)  "psubscribe"
2)  "channel*"
3) (integer) 1
1)  "pmessage"
2)  "channel*"
3)  "channelone"
4)  "hello"
1)  "pmessage"
2)  "channel*"
3)  "channeltwo"
4)  "world"

5、数据过期设置:

Redis支持按key设置过期时间,过期后值将被删除(在客户端看来是补删除了的)用TTL命令可以获取某个key值的过期时间(-1表示永不过期)

?
1
2
3
4
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> TTL name
(integer) -1

下面命令先用EXISTS命令查看key值是否存在,然后设置了5秒的过期时间

?
1
2
3
4
5
6
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> EXISTS name
(integer) 1
redis 127.0.0.1:6379> EXPIRE name 5
(integer) 1

5秒后再查看

?
1
2
3
4
redis 127.0.0.1:6379> EXISTS name
(integer) 0
redis 127.0.0.1:6379> GET name
(nil)

同时也可以设置在某个时间点过期。

6、事务性:

Redis本身支持一些简单的组合型的命令,比如以NX结尾命令都是判断在这个值没有时才进行某个命令。

?
1
2
3
4
5
6
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> SETNX name  "Dexter Morgan"
(integer) 0
redis 127.0.0.1:6379> GET name
"John Doe"

?
1
2
3
4
redis 127.0.0.1:6379> GETSET name  "Dexter Morgan"
"John Doe"
redis 127.0.0.1:6379> GET name
"Dexter Morgan"

当然,Redis还支持自定义的命令组合,通过MULTI和EXEC,将几个命令组合起来执行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
redis 127.0.0.1:6379> SET counter 0
OK
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> INCR counter
QUEUED
redis 127.0.0.1:6379> INCR counter
QUEUED
redis 127.0.0.1:6379> INCR counter
QUEUED
redis 127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
redis 127.0.0.1:6379> GET counter
"3"

你还可以用DICARD命令来中断执行中的命令序列。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
redis 127.0.0.1:6379> SET newcounter 0
OK
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> INCR newcounter
QUEUED
redis 127.0.0.1:6379> INCR newcounter
QUEUED
redis 127.0.0.1:6379> INCR newcounter
QUEUED
redis 127.0.0.1:6379> DISCARD
OK
redis 127.0.0.1:6379> GET newcounter
"0"

7、持久化:

Redis的所有数据都存储在内存中,但是他也提供对这些数据的持久化。

7.1、数据快照

数据快照的原理是将整个Redis中存的所有数据遍历一遍存到一个扩展名为rdb的数据文件中。通过SAVE命令可以调用这个过程。

?
1
2
3
4
5
6
7
8
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> SAVE
OK
redis 127.0.0.1:6379> SET name  "Sheldon Cooper"
OK
redis 127.0.0.1:6379> BGSAVE
Background saving started

如果你是使用的brew在Mac OSX上安全的Redis,那么rdb文件会存在如下路径

?
1
/usr/local/var/db/redis/dump .rdb

7.2、追加式的的操作日志记录(Append-Only file)

其日志文件以aof结局,我们一般称为aof文件。要开启aof日志的记录,你需要在配置文件中进行如下设置:

?
1
appendonly  yes

这时候你所有的操作都会记录在aof日志文件中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
redis 127.0.0.1:6379> GET name
(nil)
redis 127.0.0.1:6379> SET name  "Ganesh Gunasegaran"
OK
redis 127.0.0.1:6379> EXIT
 
→  cat  /usr/local/var/db/redis/appendonly .aof
*2
$6
SELECT
$1
0
*3
$3
SET
$4
name
$18
Ganesh Gunasegaran

8、管理命令:

Redis支持多个DB,默认是16个,你可以设置将数据存在哪一个DB中,不同DB间的数据具有隔离性。也可以在多个DB间移动数据。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
redis 127.0.0.1:6379> SELECT 0
OK
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> SELECT 1
OK
redis 127.0.0.1:6379[1]> GET name
(nil)
redis 127.0.0.1:6379[1]> SELECT 0
OK
redis 127.0.0.1:6379> MOVE name 1
(integer) 1
redis 127.0.0.1:6379> SELECT 1
OK
redis 127.0.0.1:6379[1]> GET name
"John Doe"

Redis还能进行一些如下操作,获取一些运行信息。

?
1
2
3
4
5
6
7
8
9
redis 127.0.0.1:6379[1]> DBSIZE
(integer) 1
redis 127.0.0.1:6379[1]> INFO
redis_version:2.2.13
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:kqueue
......

Redis还支持对某个DB数据进行清除(当然清空所有数据的操作也是支持的)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
redis 127.0.0.1:6379> SET name  "John Doe"
OK
redis 127.0.0.1:6379> DBSIZE
(integer) 1
redis 127.0.0.1:6379> SELECT 1
OK
redis 127.0.0.1:6379[1]> SET name  "Sheldon Cooper"
OK
redis 127.0.0.1:6379[1]> DBSIZE
(integer) 1
redis 127.0.0.1:6379[1]> SELECT 0
OK
redis 127.0.0.1:6379> FLUSHDB
OK
redis 127.0.0.1:6379> DBSIZE
(integer) 0
redis 127.0.0.1:6379> SELECT 1
OK
redis 127.0.0.1:6379[1]> DBSIZE
(integer) 1
redis 127.0.0.1:6379[1]> FLUSHALL
OK
redis 127.0.0.1:6379[1]> DBSIZE
(integer) 0

9、客户端:

Redis的客户端很丰富,几乎所有流行的语言都有其客户端,这里就不再赘述,有兴趣的可以上Redis的Clients页面去查找。

10、总体剖析:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个开源的高性能键值对数据库,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。下面是Redis的优缺点详细介绍: 优点: 1. 高性能:Redis是一个内存数据库,因此它能够提供非常快的读写速度。此外,它的单线程模型也使得它的性能非常稳定。 2. 支持多种数据结构:Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。这使得它能够满足各种不同的应用场景。 3. 持久化:Redis支持两种持久化方式,分别是RDB和AOF。这使得它的数据能够在宕机或重启后得到保留。 4. 多种应用场景:Redis可以用于多种应用场景,包括缓存、消息队列、计数器等。 5. 高可用性:Redis支持主从复制和哨兵模式,这使得它能够提供高可用性的服务。 缺点: 1. 内存限制:由于Redis是一个内存数据库,因此它的数据量受到内存限制的影响,并且不能存储超出内存容量的数据。 2. 不支持复杂查询:Redis不支持复杂查询,因此不能像关系型数据库那样进行复杂的数据查询操作。 3. 数据安全问题:由于Redis不支持事务,因此在并发操作时可能存在数据安全问题。 4. 单线程模型:虽然Redis的单线程模型能够提供稳定的性能,但在高并发场景下可能存在性能瓶颈。 总体而言,Redis是一个性能优秀、应用场景广泛的数据库,但也存在一些局限性,需要根据具体应用场景进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值