redis (一、初识)
写在前面的话:最近出于提升自己技术能力的考虑,准备系统的学习一下redis。这里主要是一个记录收获以及摘录干货的作用。学习书籍为《redis 实战》。不感兴趣的战友不必勉强阅读。
什么是redis
redis是一种运行在内存中的高效的非关系型数据库,可以存储5种不同类型的数据类型。并且支持将数据持久化到硬盘中。既能使用复制特性来拓展读性能,也可通过客户端分片来增强写的性能(书上原话,还不懂怎么操作)。最终,我们可以使用redis来打造一个可以包含海量数据、每秒处理上百万请求的系统。当然还可以更优化,但是如果我们的业务能够做到这个量级,已经是非常的成功了。
redis和其他数据库的对比
同样是nosql类型的数据库,memcache经常被拿来与redis做比较。只是做对比的目的往往是为了说明我们为什么要用redis...
首先,因为都是运行在内存里,所以两者的性能方面是相差无几的,但是memcache只能存储普通的字符串类型,而redis可以做到存储五种数据类型,这使得redis可以解决更广泛的问题;再者,redis因为支持数据的持久化,所以在容灾这一方面也是完爆memcache,断电、宕机并不会丢失数据。最后,redis还有一些附加的实用功能,比如发布与订阅,主从复制,脚本等,使得它在nosql里几乎成了必选。
而就现在的现状来讲,很多企业的做法,是以关系型数据库作为主库,然后使用redis作为辅助存储数据库。一般来讲,只有在redis的性能和功能是必须的情况下,我们才会考虑将大量数据存储在redis。这里主要是有一个运营费用的因素在里面。因为reidsi是在内存中运行,会占用比较多的服务器资源,相应的费用会比较贵。
redis数据结构简介
redis可以存储键与五种不同数据结构类型之间的映射。分别是:String(字符串),List(列表),Set(集合),Hash(散列),Zset(有序集合)。
String(字符串):可以是字符串,整数,或者浮点数。我们可以对整个字符串或者字符串的局部进行操作,对整数或浮点数执行自增或者自减操作。
List(列表):一个链表,链表上的每个节点都包含了一个字符串。我们可以从链表的两端推入或者弹出元素,或根据偏移量对链表进行修改,或读取单个or多个数据,根据值去查找或者删除元素。Redis对链表可执行的操作,其实和其他编程语言中的列表操作很类似。lpush和rpush分别用于将元素推入列表的左端(left)和右端(right)。lpop和rpop则是分别用于从列表的左端和右端将元素弹出。lindex命令用于获取链表指定下标的元素,lrange则是用来获取列表中指定范围内的元素。
Set(集合):包含字符串的集合。并且字符串没有重复值。我们可以添加,获取,移除某个元素;也可以计算两个集合之间的交集,并集,差集。也可从集合里随机获取元素。Redis的集合和列表都可以存储多个字符串,而不同之处在于,列表里可以存储多个相同的元素,而集合则是通过散列来保证集合内的字符串都是唯一的。同时,因为集合内的数据排列是无序的,所以我们不能像操作list那样,将元素从某一端加入集合。但是可以使用sadd和srem来对应执行对集合进行添加元素和删除元素的操作。也可以使用SISMEMBER命令来检查集合内元素是否存在。而除去增删改查这些基本操作,集合也有自己的特定命令。比如,SINTER交集计算,SUNION并集计算,SDIFF差集计算。
Hash(散列):包含有键值对的无序散列表。我们可以添加移除获取单键值对,也可获取所有键值对。如果熟悉关系型数据库,我们其实可以把散列看作是关系数据库里面的行。可以进行操作的 典型命令有 hset(在hash里关联给定的键值对),hget(获取指定散列键的值),hgetall(获取所有的键值对),hdel(如果给定键存在,则将其从hash中移除)
Zset(有序集合):字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小确定。我们可以添加获取移除单个元素;也可根据分值范围或成员来获取元素。有序集合和散列一样,都是用来存储键值对、有序集合的键被称为成员(member)。每个成员也是各不相同的;而有序集合的值被称为分值(score),其中分值必须为浮点数。zset是redis里唯一既可以根据成员访问元素,又可以根据分值来访问元素的数据结构。其中,ZADD(将一个带有给定分值的成员添加到有序集合里),ZRANGE(根据元素所处位置,从zset中获取多个元素),ZRANGEBYSCORE(获取ZSET里在给定分值范围内的所有元素),ZREM(如果给定元素存在,则从zest里移除)。
以上列出了五种数据类型以及一些常用的操作。redis的所有高级特性和功能都是基于对这五种数据结构的操作而实现的。比如投票功能。现在很多的网站,比如简书,都有提供对文章进行点赞等投票性质的功能。某种场景下,网站会根据文章的发布时间以及文章获得的投票数量来计算出一个评分,然后根据这个评分来决定如何排序和展示文章。这个就需要结合实操才可以有比较深刻的体会了。等下周吧。