通过前面两篇博客,我们已经知道了NoSql以及redis的安装,今天我们正式介绍redis。
redis简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。
redis 本质上一个 key-value db,所以我们首先来看看他的 key。首先 key 也是字符串类型,但是key 中不能包括边界字符。由于 key 不是 binary safe 的字符串,所以像”my key”和”mykey\n”这样包含空格和换行的 key 是不允许的。顺便说一下在 redis 内部并不限制使用 binary 字符,这是 redis 协议限制的。”\r\n”在协议格式中会作为特殊字符。
1.字符串string
string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个value,其上支持的操作与 Memcached 的操作类似。但它的功能更丰富。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。
2.列表list
list 是一个链表结构, 可以理解为一个每个子元素都是 string 类型的双向链表。 主要功能是 push、pop、获取一个范围的所有值等
其示意图和常用命令如下图所示:
List是一个链表结构,主要功能是push,pop,获取一个范围内的所有值等,我们可以从头部或者尾部添加或者删除元素,这样的list既可以作为栈又可以作为队列。
3.哈希hash
一个哈希实际上是一组键值对的集合,哈希本身的键是“父键”,哈希中包含的若干字段是“子键”,每个“子键”都有相应的值。
我们可以把一个哈希看做关系数据库中的一行,哈希的每个子键对应行的一个字段。因此,当把关系数据库中的数据缓存至Redis时,使用哈希结构可能会带来方便。需要注意的是,哈希结构内部的子键之间是没有顺序关系的。
Hash是一个String类型的field和value的映射表,适合存储对象。
4.集合set
集合中的数据满足唯一性和无序性。集合在Redis内部是用哈希表实现的,所以插入和删除操作的时间复杂度均为O(1)。Redis为集合提供了求交并差等运算命令,使用起来非常方便。
5.集合zset
sorted t set 是有序集合,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。
应用场景
1.按照用户投票和时间排序
2.缓存
3.队列系统
4.实时系统,反垃圾系统等
我们经常玩的微博里面的微博头条用到了list,而像一些粉丝关注一些人用到了set。也正是因为Redis具有多种数据结构,所以应用场景具有很多,我们更愿意称他为数据结构服务器,
我们来分析一个问题,把大象装进冰箱:
1.打开冰箱
2.把大象放进冰箱
3.关闭冰箱
相信大家对于这几个步骤也是非常熟悉的,因为这几个步骤也就是我们访问数据库,对数据库进行CRUD的操作,所需要进行的步骤,连接数据库,进行操作,关闭数据库。
那么我们来分析,如果按照如下图的方式去做,肯定是非常吃力的。
而redis就可以帮助我们解决这些问题,因为Redis数据库提供多种灵活的数据结构和数据操作,为不同的大象构建不同的冰箱。
当我们使用redis以后,我们的应用程序会首先访问redis,如图
当从redis中拿不到数据时,我们的应用程序才会从数据库中读取。
而redis的数据是存储在内存中的,读取速度是比直接访问数据库快的。而这里面就涉及到了redis与其他缓存如memcached的区别,就是持久化,我们下次会讨论redis的持久化。