天天看点

Redis入门指南笔记

redis 

Redis是采用字典结构以键值对的形式存储数据的

看了redis入门指南,收获颇多

_______________String:

首先:字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来

说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,而集合类型是以

集合的形式组织字符串

常用命令:

set get 

incr -> key 当字符串的值为整数形式时,当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。当键值不是整数时Redis会提示错误。

APPEND key value 向尾部追加值 返回值是字符串的总长度

STRLEN key:获取字符串的长度

MGET MSET 同时设置/获得多个键值

***********具体实践:

1.文章访问量统计:每次访问文章的时候使用INCR命令使相应的键值

递增。

2.生成自增ID:那么怎么为每篇文章生成一个唯一ID呢?在关系数据库中我们通过设置字段属性为

AUTO_INCREMENT来实现每增加一条记录自动为其生成一个唯一的递增ID的目的,而在

Redis中可以通过另一种模式来实现:对于每一类对象使用名为对象类型(复数形式):count① 的

键(如users:count)来存储当前类型对象的数量,每增加一个新对象时都使用INCR命令递增该

键的值。由于使用INCR命令建立的键的初始键值是1,所以可以很容易得知,INCR命令的返回

值既是加入该对象后的当前类型的对象总数,又是该新增对象的ID。

3.存储文章数据:由于每个字符串类型键只能存储一个字符串,而一篇博客文章是由标题、正文、作者与发布时间等多个元素构成的

++++++++++++++++++++++hash 

*****除了散列类型,Redis的其他数据类型同样不支持数据类型嵌套。比如集合类型

的每个元素都只能是字符串,不能是另一个集合或散列表等。

散列类型,最有特点的就是它可以很方便存储对象,使用

对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。例如要存储ID为2 的汽车对象,可以分别使用名为color。name和price的三个字段来存储该辆汽车的颜色,名称和价格。

例: color   黄色

car:2 name 本田

price 90万

命令:

HSET key field value

HSET命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字

段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插入操作

时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已经存

在)HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它

HGET key field

判断字段是否存在

HEXISTS key field

HEXISTS命令用来判断一个字段是否存在。如果存在则返回1,否则返回0(如果键不存在

也会返回0).

HSETNX key field value

HSETNX命令与HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不执行

任何操作。当字段不存在时赋值

HDEL key field

HMGET HMSET key field value

HGETALL

只获取字段名或字段值

HKEYS key

HVALS key

获得字段数量

HLEN key 

实践:

1.存储文章数据

获取指定的字段  存的时候按照字段划分存储

2.存储文章缩略名

((((((((((((((((list列表类型

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时

间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的

列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的

10条记录的速度是一样的)。

不过使用链表的代价是通过索引访问元素比较慢,设想在iPad mini发售当天有1000个人

在三里屯的苹果店排队等候购买,这时苹果公司宣布为了感谢大家的排队支持,决定奖励排

在第486位的顾客一部免费的iPad mini。为了找到这第486位顾客,工作人员不得不从队首一个

一个地数到第486个人。但同时,无论队伍多长,新来的人想加入队伍的话直接排到队尾就好

了,和队伍里有多少人没有任何关系。这种情景与列表类型的特性很相似。

这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜

事,我们关心的只是最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获取

其中最新的100条数据也是极快的。同样因为在两端插入记录的时间复杂度是0(1),列表类型

也适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。

借助列表类型,Redis还可以作为队列使用。

与散列类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳232-1个元素

命令:::

向列表两端增加元素

LPUSH key value[value...]

RPUSH   key value[value...]

LPUSH 命令用来向列表左边插入元素,返回值表示增加元素后列表的长度。

LPUSH命令还支持同时增加多个元素

从列表两端弹出元素

RPOP key

LPOP命令可以从列表左边弹出一个元素。

LPOP命令执行两步操作:第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值

&&***&&&&&&&&&&&&&&&&&

结合上面提到的4个命令可以使用列表类型来模拟栈和队列的操作:如果想把列表当做

栈,则搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想当成队列,则搭配使用LPUSH和RPOP或RPUSH和LPOP。

获取列表中元素的个数

LLEN key 当键不存在时LLEN会返回0

LLEN命令的功能类似SQL语句SELECT COUNT(*) FROM table_name,但是LLEN的时间复杂度为0(1),使用时Redis会直接读取现成的值,而不需要像部分关系数据库(如使用InnoDB存储引擎的MySQL表)那样需要遍历一遍数据表来统计条目数量。

获得列表片段

LRANGE key

LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。LRANGE命令将返回索引从start到stop之间的所有元素(包含两端的元素)。与大多数人的直觉相同,Redis的列表起始索引为0。

删除列表中指定的值

LREM key count value 

LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异:

●当count>0时LREM命令会从列表左边开始删除前count个值为value的元素;

●当count<0时LREM 命令会从列表右边开始删除前|count|个值为value的元素;

●当count=0是LREM命令会删除所有值为value的元素

获得/设置指定索引的元素值

LINDEX key index 

LSET key index value

实践:

1.存储文章ID列表

2.存储评论列表

在博客中还可以使用列表类型键存储文章的评论。由于小白的博客不允许访客修改自己发表的评论,而且考虑到读取评论时需要获得评论的全部数据(评论者姓名,联系方式,评论时间和评论内容),不像文章一样有时只需要文章标题而不需要文章正文。所以适合将一条评论的各个元素序列化成字符串后作为列表类型键中的元素来存储

**********(((((((((((()))))))))set集合类型

集合类型和列表类型对比:

集合            列表

存储内容: 至多2^32-1个字符串  至多2^32-1个字符串

有序性: 否 是

唯一性: 是 否

集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合

类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是

0(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算。

命令:

添加/删除元素

SADD key member[member...]

SREM key member[member...]

SADD命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个

集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。本

命令的返回值是成功加入的元素数量(忽略的元素不计算在内).

获得集合中的所有元素

SMEMBERS key 返回集合中的所有元素。

判断元素是否在集合中

SISMEMEBER key member

集合间运算

SDIFF key [key …]

SINTER key [key …]

SUNION key [key …]

获得集合中元素个数

SCARD key

随机获得集合中的元素

SRANDMEMBER key [count]

从集合中弹出一个元素

SPOP key

%%%%%%%%%%%%%%%%%ZSET有序集合类型

有序集合类型(sorted set)的特点从它的名字中就可以猜到,它与上一节介绍的集合类型

的区别就是“有序”二字。

在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们

不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高

(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元

素都是不同的,但是它们的分数却可以相同。

有序集合类型在某些方面和列表类型有些相似。

(1)二者都是有序的。

(2)二者都可以获得某一范围的元素。

但是二者有着很大的区别,这使得它们的应用场景也是不同的。

(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问

中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的

应用。

(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分

的数据速度也很快(时间复杂度是O(log(N)))。

(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分

数)。

(4)有序集合要比列表类型更耗费内存

命令:

ZADD key score member [score member...]

ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会

用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前

已经存在的元素)。

获得元素的分数

ZSCORE key member

获得排名在某个范围的元素列表

ZRANGE key start stop [WITHSCORES]

ZREVRANGE key start stop [WITHSCORES]

获得指定分数范围的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZRANGEBYSCORE命令参数虽然多,但是都很好理解。该命令按照元素分数从小到大的

顺序返回分数在min和max之间(包含min和max)的元素

增加某个元素的分数

ZINCRBY key increment member

ZINCRBY命令可以增加一个元素的分数,返回值是更改后的分数。

获取集合中元素的数量:

ZCARD key

获取指定分数范围内的元素个数

ZCOUNT key min max

删除一个或多个元素

ZREM key member [member …]

ZREM命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)。

ZREMRANGEBYRANK key start stop

ZREMRANGEBYRANK命令按照元素分数从小到大的顺序(即索引0表示最小的值)删除

处在指定排名范围内的所有元素,并返回删除的元素数量

按照分数范围删除元素

ZREMRANGEBYSCORE key min max

ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,参数min和max的特性

和ZRANGEBYSCORE命令中的一样。返回值是删除的元素数量

ZRANK key member

ZREVRANK key member

ZRANK命令会按照元素分数从小到大的顺序获得指定的元素的排名(从0开始,即分数最

小的元素排名为0)。

实践:

1.实现按点击量排序

每次用户访问一篇文章时,博客程序就通过“ZINCRBY posts:page.view 1文章

ID”更新访问量。