美文网首页
《Redis实战》--读书笔记--第1章

《Redis实战》--读书笔记--第1章

作者: MR_ChanHwang | 来源:发表于2017-10-02 02:46 被阅读0次

《Redis实战》--读书笔记

时间:2017年10月02日01:13:48

第1章

共有五种结构

①String②List③SET④HASH⑤ZSET(有序集合)

①String(字符串)

数据结构为:

+--hello(键名)----string(值的类型)-----+
|   world(值)                        |
|                                    |
+---------------+--------------------+

其中有以下操作命令

命令 行为
set 获取存储在给定键中的值
get 设置存储在给定键中的值
del 删除存储在给定键中的值(这个命令可以用于所有类型)

②List(列表)

一个列表结构可以有序地存储多个字符串。

+--list-key(键名)---------list---+
|item                           |
|item2                          |
|item                           |
|                               |
+-------------------------------+

操作办法

命令 行为
rpush 将给定值推入列表的右端
lrange 获取列表在给定范围上的所有值
lindex 获取列表在给定位置上的单个元素
lpop 从列表的左端弹出一个值,并返回被弹出的值

③Set(集合)

​ redis的集合和列表都可以存储多个字符串,他们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保重自己存储的每个字符串都是不同的(这些散列表只有键,但没有与键相关联的值)。

数据结构

+--list-key(键名)---------set---+
|item                           |
|item2                          |
|item3                          |
|                               |
+-------------------------------+

不可重复。

命令 行为
sadd 将给定元素添加到集合
smembers 返回集合包含的所有元素
sismembers 检查给定元素是否存在于集合中
srem 如果给定的元素存在于集合中,那么移除这个元素

④Hash(散列,也就是Java中的Map)

​ Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。

数据结构:

+--hash-key------------------hash---+
|sub-key1       |   value1          |
|sub-key2       |   value2          |
|sub-key3       |   value3          |
|               |                   |
+---------------+-------------------+
命令 行为
hset 在散列里面关联起给定的键值对
hget 获得指定散列键的值
hgetall 获取散列包含的所有键值对
hdel 如果给定键存在于散列里面,那么移除这个键

⑤Zset(有序集合)

​ 有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是各不相同的;而有序集合的值则被称为分值(score),分值必须为浮点数。有序集合是redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的结构。

数据结构:

+--zset-key--------zset-+
|member1        |   728 |
|member2        |   982 |
|               |       |
+---------------+-------+
命令 行为
zadd 将一个带有给定分值的成员添加到有序集合里面
zrange 根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
zrangebyscore 获取有序集合在给定分值范围内的所有元素
zrem 如果给定成员存在于有序集合,那么移除这个成员

收获一、在redis中实现原子性自增或自减

例如一个Map中,假设为文章article:1,有一个属性为votes(用户投票数)。此时用户给他投了一票。那么我就可以使用hincrby函数使此字段自增加一。

+--article:1---------------------hash---+   +--article:1---------------------hash---+
|title          |   Go to statement     |   |title          |   Go to statement     |
|               |   considered harmful  |   |               |   considered harmful  |
|link           |   http://goo.gl/kZUSu |   |link           |   http://goo.gl/kZUSu |
|poster         |   user:83271          |   |poster         |   user:83271          |
|time           |   1331382699.33       |   |time           |   1331382699.33       |
|votes          |   528                 |==>|votes          |   529                 |
|               |                       |   |               |                       |
+---------------+-----------------------+   +---------------+-----------------------+
conn.hincrby('article:1','votes',1)

而我们不需要将此字段从redis中取出,也不需要重新执行+1的操作,也不需要保证事务的原子性,因为函数本身保证了事务的原子性。votes即变为529

同样的,在一个有序集合中,我们需要对某一个有序集合中的某一个元素的score执行增加操作,同样可以调用另一个类似的方法:

+--score:--------------------zset---+           +--score:--------------------zset---+
|article:1      |   1332164063.49   | =========>|article:1      |   1332164495.49   |
|articel:100    |   1332174713.47   |           |articel:100    |   1332174713.47   |
|···            |                ···|           |···            |                ···|
+---------------+-------------------+           +---------------+-------------------+
conn.zincrby('score:','article:1',432)

这样,我们就对score:这个有序集合中的article:1对象的score增加了432的权重。


收获二、一次性赋值Map函数—hmset

我们一般对Map进行操作都是使用put。但是如果多次对redis中的hash进行put,既浪费性能也浪费时间。故如果我们需要对redis中的hash进行键值对赋入的话,可以使用hmset函数。

conn.hmset('article:22',{
  'title':title,
  'link':link,
  'poster':poster,
  'time':now,
  'votes':1
})

如上代码:实现了对article:1的初始化各个属性值。

即:

+--article:22--------hash---+
|title          |   title   |
|link           |   link    |
|poster         |   poster  |
|time           |   now     |
|votes          |   1       |
|               |           |
+---------------+-----------+

收获三、集合和有序集合取交集

假设第一个set集合名字叫做groups:programming,里面存储的是文章的分类,例如科技板块文章三篇。

第二个有序集合名字叫做score:,里面存储的是所有文章的评分。

+--groups:programming-----set---+   +--score:----------------zset-------+
| article:92617                 |   |article:83729  |   1330425826.28   |
| article:100408                |   |article:92617  |   1331147511.67   |
| article:83729                 |   |article:100635 |   1332164063.49   |
|                               |   |article:100408 |   1332174713.47   |
+-------------------------------|   |article:100716 |   1332225027.26   |
                                    |···            |               ··· |
                                    |               |                   |
                                    +---------------+-------------------+

现在执行zinterstore操作

conn.zinterstore('score:programming', ['groups:programming','score:'], aggregate=max)

这样左联即可得到一个新的zset名为score:programming

+--score:programming--------zset---+
|article:83729  |   1330425826.28   |
|article:92617  |   1331147511.67   |
|article:100408 |   1332174713.47   |
|               |                   |
+---------------+-------------------+

以此来实现左联的效果,实现了指定文章的群组查看这些文章的评分。


相关文章

网友评论

      本文标题:《Redis实战》--读书笔记--第1章

      本文链接:https://www.haomeiwen.com/subject/rpdzextx.html