redis要点分析

1. Redis简介

Redis是一个高性能的NoSQL内存数据库,也被称为是一个数据结构服务器,它支持多种数据结构包括字符串、列表、哈希、集合和有序集合等等,此外Redis还支持一些高级功能,如事务、Pub/Sub、Lua脚本、自动过期等等。Redis的内存中存储架构使得它具有非常快的读写速度和高并发能力,而且它也支持将数据以RDBAOF的形式写入磁盘,从而保证了数据的持久化。

2. Redis的数据结构

2.1 字符串

字符串是Redis中最基本的数据结构,它可以存储字符串、整数或者浮点数。在Redis中,字符串的最大长度是512MB。

redis> SET name "Redis"

OK

redis> GET name

"Redis"

Redis中字符串的一些常用命令:

SET key value [EX seconds] [PX milliseconds] [NX|XX]: 设置一个key-value对

GET key: 获取key对应的value

MSET key value [key value ...]: 设置多个key-value对

MGET key [key ...]: 获取多个key对应的value

INCR key: 将key中存储的数字值增1

DECR key: 将key中存储的数字值减1

APPEND key value: 在key对应的value的末尾追加value

2.2 列表

列表是Redis中的一个简单的、有序的元素集合。列表中的元素可以重复,一个列表最多可以包含232-1个元素。

redis> LPUSH numbers 4 5 6

(integer) 3

redis> RPUSH numbers 1 2 3

(integer) 6

redis> LRANGE numbers 0 -1

1) "4"

2) "5"

3) "6"

4) "1"

5) "2"

6) "3"

Redis中列表的一些常用命令:

LPUSH key value [value ...]: 向列表左端添加一个或多个元素

RPUSH key value [value ...]: 向列表右端添加一个或多个元素

LPOP key: 返回并删除列表的最左元素

RPOP key: 返回并删除列表的最右元素

LRANGE key start stop: 返回列表中指定区间内的元素

LLEN key: 返回列表的长度

2.3 哈希

哈希存储的是键值对集合,其中的键和值都是字符串类型。哈希在Redis中的应用非常广泛。

redis> HMSET user:1 name "Tom" email "tom@example.com" age 23

OK

redis> HGET user:1 name

"Tom"

redis> HGETALL user:1

1) "name"

2) "Tom"

3) "email"

4) "tom@example.com"

5) "age"

6) "23"

Redis中哈希的一些常用命令:

HSET key field value: 设置哈希中某个字段的值

HDEL key field [field ...]: 删除哈希中某个或多个字段

HMSET key field value [field value ...]: 同时设置哈希中多个字段的值

HGET key field: 获取哈希中某个字段的值

HGETALL key: 获取哈希中所有的字段名和对应的值

HKEYS key: 获取哈希中所有的字段名

HVALS key: 获取哈希中所有的值

2.4 集合

集合中包含了一系列的无序、唯一元素。集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。一个集合最多可以包含232-1个元素。

redis> SADD books "book1" "book2" "book3"

(integer) 3

redis> SMEMBERS books

1) "book1"

2) "book2"

3) "book3"

Redis中集合的一些常用命令:

SADD key member [member ...]: 向集合中添加一个或多个元素

SREM key member [member ...]: 从集合中删除一个或多个元素

SISMEMBER key member: 判断元素是否存在于集合中

SMEMBERS key: 获取集合中所有的元素

SUNION key [key ...]: 返回多个集合的并集

SINTER key [key ...]: 返回多个集合的交集

SDIFF key [key ...]: 返回多个集合的差集

2.5 有序集合

有序集合和集合类似,都是一系列无序、唯一元素的集合,不同的是有序集合中的元素可以关联一个分数,分数可以用来对元素进行从小到大的排序。有序集合也是通过哈希表实现的。

redis> ZADD letterscore 1 a 2 b 3 c

(integer) 3

redis> ZRANGE letterscore 0 -1 WITHSCORES

1) "a"

2) "1"

3) "b"

4) "2"

5) "c"

6) "3"

Redis中有序集合的一些常用命令:

ZADD key score member [score member ...]: 向有序集合中添加一个或多个元素

ZREM key member [member ...]: 从有序集合中删除一个或多个元素

ZSCORE key member: 获取有序集合中某个元素的分数

ZRANGE key start stop [WITHSCORES]: 获取有序集合中指定范围内的元素

ZCARD key: 获取有序集合的长度

ZCOUNT key min max: 获取有序集合中分数范围内的元素个数

3. Redis的高级功能

3.1 事务

Redis的事务通过MULTI、EXEC、DISCARD和WATCH几个命令实现,其中MULTI开启事务,EXEC提交事务,DISCARD取消事务,WATCH可以在事务提交的时候检查中途是否被其他客户端修改过。

redis> MULTI

OK

redis> SET name "Tom"

QUEUED

redis> SET age 23

QUEUED

redis> EXEC

1) OK

2) OK

redis> GET name

"Tom"

redis> GET age

"23"

3.2 Pub/Sub

Redis支持发布/订阅模式,通过PUBLISH命令发布消息,通过SUBSCRIBE命令订阅消息。

redis> SUBSCRIBE news

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "news"

3) (integer) 1

redis> PUBLISH news "Hello, world!"

(integer) 1 # 返回值代表有一个客户端收到了消息

3.3 Lua脚本

Redis中可以通过执行Lua脚本来实现对数据的复杂操作,Redis将Lua脚本作为一个整体进行处理,保证了原子性。

redis> EVAL "return {KEYS[1],ARGV[1]}" 1 key1 value1

1) "key1"

2) "value1"

3.4 自动过期

Redis中的key可以设置过期时间,过期时间到达后,key将会被自动删除。通过TTL命令可以查看key的剩余生存时间。

redis> SET token key

OK

redis> EXPIRE token 60

(integer) 1

redis> TTL token

(integer) 50 # 剩余50秒的生存时间

4. Redis的优缺点

4.1 优点

速度和吞吐量高:因为Redis是基于内存的,读写速度非常快。

可扩展性强:Redis支持主从复制和分片等功能,可以方便地进行横向扩展。

数据结构丰富:Redis支持多种数据结构,可以满足不同需求的操作。

持久性:Redis支持将数据以RDB或AOF格式写入磁盘,确保了数据的持久性。

4.2 缺点

内存限制:因为Redis是基于内存的,所以它的容量受到内存大小的限制。

持久化效率低:在使用AOF持久化时可能会影响写入性能,因为Redis需要将每个写入操作都写入磁盘。

不能处理非结构化数据:如果需要存储非结构化数据,Redis可能并不是最优的选择。

5. 总结

Redis是一个高性能的NoSQL内存数据库,支持多种数据结构和高级功能,如事务、Pub/Sub、Lua脚本和自动过期等等,还具有良好的可扩展性和持久性。但是Redis也存在一些缺点,如内存限制、持久化效率低和不能处理非结构化数据等。对于不同的应用场景,需要根据需求来选择合适的数据库。

数据库标签