redis 第4章 5种数据结构 redis 第4章 5种数据结构

2021-06-10

一、string 字符串类型

①、简介

普通键值对存储,一个键对应一个值。

②、字符串结构

[
    "lulubin1":"90",
    "lulubin2":"100",
    "lulubin3":"90"
]

③、操作方法

string类型应该是操作最为简单的一种了。我们可以使用get来获取值,set设置值,del来删除值。

https://file.lulublog.cn/images/3/2022/08/z401Essk7J37Z87K01P1eZKY1E4m0a.png

④、演示(命令行 + PHP演示)

  • 命令行:

设置值,成功返回 ok

set lulubin 90// ok

获取值,成功返回 对应的值

get lulubin // "90"

删除值,成功返回 被删除的数量

del lulubin // (integer) 1

再次获取被删除的lulubin,获取不到,返回 nil

get lulubin // (nil)
  • PHP版本演示

第一步,链接redis数据库

$redis = new Redis(); // 实例化
$redis->connect(127.0.0.1, 6379); // 连接redis数据库
//$auth = $redis->auth("myRedis"); //设置密码

设置值,成功返回 boolean true

$redis->set("lulubin","90"); // 设置一个值,成功返回true

获取值,成功返回:值的内容

$redis->get("lulubin"); // "90"

删除值,成功返回:被删除的个数

$redis->delete("lulubin"); // 成功返回 1

再次获取lulubin,无法获取,返回false

$redis->get("lulubin"); // boolean false

二、set集合类型

①、简介

set集合和list列表十分的相似,都可以存储多个字符串。但是list列表可以存储重复值,而set集合中不可重复。

②、集合结构

其中的user为键名,其可以包含多个 不重复 的元素,各不相同

[
    "user":[
        "lulubin1",
        "lulubin2",
        "lulubin3"
    ]
]

③、操作方法

https://file.lulublog.cn/images/3/2022/08/nrQzuqEbQlw07BB0C6QJRQHVq0ozZ7.png

④、演示(命令行 + PHP演示)

命令行:

添加一个元素到集合,返回 1代表插入成功;0元素代表已经存在

sadd set-key lulubin1 // 返回 1

同理,再添加元素到集合

sadd set-key lulubin2 // 返回1,表示插入成功,集合内没有该元素
sadd set-key lulubin3 // 返回1
sadd set-key lulubin1 // 返回0,表示插入失败,集合内已经存在

添加完了之后,我们来获取集合内全部的元素,成功返回 全部元素

smembers set-key // 得到结果:"lulubin1","lulubin2","lulubin3",由于元素不能重复,所以最后一个lulubin1不存在集合中

下面介绍这个集合的重要功能,使用sismember命令 检查元素是否在集合中 , 存在返回1,不存在返回0

sismember set-key lulubin4// 由于lulubin4不在集合中,所以返回 0
sismember set-key lulubin1 // lulubin1元素是存在于集合中的,返回1;同理lulubin2,lulubin3也是会返回1

下面我们尝试删除一个元素,如果删除成功过后,会返回 被删除元素的个数

srem set-key lulubin1 //删除成功,返回删除个数:1
srem set-key lulubin1 // lulubin1之前已经被删除,所以删除失败,返回个数0。这里不是表示true or false

我们再次检查所有元素,发现只剩下lulubin2,lulubin3

smembers set-key // 返回"lulubin2","lulubin3"
  • PHP版本演示

我们先插入一个元素lulubin1到set-key集合。1代表插入成功;0元素代表已经存在

$redis->sadd("set-key","lulubin1"); // 添加成功,返回1

接下来,我们再次添加一次lulubin1到set-key集合,发现已经存在,并且 返回了0

$redis->sadd("set-key","lulubin1"); // 集合中已经存在lulubin1,添加失败,返回0

为了下面演示,我们在添加几个元素

$redis->sadd("set-key","lulubin2");
$redis->sadd("set-key","lulubin3");

现在集合中有3个元素了,我们使用smembers命令全部取出

$r = $redis->smembers("set-key");
var_dump($r);

打印过后,我们获取了一个包含lulubin1,lulubin2,lulubin3的数组

array (size=3)
  0 => string "lulubin1"
  1 => string "lulubin2"
  2 => string "lulubin3"

下面我们使用sismember命令来检查一个元素是否存在于集合中,这个在 检查如昵称是否已经存在 时候非常有用

$redis->sismember("set-key","lulubin1"); //该元素存在集合中,则为 boolean true,反之boolean false

最后,还是删除一个元素。假设是lulubin1,第一次删除,该元素存在于集合,则返回 被删除的个数1

$redis->srem("set-key","lulubin1"); // int 1

这时,我们再次执行删除命令,由于元素已经不存在集合,所以,返回 被删除0个

$redis->srem("set-key","lulubin1"); // int 0

三、zset 有序集合

①、简介

  • Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

  • 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • 有序集合的成员是唯一的,但分数(score)却可以重复。

  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

②、字符串结构

[
    "user":[
        "lulubin1":90,
        "lulubin2":100,
        "lulubin3":90
    ]
]

③、操作方法

https://file.lulublog.cn/images/3/2022/08/bor6mRzMdmo9dC0XdpnY08CFM8nrpz.png

④、演示(命令行 + PHP演示)

  • 命令行:

首先,我们添加一个键值对到有序集合。如果 成功则返回1;如果键已经存在,返回0

zadd zset-key 90 "lulubin1" // 返回 1

我们再添加一个不存在的键值对

zadd zset-key 100 "lulubin2" // 返回 1

这个时候,有序集合中已经存在键lulubin1和lulubin2,接下来我们再添加一个相同的键lulubin1到散列中,看看会发生什么:

zadd zset-key 90 "lulubin1"  // 返回 0,由于该键已经存在

下面我们通过hscore获取一个给定键lulubin1的值。

zscore zset-key "lulubin1" // "90"

成功获取了一个值。我们再获取添加的所有元素看看,刚刚的到底添加了哪几个值

zrange zset-key 0 -1 withscores

其结果如下。我们发现,第一个结果为第一个键值对的键,第二个结果为键值对的值,以此类推,每两个为一组。

"lulubin1"
"90"
"lulubin2"
"100"

下面我们试着删除一个键试试,我们会发现如果 该键之前存在于有序集合中,那么删除时候则返回1,否则,返回0

zrem zset-key "lulubin1" // 该键之前存在于散列,返回1

我们再试着删除一次lulubin1,发现当删除 不存在的键的时候,返回结果0

zrem zset-key "lulubin1"

我们再次获取全部键值对,看看还剩些什么。

zrange zset-key 0 -1 withscores

其结果为,少了两个结果,毕竟刚刚删除了一个键值对

"lulubin2"
"100"
  • PHP版本演示

我们先插入一个键值对到zset-key有序集合。1代表插入成功;0元素代表已经存在

$redis->zadd("zset-key","lulubin1",90); // int 1,元素插入成功,之前不存在该键

我们再次插入相同键值对

$redis->zadd("zset-key","lulubin1",90); // int 0,元素插入失败,该键已经存在

为了下面的演示使用,我们继续插入一些其他的值

$redis->zadd("zset-key","lulubin2",100); // int 1

下面我们使用zscore获取键对应的值。我们试试获取lulubin的值。

$redis->zscore("zset-key","lulubin1"); // "90"

获取了一个后,我们在尝试使用zrange获取刚刚插入的全部值,看看里面包含哪些键值对

$redis->zrange("zset-key",0,-1,true);

获得结果,是一个包含完整键值得数组

array (size=2)
  "lulubin1" => float "90"
  "lulubin2" => float "100"

查看完了所有的键值对,我们尝试删除其中一个键。 如果之前键存在于有序集合中,则返回1,反之,返回0

$redis->zrem("zset-key","lulubin1"); // 该键之前存在,返回int 1

我们再次尝试删除lulubin键,发现其返回0. 则说明该键不存在集合中,删除失败

$redis->zdel("zset-key","lulubin1"); // 该键不存在,返回int 0

下面我们使用zrange查看下散列中还剩余的所有键值对

$redis->zrange("zset-key",0,-1,true);

发现,只返回了包含一个键值对的数组。

array (size=1)
  "lulubin2" => float "100"

原因即是,刚刚lulubin1已经被删除。

四、hash散列类型

①、简介

  • hash散列类似于一个小型的Redis数据库

  • 一个散列可以包含多个键值对

  • 散列的每个键都不能重复,各不相同,无序排列

  • 其值可以是字符串或数字值

  • 对于数字值,可以执行自增或者自减操作

②、字符串结构

[
    "user":[
        "lulubin1":"90",
        "lulubin2":"100",
        "lulubin3":"90"
    ]
]

③、操作方法

https://file.lulublog.cn/images/3/2022/08/b098ZoOE2oB0C2Wj5z27O2CO9504U0.png

④、演示(命令行 + PHP演示)

  • 命令行:

首先,我们添加一个键值对到散列。如果 成功则返回1;如果键已经存在,返回0

hset hash-key lulubin1 90 // 返回 1

我们再添加一个不存在的键值对

hset hash-key lulubin2 100 // 返回 1

这个时候,散列中已经存在键lulubin1和lulubin2,接下来我们再添加一个相同的键lulubin1到散列中,看看会发生什么:

hset hash-key lulubin1 90 // 返回 0,由于该键已经存在

下面我们通过hget获取一个给定键lulubin的值。

hget hash-key lulubin1 // "90"

成功获取了一个值。我们再获取添加的所有元素看看,刚刚的到底添加了哪几个值

hgetall hash-key

其结果如下。我们发现,第一个结果为第一个键值对的键,第二个结果为键值对的值,以此类推,每两个为一组。

"lulubin1"
"90"
"lulubin2"
"100"

下面我们试着删除一个键试试,我们会发现如果 该键之前存在于散列中,那么删除时候则返回1,否则,返回0

hdel hash-key lulubin1 // 该键之前存在于散列,返回1

我们再试着删除一次lulubin1,发现当删除 不存在的键的时候,返回结果0

hdel hash-key lulubin1

我们再次获取全部键值对,看看还剩些什么。

hgetall hash-key

其结果为,少了两个结果,毕竟刚刚删除了一个键值对

"lulubin2"
"100"
  • PHP版本演示

我们先插入一个键值对到hash-key散列。1代表插入成功;0元素代表已经存在

$redis->hset("hash-key","lulubin1","90"); // int 1,元素插入成功,之前不存在该键

我们再次插入相同键值对

$redis->hset("hash-key","lulubin1","90"); // int 0,元素插入失败,该键已经存在

为了下面的演示使用,我们继续插入一些其他的值

$redis->hset("hash-key","lulubin2","100"); // int 0

下面我们使用hget获取键对应的值。我们试试获取lulubin2的值。

$redis->hget("hash-key","lulubin2"); // "100"

获取了一个后,我们在尝试使用hgetall获取刚刚插入的全部值,看看里面包含哪些键值对

$redis->hgetall("hash-key");

获得结果,是一个包含完整键值得数组

array (size=2)
  "lulubin1" => string "90"
  "lulubin2" => string "100"

查看完了所有的键值对,我们尝试删除其中一个键。 如果之前键存在于散列中,则返回1,反之,返回0

$redis->hdel("hash-key","lulubin1"); // 该键之前存在,返回int 1

我们再次尝试删除lulubin1键,发现其返回0. 则说明该键不存在集合中,删除失败

$redis->hdel("hash-key","lulubin1"); // 该键不存在,返回int 0

下面我们使用hgetall查看下散列中还剩余的所有键值对

$redis->hgetall("hash-key");

发现,只返回了包含一个键值对的数组。

array (size=1)
  "lulubin2" => string "100"

原因即是,刚刚lulubin1已经被删除

redis hash 应用场景

  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  • 存储部分变更的数据,如用户信息等。

五、list列表类型

①、简介

列表的功能十分独特,他可以在一个键下面存储N个可以重复的元素。其实就是把string类型右边的值换成了多个元素组成的列表。

②、列表结构

由于列表的可重复性,下面的结构实例中,第一个元素和最后一个元素可以重复。

[
    "user":[
        "lulubin1",
        "lulubin2",
        "lulubin1"
    ]
]

③、操作方法

https://file.lulublog.cn/images/3/2022/08/R0jqFBppup3pJ80RkAcBcCLAkUuyoY.png

④、演示(命令行 + PHP演示)

  • 命令行:

向列表添加值之后,会返回 当前的长度(包含元素个数)。(这里是右侧添加,左侧添加同理)

rpush list-key lulubin1 // (integer) 1 , 当前列表包含元素个数
rpush list-key lulubin2 // (integer) 2
rpush list-key lulubin1 // (integer) 3 ,即使添加相同值,也是可以添加

获取一定范围内的值,成功返回 范围内所有元素。这里的0代表起始位置,-1代表结束位置。从0到-1,代表取出所有的值。

lrange list-key 0 -1 // 该值返回的结果为:"lulubin1","lulubin2","lulubin1"。

获取列表里面的 某个元素。

lindex list-key 1 // 获取索引为1的元素

从列表左侧删除一个元素,成功返回 被删除的元素

lpop list-key // 上面的列表返回"lulubin1"

再次获取列表的 所有元素。记住,索引从0到-1

lrange list 0 -1 // 返回:"lulubin2","lulubin1",之前最左边的lulubin1已经被删除
  • PHP版本演示

设置值,成功返回当前 列表中的元素

$r = $redis->rpush("list-key","lulubin1"); // 从列表右侧添加一个值item
var_dump($r);// 此时,列表中有一个元素,返回int 1

同理我们再添加item2和item元素

$redis->rpush("list-key","lulubin2"); // 含有2个元素,返回int 2
$redis->rpush("list-key","lulubin1"); // 含有3个元素,返回int 3

下面,我们获取全部的值

$redis->lrange("list-key", 0 ,-1); // 该值返回的结果为:"lulubin1","lulubin2","lulubin1"。

我们也可以通过lindex来获取其中某个索引的值,成功返回 索引的值

$redis->lindex("list-key",1); // 获取索引为1的值,也就是第二个:"lulubin2"

添加完了,我们可以使用lpop从左侧删除一个元素,或者使用rpop从右侧删除一个元素,成功返回 被删除元素的值

$r = $redis->lpop("list-key"); // 这里我们做左侧删除了一个元素,即为:"lulubin1"

我们再来使用lrange获取所有的元素

$redis->lrange("list-key", 0 ,-1); // 该值返回的结果为:"lulubin2","lulubin1"。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 840