0%

Redis(一)——初识Redis

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的成员个数