作者:Wx丶华少 | 来源:互联网 | 2023-08-08 15:06
一、概述Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Re
一、概述
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持五种数据类型:字符串(STRING)、列表(LIST)、集合(SET)、散列表(HASH)、有序集合(ZSET)。
Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。
Redis 性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s
Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
二、五种数据类型
Redis数据库中的每个键值对都是由对象组成的,其中:
- 数据库键总是一个字符串对象(string object)
- 数据库键的值则可以是字符串对象、列表对象(list object)、哈希对象(hash object)、集合对象(set object)、有序集合对象(sorted set object) 这五个对象其中的一种。
String(字符串)
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。一个键最大存储也是 512MB。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据不出现错误,比如保存jpg图片或者序列化的对象。
比如C语言的char数组就不能保存任何数据,如果数据中包含\0
,则会错误地认为字符串结束,即不是二进制安全的。
> set hello world
OK
> get hello
"world"
> del hello
(integer) 1
> get hello
(nil)
List(列表)
Redis LIST(列表)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也可在头部或尾部删除一个元素。
列表最多可存储 2的32次方 - 1 个元素 (4294967295, 每个列表可存储40多亿)。
数据量大时使用双向链表实现。
127.0.0.1:6379> lpush ooc a
(integer) 1
127.0.0.1:6379> lpush ooc b
(integer) 2
127.0.0.1:6379> rpush ooc c
(integer) 3
127.0.0.1:6379> lrange ooc 0 2
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> lrange ooc 0 -1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> lindex ooc 2
"c"
127.0.0.1:6379> lpop ooc
"b"
127.0.0.1:6379> lrange ooc 0 -1
1) "a"
2) "c"
127.0.0.1:6379> rpop ooc
"c"
127.0.0.1:6379> lrange ooc 0 -1
1) "a"
Set(集合)
Redis的Set是string类型的无序集合。
数据量大时使用哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0> smembers set-key
1) "item"
2) "item2"
3) "item3"> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1> srem set-key item2
(integer) 1
> srem set-key item2
(integer) 0> smembers set-key
1) "item"
2) "item3"
Hash(散列表)
Redis hash 是一个键值对(key -> value
)集合。
Redis hash 是一个 field 和 value 的映射表(均为string 类型),hash 特别适合用于存储对象。
每个 hash 可以存储 2的32次方 -1 键值对(40多亿)。
数据量大时使用哈希表实现。
> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0> hget hash-key sub-key1
"value1"> hgetall hash-key
1) "sub-key1"
2) "value1"
Zset (sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。成员不允许重复的功能通过哈希表来实现。
数据量大时使用跳跃表实现。
> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"