Redis 学习笔记

前置准备

$ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
$ tar xzf redis-6.2.6.tar.gz
$ cd redis-6.2.6
$ make
$ src/redis-server
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

基础知识

keys * :查询所有的 key

Redis 字符串类型是可以与 Redis 键关联的最简单的值类型。它是Memcached中唯一的数据类型,因此新手在Redis中使用它也是非常自然的。

由于 Redis 键是字符串,因此当我们也将字符串类型用作值时,我们会将一个字符串映射到另一个字符串。

> set mykey somevalue
OK
> get mykey
"somevalue"

请注意,如果键已存在,SET 将替换已存储在键中的任何现有值,即使该键与非字符串值相关联也是如此。

字符串是 Redis 的基本值,您也可以使用它们执行一些有趣的操作。例如,一个是原子增量:

incr:+1 incrby:+val decr:-1 decrby:-val GETSET:重置并返回

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152
> decr counter
(integer) 151
> decrby counter 10
(integer) 141
> getset counter 0
(integer) "100"
> get counter
"0"

mset key val key val mget key key

> mset key1 val1 key2 val2
OK
> mget key1 key2
1) "val1"
2) "val2"

set key val exists key del key type key

> get key1
"val1"
> set key1 val11
OK
> get key1
"val11"
> type key1
string
> exists key1
(integer) 1
> del key1
(integer) 1
> exists key1
(integer) 0

set key val ex 10 EX seconds PX milliseconds

> set key1 100 ex 10
OK
> get key1
(nil)

从非常一般的角度来看,List只是一个有序元素的序列:10,20,1,2,3是一个列表。但是,使用数组实现的列表的属性与使用 _链接列表_实现的列表的属性非常不同。

Redis 列表通过链接列表实现。这意味着,即使您在列表中有数百万个元素,在列表的头部或尾部添加新元素的操作也会 _在恒定时间内_执行。使用 LPUSH 命令将新元素添加到包含 1000 万个元素的列表的头部的速度与将元素添加到包含 1000 万个元素的列表顶部的速度相同。

缺点是什么?在使用 Array 实现的列表中, _按索引_访问元素的速度非常快(常量时间索引访问),而在链表实现的列表中(其中操作需要与被访问元素的索引成比例的工作量)中,访问元素的速度并不快。

Redis列表是用链表实现的,因为对于数据库系统来说,能够以非常快的方式将元素添加到非常长的列表中至关重要。正如您稍后将看到的那样,另一个强大的优势是Redis列表可以在恒定的时间内以恒定的长度进行。

当快速访问大型元素集合的中间很重要时,可以使用不同的数据结构,称为排序集。本教程稍后将介绍已排序的集。

LPUSH :将新元素添加到列表中左侧(在头部)
RPUSH:将新元素添加到列表中右侧(在末尾)
LRANGE:命令从列表中提取元素范围,采用两个索引,即要返回的范围的第一个元素和最后一个元素。两个索引都可以为负数,告诉 Redis 从末尾开始计数:所以 -1 是最后一个元素,-2 是列表的倒数第二个元素,依此类推。

> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

Redis Lists 定义的一个重要操作是 _弹出元素_的功能。弹出元素是同时从列表中检索元素和从列表中消除元素的操作。您可以从左侧和右侧弹出元素,类似于在列表两侧推送元素的方式:

RPOP:从右侧弹出
LPOP:从左侧弹出
没有值了返回(nil),且这个 key 也将不存在。

> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
> rpop mylist
"B"
> lrange mylist 0 -1
1) "first"
2) "A"
> lpop mylist
"first"
> lrange mylist 0 -1
1) "A"
> lpop mylist
"A"
> lpop mylist
(nil)
  • 记住用户发布到社交网络中的最新更新。
  • 每次用户发布新照片时,我们都会将其ID添加到LPUSH列表中。
  • 当用户访问主页时,我们使用以获取最新的10个已发布项目。 LRANGE 0 9
  • 进程之间的通信,使用使用者-生产者模式,其中生产者将项目推送到列表中,消费者(通常是 工作线程)使用这些项目和执行的操作。Redis 具有特殊的列表命令,使此用例更加可靠和高效。

LTRIM 命令类似于 LRANGE,但它 不显示指定的元素范围,而是将此范围设置为新的列表值。给定范围之外的所有元素都将被删除。

LTRIM:只保留指定范围内的值,范围外的值全部删除。

> rpush mylist 1 2 3 4 5 6
(integer) 6
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"

列表具有一个特殊功能,使它们适合于实现队列,并且通常作为进程间通信系统的构建块:阻塞操作。

使用 LPUSH 和 RPOP 进行操作时列表可能为空,无需处理任何内容,因此 RPOP 仅返回 NULL。在这种情况下,使用者被迫等待一段时间,然后使用 RPOP 重试。这称为 轮询,在此上下文中不是一个好主意,因为它有几个缺点:

  • 强制 Redis 和客户端处理无用的命令(当列表为空时,所有请求都不会完成任何实际工作,它们只会返回 NULL)。
  • 为项目的处理添加延迟,因为在工作线程收到 NULL 后,它会等待一段时间。

因此,Redis实现了称为 BRPOP 和 BLPOP 的命令,它们是 RPOP 和 LPOP 的增强版本,能够在列表为空时阻止:只有当将新元素添加到列表中或达到用户指定的超时时,它们才会返回给调用方。

BRPOP key [key …] timeout
BLPOP key [key …] timeout

> brpop mylist 5
1) "mylist"
2) "3"
> brpop mylist 5
1) "mylist"
2) "2"
> brpop mylist 5
(nil)
(5.02s)

Redis 哈希与字段值对的”哈希”外观完全一致:

HMSET key field value [field value …]
HGET key field
HMGET key field [field …]
HINCRBY key field increment

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hmget user:1000 username
1) "antirez"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"
> hget user:1000 username birthyear
(error) ERR wrong number of arguments for 'hget' command
> hmget user:1000 username birthyear
1) "antirez"
2) "1977"
> HINCRBY user:1000 birthyear 10
(integer) 1987

Redis Sets 是字符串的无序集合。SADD 命令将新元素添加到集合中。还可以对集合执行许多其他操作,例如测试给定元素是否已经存在,执行多个集合之间的交集,并集或差异等。

SADD key member [member …]

> sadd myset Hello
(integer) 1
> sadd myset World
(integer) 1
> sadd myset World
(integer) 0
> smembers myset
1) "World"
2) "Hello"

SISMEMBER key member

> smembers myset
1) "World"
2) "Hello"
> sismember myset World
(integer) 1
> sismember myset test
(integer) 0

集合适用于表示对象之间的关系。例如,我们可以很容易地使用集合来实现标签。

> sadd news:1000:tags 1 2 5 77
(integer) 4
> smembers news:1000:tags
1) "1"
2) "2"
3) "5"
4) "77"
> sadd key1 a b c
(integer) 3
> sadd key2 c y h
(integer) 3
> SINTER key1 key2
1) "c"

SUNIONSTORE destination key [key …]

> SMEMBERS key1
1) "c"
2) "b"
3) "a"
> SMEMBERS key2
1) "c"
2) "h"
3) "y"
> SUNIONSTORE key1+2 key1 key2
(integer) 5
> SMEMBERS key1+2
1) "c"
2) "h"
3) "b"
4) "a"
5) "y"

SPOP key [count]:取出元素的同时会将元素从集合中删除

SRANDMEMBER key [count]:之取出元素,不做其他操作

> SMEMBERS key1+2
1) "h"
2) "c"
> SRANDMEMBER key1+2
"h"
> SMEMBERS key1+2
1) "h"
2) "c"
> SMEMBERS key1+2
1) "h"
2) "c"
> SCARD key1+2
(integer) 2

排序集合是一种数据类型,类似于 Set 和 Hash 之间的混合。与集合一样,排序集由唯一的、非重复的字符串元素组成。

但是,虽然集合中的元素没有排序,但排序集中的每个元素都与一个称为 _分数的_浮点值相关联(这就是为什么类型也类似于哈希,因为每个元素都映射到一个值)。

此外,排序集中的元素是 按顺序排列的(因此它们不是根据请求排序的,顺序是用于表示排序集的数据结构的一个特点)。它们根据以下规则进行排序:

  • 如果 A 和 B 是两个具有不同分数的元素,则 A > B,如果 A.分数> B.分数。
  • 如果 A 和 B 的分数完全相同,则 A > B,如果 A 字符串在字典上大于 B 字符串。A 和 B 字符串不能相等,因为排序集只有唯一元素。

ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]

  • XX:仅更新已存在的元素。不要添加新元素。
  • NX:仅添加新元素。不要更新现有元素。
  • LT:仅当新分数 小于当前分数时,才会更新现有元素。此标志不会阻止添加新元素。
  • GT:仅当新分数 大于当前分数时,才会更新现有元素。此标志不会阻止添加新元素。
  • CH:修改返回值,从添加的新元素的数量,到更改的元素总数(CH是 changed 的缩写)。更改的元素是 添加的新元素和已 更新分数的现有元素。因此,在命令行中指定的元素与过去具有相同分数的元素不计算在内。注意:通常 ZADD 的返回值仅计算添加的新元素的数量。
  • INCR:当指定此选项时 ZADD 的行为类似于 ZINCRBY 。在此模式下只能指定一个分数元素对。

注意: GTLTNX 选项是互斥的。

> zadd hackers 1940 "Alan Kay" 1957 "Sophie Wilson" 1953 "Richard Stallman" 1949 "Anita Borg" 1965 "Yukihiro Matsumoto" 1914 "Hedy Lamarr" 1916 "Claude Shannon"
(integer) 7
> zrange hackers 0 -1
1) "Hedy Lamarr"
2) "Claude Shannon"
3) "Alan Kay"
4) "Anita Borg"
5) "Richard Stallman"
6) "Sophie Wilson"
7) "Yukihiro Matsumoto"
> zrange hackers 0 -1 WITHSCORES
 1) "Hedy Lamarr"
 2) "1914"
 3) "Claude Shannon"
 4) "1916"
 5) "Alan Kay"
 6) "1940"
 7) "Anita Borg"
 8) "1949"
 9) "Richard Stallman"
10) "1953"
11) "Sophie Wilson"
12) "1957"
13) "Yukihiro Matsumoto"
14) "1965"

Original: https://www.cnblogs.com/lhnstart/p/16046991.html
Author: 李小龙他哥
Title: Redis 学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588714/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球