1. Redis简介
Redis是一个高性能的NoSQL内存数据库,也被称为是一个数据结构服务器,它支持多种数据结构包括字符串、列表、哈希、集合和有序集合等等,此外Redis还支持一些高级功能,如事务、Pub/Sub、Lua脚本、自动过期等等。Redis的内存中存储架构使得它具有非常快的读写速度和高并发能力,而且它也支持将数据以RDB
或AOF
的形式写入磁盘,从而保证了数据的持久化。
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也存在一些缺点,如内存限制、持久化效率低和不能处理非结构化数据等。对于不同的应用场景,需要根据需求来选择合适的数据库。