redis最基础的入门教程


 

 

    • Redis最基础入门教程
      • 简介
  • Redis 简介
    • Redis 优势
    • Redis与其他key-value存储有什么不同?
      • 字符串(Strings)
      • 哈希(Hash)
      • 列表(List)
      • 集合(Sets)
      • 有序集合(sorted sets)
      • 发布消息/订阅频道
      • 结语
http://try.redis.io/

下面是一段来自于菜鸟教程的介绍

这篇

Redis hash 是一个string类型的field和value的映射表(key任然为key),hash特别适合用于存储对象,每个 hash 可以存储 232 - 1 键值对(43多亿)。使用Hash表不仅能够减少Redis中key的个数,还能优化存储空间,占用的内存要比字符串小很多。

下面是redis的存储示意图:

 


 

添加数据:

一次添加一个键值对数据:

hset key field value

一次添加多个键值对数据:

hmset key field1 value1 [field2 value2 ]

当然如果我们不想对已经存在的field进行修改

hsetnx key field value

获得数据:

获得一个字段的值:

hget key field

获得多个字段的值:

hmget key field1 [field2]

获得所有的字段名和值

hgetall key

当然我们也可以分别获得所有的field获得value

hvals key

hkeys key

判断是否存在某字段

HEXISTS key field

如果字段存在则返回1,如果不存在则返回0

获得哈希表中字段的数量

hlen key

接下来我就不再使用python实现这些东西了,会更多的来介绍各种结构的特点。如果想了解更多的指令可以看菜鸟教程

列表(List)

列表是一种很神奇的结构,可以把列表成一根水管,数据从可以从一边进,然后从另外一边出来(当然,那一边即可以进又可以出,只不过顺序不同而已)。那么这种结构有什么用处呢?我们可以以发消息为例。发消息我们需要保证消息到达的顺序,那么我们是不是就可以使用列表了呢?例如:发送消息从左边进,接受消息从右边得到。下面介绍几个简单的指令:

插入数据

l代表left(左),r代表right(右)

从左边插入数据

lpush key value

从右边插入数据

rpush key value

获得列表的长度

注意下面的第一个l并不是代表left,而是代表list

llen key

查看数据

lrange key 开始索引 结束索引

索引从最左边开始编号,意思就是最后一个lpush的数据的索引是0(将列表想成一个小水管就行)。如果开始索引和结束索引一样,就返回索引位置的值。那么如果从右边开始呢?使用“负索引”即可。其中**-1**代表最右边的数据。-2代表最右边的第二个数据。

弹出数据

弹出最左边的数据

lpop key

弹出最右边的数据

rpop key

弹出数据和查看数据的差别在于,弹出数据的同时也会将数据进行删除。

集合(Sets)

这个集合和数学中的集合有着差不多的概念。怎么说呢?在redis的集合中,数据是无序的不能重复

添加数据:

s代表集合(set)

sadd key value1 value2 value3……

获得集合中元素的数量

如果不存在这个集合则返回0

scard key

从集合中获取数据

spop key count

前面我们说道,集合是无序的,所以spop的获取也是无序的。(获得数据后会将数据删除)count代表获取几条数据。

这个是获得集合的所有数据(并不会删除数据)。不过这个命令在生产环境中最好不要使用,因为数据量大的话你的服务器可能就炸了。

SMEMBERS key

判断数据是否存在

sismember key value

存在返回1,否则返回0

删除数据

srem key value1 value2……

下面便是数学上面的知识了

取交集

sinter key1 key2……

取并集

sunion key1 key2……

取差集

sdiff key1 key2……

有序集合(sorted sets)

有序集合,顾名思义就是集合里面的数据是有序的。那么它有什么含义呢?我们想象一下,在一个高并发的场景中,数据是一直更新的,如果我们将数据存到数据库中,如果需要实时获取排名的话,那么肯定会对数据的性能造成很大的影响。毕竟数据量越大,排序时间也就越缓慢。和集合不同的是,有序集合的元素会关联一个double类型的分数,其中元素不能重复,但是分数可以重复。

添加数据

zadd key score1 member1 [score2 member2]

前面说过,score必须为double类型,所以如果输入非double则会报错。

修改数据

修改数据可以使用zadd进行修改数据的分数,同时可以添加NX参数

zadd key NX sorce member

还可以使用zincrby对数据对数据的分数进行加减操作

ZINCRBY key 改变量 member

其中改变量既可以为正数也可以为负数。如果member不存在则会创建,member的分数和改变量一致。

获取数据

基于评分范围内的排序

  1. 从小到大排序

zrangebyscore 有序集合名 评分下限 评分上限 [withsores limit 切片开始位置 结果数量]

  1. 从大到小排序

zrevrangebyscore 有序集合名 评分下限 评分上限 [withsores limit 切片开始位置 结果数量]

其中使用括号括起来的代表可以省略,如果withsores省略代表只返回值,不返回评分。省略“limit 切片开始位置 结果数量”代表不对结果进行切片。

基于位置的排序

  1. 从小到大排序

    位置是从零开始的

    zrange 有序集合名 开始位置(含) 结束位置 (含)[withsores]

  2. 从大到小排序

    zrevrange 有序集合名 开始位置(含) 结束位置 (含)[withsores]

获得排名

zrank 有序集合名 值

zrevrank 有序集合名 值

zrank 和 zrevrank的区别在于,zrank排名是从0开始的,评分越小则排名越靠近0,评分最小的值排名为0。而zrevrank则是评分越大则越靠近0。相同点在于如果值不存在则返回None。

获得一个值的评分

zscore 有序集合名 值

如果一个值不存在则返回None。

查看某个评分范围内的值有多少

zcount 有序集合名 评分下限 评分上限

发布消息/订阅频道

我们来说一个场景,还是以前面的发消息场景为例,如果服务端的消息在进行更新,那么我们如何更新客户端的信息呢?按照前面的方法,我们只有使用轮询查询的方式,按照一定的时间(比如说1s)检查redis,看消息是否发生改变,如果消息发生了改变,则客户端进行更新,那么接下来就会有以下的问题:

  1. 不停地检查redis,耗费系统资源
  2. 使用轮询查询,消息会有延时
  3. 即使1s(轮询的时间)中发送了5条消息,那么客户端只会发生一次改变。

这个时候我们就是可以使用redis的“发布/订阅”模式实现消息通信。

  • 发布:消息的发布者
  • 订阅:消息的接受者,可以为1个也可以为多个

发布消息

publish 频道名 信息

订阅频道

subscribe 频道名1 频道名2……

其中会返回3条消息:第一条是信息的类型,第二条是频道名,第三条是被发布的内容。其中需要注意,只能接受目前的消息,新加入的订阅是没办法接受到以前的订阅的。

结语

以上便是redis的一个很简单的入门教程。只介绍了redis的简单使用和一些基本操作,至于redis命令中更复杂的指令,百度或者google就行了。对于redis,我觉得我们(作为一个学生)应该关注的是redis为什么能够如此优秀?里面用了什么数据结构,以及如何能够将redis应用到高并发的场景中,怎么实现多服务器数据的保存以及备份问题。