Redis是一种远程的内存数据库,是速度非常快的非关系型数据库,使用键值对数据进行持久化。它既可以作为辅助数据库,也就是高速缓存来使用,也可以作为主数据库使用。
Redis 为什么快
相对于关系型数据库,非关系型数据库不用关注数据完备性问题,他没有复杂的约束,不需要对对SQL进行解析和优化。而且Redis直接操作内存,自然比操作磁盘的普通关系型数据快。
Redis 数据结构
Redis采用5种数据结构进行存储。
结构类型 | 结构存储的值 | 结构读写能力 |
---|---|---|
String | 字符串,整数或者浮点数 | 对整个字符串或者字符串的一部分操作;对整数和浮点数执行自在呢个或者自减 |
List | 一个链表,链表每个节点都包含一个String | 从链表两端推入或者弹出元素,根据偏移量对链表进行修剪,读取单个或多个元素,根据值查找或移除元素 |
Set | 包含String的无序搜集器,并且被包含的每个字符串都是独一无二的 | 添加,删除,修改,查询单个元素;计算交集,并集,差集;从集合中随即获取元素 |
Hash | 包含键值对的无序散列表 | 添加,获取,删除单个键值对;获取所有键值对 |
Zset | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值大小决定 | 添加,获取,删除单个元素;根据分值范围或者成员来获取元素。 |
字符串(Strings)
字符串是在Redis中非常常用的数据结构,有三种操作,分别是GET(获取),SET(设置),DEL(删除),一个字符串最多存储512M字节的内容。并且Redis的字符串是二进制安全的,所以字符串类型可以存储任意类型的数据,包括序列化对象或者一张图片。
命令 | 行为 |
---|---|
GET | 获取存储在给定键值中的值 |
SET | 设置存储在给定键值中的值 |
DEL | 删除给定键值中的值 |
示例
![String使用示例](asset_img redis-string.png)
列表(Lists)
Redis的列表是使用链表实现的,所以可以在头尾进行插入动作,分别是LPUSH插入一个新元素到列表头部,RPUSH插入一个新元素到列表尾部。所以基于链表的特性,无论这个列表有多大,头尾访问的速度是非常快的。但是访问中间的元素很慢,时间复杂度为O(n)。
并且当对一个空的key执行某个命令的时候会创建一个新的列表,如果某个操作清空了一个列表,那么这个key从对应的key空间中删除。
一个列表最多可以包含2^32 - 1 个元素。超过了40亿。
命令 | 行为 |
---|---|
LPUSH | 从队列头部插入一个元素 |
LPOP | 从队列头部弹出一个元素 |
RPUSH | 从队列尾部插入一个元素 |
RPOP | 从队列尾部弹出一个元素 |
LINDEX | 通过下标索引获取元素 |
LLEN | 获取队列长度 |
LSET | 设置队列中某个下标元素的值 |
集合 (Sets)
集合是一个无序的字符串集合,添加,删除,操作的时间复杂度都是O(1)。集合不允许相同元素存在,所以在向集合添加元素时并不需要检查元素是否存在。 一个集合最多可以包含2^32 -1 个元素,超过了40亿。
命令 | 行为 |
---|---|
SADD | 向集合中添加一个或多个成员 |
SCARD | 查询集合的成员个数 |
SISMEMBER key member | 判断member是否是key中的一个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SREM key member | 移除集合中的某个或多个成员 |
哈希(Hash)
哈希是一个strings类型的field和value的映射表,天然适合用于存储对象。
每个哈希可以存储 2^32 -1 个键值对。
命令 | 行为 |
---|---|
HGET key field | 获取hash中的field的值 |
HSET key field alue | 设置hash键和值 |
hgetall key | 获取key的所有hash键值对 |
hdel key field | 删除key的某一个键值 |
有序集合(ZSet)
有序集合和散列类似,都是key-value形式存储,key表示集合的成员,value表示成员的分值,通过分值来进行排序。有序集合依然最大可存储2^32-1个键值对,通过哈希表实现,所以添加,删除,查找的复杂度都是O(1)。
命令 | 行为 |
---|---|
zadd key value member | 向key中加入一个成员以及附分数。 |
zrange key min max withscores | 通过索引区间来返回区间内所有的成员 |
zrangebyscore key min max withscores | 通过分值区间返回区间内的所有成员 |
zrem key member | 移除集合中的某个元素 |
zcount key min max | 计算分值区间内的成员个数 |
zcard key | 获取key的成员个数 |