非关系型数据库技术课程 第二周作业(Redis中字符串和列表数据类型练习)

文章目录

实验内容及要求:
自行设计字符型和列表型数据,并针对这些数据执行常用操作;

(1)字符串型数据的常用操作:

命令及操作结果截图:

set <key> <value> :添加键值对

设置键值对:k1:v1
在这里插入图片描述
set操作拓展:
当键值对存在时,对该键进行set操作会覆盖该键原先的值
在这里插入图片描述
关于set命令的一些可选参数:
在这里插入图片描述
*NX:当数据库中key不存在时,可以将key-value添加数据库
*XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
*EX:key的超时秒数
*PX:key的超时毫秒数,与EX互斥

下面是对以上参数的相关实际操作:

补充:ttl <key> 命令用于查看还有多少秒过期,-1表示永不过期,-2表示已过期

设置键值对k2:v2且设置其超时时间为15秒:
使用“EX”设置其超时时间为15秒
在这里插入图片描述
使用“PX”设置其超时时间为15秒
在这里插入图片描述
当数据库中k3不存在时,将键值对k3:v3添加数据库:
在这里插入图片描述

解释:第二次使用set k3 v3 NX命令时,数据库中已有k3,而NX是当数据库中key不存在时才能将其添加进数据库,所以不能成功set。

当数据库中k3存在时,将键值对k3:v33添加数据库:
在这里插入图片描述

解释:将键值对k3:v33添加数据库可以直接使用“set k3
v33”命令,数据库中如果有k3键,则将其覆盖,若无k3键,则往数据库中新增键值对k3:v33;而使用“ set k3 v33
XX”命令的话,当数据库有k3键时,会执行覆盖操作,而当数据库中无k3键时,该操作不成功,返回(nil)

get <key>:查询对应键值

查询数据库中已有的键对应的值:

补充:keys *查看当前库所有key

在这里插入图片描述

append <key><value>:将给定的<value> 追加到原值的末尾

将给定的<value> 追加到原值的末尾:
在这里插入图片描述

strlen <key>:获得值的长度

查看当前数据库中所有键对应的值的长度:
在这里插入图片描述

setnx <key><value>:只有在 key 不存在时才设置 key 的值

添加键值对k4:v4
在这里插入图片描述

incr <key>:将 key 中储存的数字值增1 注意:只能对数字值操作,如果为空,新增值为1

添加键值对k5:500,并使其增1
在这里插入图片描述
不能对非数字值操作:
在这里插入图片描述
如果为空,新增值为1:
在这里插入图片描述

decr <key>:将 key 中储存的数字值减1。注意:只能对数字值操作,如果为空,新增值为-1

使k5减1:

在这里插入图片描述
不能对非数字值操作:
在这里插入图片描述
如果为空,新增值为-1
在这里插入图片描述

incrby / decrby <key> <步长>:将 key 中储存的数字值增减。自定义步长。

将k5键对应的值加10:
在这里插入图片描述
将k5键对应的值减10:
在这里插入图片描述

mset <key1> <value1> <key2> <value2> … :同时设置一个或多个 key-value对

设置多个键值对:k6:v6,k7:v7,k8:v8:
在这里插入图片描述

mget <key1> <key2> <key3> … :同时获取一个或多个 value

同时获取键k1,k2,k3,k4,k5的值:
在这里插入图片描述

msetnx <key1> <value1> <key2> <value2> … :当且仅当所有给定 key 都不存在时,同时设置一个或多个 key-value 对。(原子性,有其中一个失败则都失败)

设置键值对k9:v9,k10:v10:
在这里插入图片描述
当k10存在时,设置键值对k10:v10,k11,v11(k10已存在,因此设置k10:v10会失败,同时设置k11:v11也会失败(有其中一个失败则都失败))
在这里插入图片描述

getrange <key> <起始位置> <结束位置>:获得key对应的[起始,结束]区间范围内的值(左闭右闭区间)

设置键s1对应值“My homework”,并取区间范围[0,3],[5,6]的值:

在这里插入图片描述

setrange <key> <起始位置> <value> :用 <value>覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。

在s1对应的值的第五个字符(索引值为4)开始使用test覆写原来的值
在这里插入图片描述

setex <key> <过期时间> <value>:设置键值的同时,设置过期时间,单位秒。

设置键值对t1:v11且设置其过期时间为20秒:
在这里插入图片描述

getset <key><value>:以新换旧,设置了新值同时获得旧值。

获取s1的值同时将s1的值设置为”homework”:
在这里插入图片描述
为了更好操作,先清空一下当前库中的键值对

flushdb:清空当前库

在这里插入图片描述

补充:
String的数据结构为简单动态字符串(Simple Dynamic
String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
在这里插入图片描述
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M
关于列表(单键多值):
要注意插入的顺序!
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
在这里插入图片描述

(2)列表型数据的常用操作:

命令及操作结果截图

lpush/rpush <key> <value1> <value2> <value3> … :从左边/右边插入一个或多个值。

创建一个键值为k1的列表,且从左边插入多个值:v1,v2,v3

在这里插入图片描述
创建一个键值为k2的列表,且从右边插入多个值:v11,v22,v33
在这里插入图片描述

在键值为k2的列表中,从右边插入多个值:v44,v55
在这里插入图片描述

lpop/rpop <key>:从左边/右边吐出一个值。值在键在,值光键亡。

在键值为k2的列表中,从左边吐出一个值:
在这里插入图片描述
在键值为k2的列表中,从右边吐出一个值:
在这里插入图片描述

rpoplpush <key1> <key2>:从<key1>列表右边吐出一个值,插到<key2>列表左边。

从k1列表右边吐出一个值,插到k2列表左边:
在这里插入图片描述

lrange <key> <start> <stop>: 按照索引下标获得元素(从左到右) (索引中0代表左边数第一个,-1代表右边数第一个)

获得列表k2中区间[0,2]和[-2,-1]间的元素:
在这里插入图片描述

lrange <key> 0 -1 : 0左边第一个,-1右边第一个,(0 -1表示获取所有)

获得列表k1中的所有元素:
在这里插入图片描述

lindex <key> <index>:按照索引下标获得元素(从左到右)

获得列表k2索引为2 的元素:
在这里插入图片描述

llen <key>: 获得列表长度

获得k1,k2列表的长度
在这里插入图片描述

linsert <key> before/after <value> <newvalue>:在<value>的前面/后面插入<newvalue>插入值

在k2列表中值v22,v33前面插入值hello:
在这里插入图片描述
在k2列表中值v22,v33后面插入值world
在这里插入图片描述

lrem <key> <n> <value>:从左边删除n个value(从左到右)

在列表k2中删除前两个hello(从左边开始数):
在这里插入图片描述

lset <key> <index> <value>:将列表key下标为index的值替换成value

将列表k2下标为2的值替换为hello:
在这里插入图片描述


版权声明:本文为GCTTTTTT原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。