第五章 Redis数据类型

第五章 Redis数据类型

1.数据类型概述

Redis中存储数据是通过key-value存储的,对于value的类型有以下几种:

  • 字符串类型 string
    字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制
    数据,序列化后的数据,JSON 化的对象甚至是一张图片。最大 512M。
    在这里插入图片描述
  • 哈希类型 hash
    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
    在这里插入图片描述
  • 列表类型 list
    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头
    部(左边)或者尾部(右边)
    在这里插入图片描述
  • 集合类型 set
    Redis 的 Set 是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数
    据.
    在这里插入图片描述
  • 有序集合类型 zset (sorted set)
    Redis 有序集合 zset 和集合 set 一样也是 string 类型元素的集合,且不允许重复的成员。
    不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的
    成员进行从小到大的排序。
    在这里插入图片描述

2.Redis 数据类型操作命令

2.1 字符串类型(string)

字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数
据,序列化后的数据,JSON 化的对象甚至是一张图片。

2.1.1 基本操作命令

A、set
将字符串值 value 设置到 key 中
语法:set key value
在这里插入图片描述
查看已经插入的 key
在这里插入图片描述
向已经存在的 key 设置新的 value,会覆盖原来的值
在这里插入图片描述
B、 get
获取 key 中设置的字符串值
语法: get key
例如:获取 username 这个 key 对应的 value
在这里插入图片描述

C、 incr
将 key 中储存的数字值加 1,如果 key 不存在,则 key 的值先被初始化为 0 再执行
incr 操作(只能对数字类型的数据操作)
语法:incr key
例 1:操作key,值增加 1
在这里插入图片描述
例 2:对非数字的值操作是不行的
在这里插入图片描述
D、 decr
将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执
行 decr 操作(只能对数字类型的数据操作)
语法:decr key
例1:不存在的key,初值为0,再减 1 。
在这里插入图片描述
例2:对存在的数字值的 key ,减 1 。
先执行 incr index ,增加到 3
在这里插入图片描述
incr ,decr 在实现关注人数上,文章的点击数上。

E、 append
语法:append key value
说明:如果 key 存在, 则将 value 追加到 key 原来旧值的末尾
如果 key 不存在, 则将 key 设置值为 value
返回值:追加字符串之后的总长度
例 1:追加内容到存在的 key
在这里插入图片描述
例 2:追加到不存在的 key,同 set key value
在这里插入图片描述

2.1.2 其他操作命令

A、 strlen
语法:strlen key
说明:返回 key 所储存的字符串值的长度
返回值:
①:如果key存在,返回字符串值的长度
②:key不存在,返回0
例 1:计算存在 key 的字符串长度
在这里插入图片描述
设置中文 set k4 中文长度 , 按字符个数计算

例 2:计算不存在的 key
在这里插入图片描述

B、 getrange
语法:getrange key start end
作用:获取 key 中字符串值从 start 开始 到 end 结束 的子字符串,包括 start 和 end, 负数
表示从字符串的末尾开始, -1 表示最后一个字符
返回值:截取的子字符串。
使用的字符串 key: school, value: bejingzhiyejishuxueyuan

例 1: 截取从 2 到 5 的字符
在这里插入图片描述
位置是从0开始计算

例 2:从字符串尾部截取,start ,end 是负数,最后一位是 -1
在这里插入图片描述
例 3:超出字符串范围的截取 ,获取合理的子串
在这里插入图片描述
C、 setrange
语法:setrange key offset value
说明:用 value 覆盖(替换)key 的存储的值从 offset 开始,不存在的 key 做空白字符串。
返回值:修改后的字符串的长度
例 1:替换给定的字符串
在这里插入图片描述
例 2:设置不存在的 key
在这里插入图片描述
D、mset
语法:mset key value [key value…]
说明:同时设置一个或多个 key-value 对
返回值: OK
例 1:一次设置多个 key, value
在这里插入图片描述
E、 mget
语法:mget key [key …]
作用:获取所有(一个或多个)给定 key 的值
返回值:包含所有 key 的列表

例 1:返回多个 key 的存储值
在这里插入图片描述
例 2:返回不存在的 key
在这里插入图片描述

2.1.3 应用-自增主键

商品编号、订单号采用string的递增数字特性生成。

定义商品编号key:items:id

192.168.101.3:7003> INCR items:id
(integer) 2
192.168.101.3:7003> INCR items:id
(integer) 3
2.2 哈希类型 hash
2.2.1 使用string的问题

假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:
保存、更新: User对象 →json(string) →redis

如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,下边讲的hash可以很好的解决这个问题。
User “{“username”:”gyf”,”age”:”80”}”

2.2.2 hash介绍

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
在这里插入图片描述

2.2.3 基本操作命令

A、hset
语法:hset hash 表的 key field value
作用:将哈希表 key 中的域 field 的值设为 value ,如果 key 不存在,则新建 hash 表,执
行赋值,如果有 field ,则覆盖值。
返回值:
①如果 field 是 hash 表中新 field,且设置值成功,返回 1
②如果 field 已经存在,旧值覆盖新值,返回 0

例 1:新的 field
在这里插入图片描述
例 2:覆盖旧的的 field
在这里插入图片描述
B、 hget
语法:hget key field
作用:获取哈希表 key 中给定域 field 的值
返回值:field 域的值,如果 key 不存在或者 field 不存在返回 nil
例 1:获取存在 key 值的某个域的值
在这里插入图片描述
例 2:获取不存在的 field
在这里插入图片描述
C、 hmset
语法:hmset key field value [field value…]
说明:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的 field,
hash 表 key 不存在,创建空的 hash 表,执行 hmset.
返回值:设置成功返回 ok, 如果失败返回一个错误

例 1:同时设置多个 field-value
在这里插入图片描述
使用 redis-desktop-manager 工具查看 hash 表 website 的数据结构
在这里插入图片描述
例 2:key 类型不是 hash,产生错误
在这里插入图片描述
D、hmget
语法:hmget key field [field…]
作用:获取哈希表 key 中一个或多个给定域的值
返回值:返回和 field 顺序对应的值,如果 field 不存在,返回 nil

例 1:获取多个 field 的值
在这里插入图片描述

E、 hgetall
语法:hgetall key
作用:获取哈希表 key 中所有的域和值
返回值:以列表形式返回 hash 中域和域的值 ,key 不存在,返回空 hash

例 1:返回 key 对应的所有域和值
在这里插入图片描述
例 2:不存在的 key,返回空列表
在这里插入图片描述
F、 hdel
语法:hdel key field [field…]
作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略
返回值:成功删除的 field 的数量

例 1:删除指定的 field
在这里插入图片描述

2.2.4 其他操作命令

A、hlen
语法:hlen key
作用:获取哈希表 key 中域 field 的个数
返回值:数值,field 的个数。key 不存在返回 0.

例 1:获取指定 key 域的个数
在这里插入图片描述
例 2:不存在的 key,返回 0
在这里插入图片描述
B、 hkeys
语法:hkeys key
作用:查看哈希表 key 中的所有 field 域
返回值:包含所有 field 的列表,key 不存在返回空列表

例 1:查看 website 所有的域名称
在这里插入图片描述

C、 hvals
语法:hvals key
作用:返回哈希表 中所有域的值
返回值:包含哈希表所有域值的列表,key 不存在返回空列表

例 1:显示 website 哈希表所有域的值
在这里插入图片描述

D、hexists
语法:hexists key field
作用:查看哈希表 key 中,给定域 field 是否存在
返回值:如果 field 存在,返回 1, 其他返回 0

例 1:查看存在 key 中 field 域是否存在
在这里插入图片描述

2.2.5 应用-存储商品信息

商品字段
【商品id、商品名称、商品描述、商品库存、商品好评】

定义商品信息的key
商品1001的信息在 Redis中的key为:[items:1001]

存储商品信息

192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9
OK

在这里插入图片描述
获取商品信息

192.168.101.3:7003> HGET items:1001 id
"3"
192.168.101.3:7003> HGETALL items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"
2.3 列表类型(list)
2.3.1 ArrayList与LinkedList的区别

ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。

LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快。
在这里插入图片描述

在这里插入图片描述

2.3.2 list类型介绍

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。

2.3.3 基本命令

A、lpush
语法:lpush key value [value…]
作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左
到右的顺序依次插入到表头
返回值:数字,新列表的长度

例 1:将 a,b,c 插入到 mylist 列表类型
在这里插入图片描述
在 redis-desktop-manager 显示
在这里插入图片描述
插入图示:
在这里插入图片描述
例 2:插入重复值到 list 列表类型
在这里插入图片描述
在 redis-desktop-manager 显示
在这里插入图片描述
B、 rpush
语法:rpush key value [value…]
作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右
的顺序依次插入到表尾
返回值:数字,新列表的长度

例 1:插入多个值到列表
在这里插入图片描述
在 redis-desktop-manager 显示:
在这里插入图片描述
C、 lrange
语法:lrange key start stop
作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第
二个元素;start , stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一
个元素, -2 表示列表的倒数第二个元素,以此类推。 start ,stop 超出列表的范围
不会出现错误。
返回值:指定区间的列表

例 1:返回列表的全部内容
在这里插入图片描述
例 2:显示列表中第 2 个元素,下标从 0 开始
在这里插入图片描述
D、lpop
语法:lpop key
作用:移除并返回列表 key 头部第一个元素,即列表左侧的第一个下标值。相当于栈(stack)
返回值:列表左侧第一个下标值; 列表 key 不存在,返回 nil

例 1:取出列表的左侧第一个下标值
在这里插入图片描述

E、 rpop
语法:rpop key
作用:移除并返回 key 的尾部元素
返回值:列表的尾部元素;key 不存在返回 nil

例 1:移除列表的尾部元素
在这里插入图片描述

F、 lindex
语法:lindex key index
作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列
表的第一个元素,以 1 表示列表的第二个元素;start , stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
返回值:指定下标的元素;index 不在列表范围,返回 nil

例 1:返回下标是 1 的元素
在这里插入图片描述
例 2:不存在的下标
在这里插入图片描述

G、llen
语法:llen key
作用:获取列表 key 的长度
返回值:数值,列表的长度; key 不存在返回 0

例 1:显示存在 key 的列表元素的个数
在这里插入图片描述

2.3.4 其他命令

A、lrem
语法:lrem key count value
作用:根据参数 count 的值,移除列表中与参数 value 相等的元素, count >0 ,从列表的
左侧向右开始移除; count < 0 从列表的尾部开始移除;count = 0 移除表中所有
与 value 相等的值。
返回值:数值,移除的元素个数

例 1:删除 2 个相同的列表元素
在这里插入图片描述

例 2:删除列表中所有的指定元素,删除所有的 java
在这里插入图片描述

B、 ltrim
语法:ltrim key start stop
作用:删除指定区域外的元素,比如 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,
其余元素全部删除。0 表示列表的第一个元素,以 1 表示列表的第二个元素;start ,
stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示
列表的倒数第二个元素,以此类推。
返回值:执行成功返回 ok

例 1:保留列表的前三个元素
在这里插入图片描述

C、 lset
语法:lset key index value
作用:将列表 key 下标为 index 的元素的值设置为 value。
返回值:设置成功返回 ok ; key 不存在或者 index 超出范围返回错误信息

例 1:设置下标 2 的 value 为“c”。
在这里插入图片描述
D、linsert
语法:linsert key BEFORE|ALFTER pivot value
作用:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key 不存在,pivot
不在列表中,不执行任何操作。
返回值:命令执行成功,返回新列表的长度。没有找到 pivot 返回 -1, key 不存在返回 0。

例 1:修改列表 arch,在值 dao 之前加入 service
在这里插入图片描述
例 2:操作不存在的 pivot
在这里插入图片描述

2.3.5 应用-商品评论列表

思路:
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。

定义商品评论列表key:
商品编号为1001的商品评论key【items: comment:1001】

192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!","date":1430295077289}'
2.4 集合类型 set
2.4.1 集合类型Set介绍

集合中的数据是不重复且没有顺序。
集合类型和列表类型的对比:
在这里插入图片描述
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)。
Redis还提供了多个集合之间的交集、并集、差集的运算。

2.4.2 基本命令

A、sadd
语法:sadd key member [member…]
作用:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元
素将被忽略,不会再加入。
返回值:加入到集合的新元素的个数。不包括被忽略的元素。

例 1:添加单个元素
在这里插入图片描述
例 2:添加多个元素
在这里插入图片描述
B、 smembers
语法:smembers key
作用:获取集合 key 中的所有成员元素,不存在的 key 视为空集合

例 1:查看集合的所有元素
在这里插入图片描述
例 2:查看不存在的集合
在这里插入图片描述

C、 sismember
语法:sismember key member
作用:判断 member 元素是否是集合 key 的成员
返回值:member 是集合成员返回 1,其他返回 0 。

例 1:检查元素是否存在集合中
在这里插入图片描述

D、scard
语法:scard key
作用:获取集合里面的元素个数
返回值:数字,key 的元素个数。 其他情况返回 0 。

例 1:统计集合的大小
在这里插入图片描述
例 2:统计不存在的 key
在这里插入图片描述
E、 srem
语法:srem key member [member…]
作用:删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。
返回值:数字,成功删除的元素个数,不包括被忽略的元素。

例 1:删除存在的一个元素,返回数字 1
在这里插入图片描述
例 2:删除不存在的元素
在这里插入图片描述

2.4.3 其他命令

A、srandmember
语法:srandmember key [count]
作用:只提供 key,随机返回集合中一个元素,元素不删除,依然在集合中;提供了 count
时,count 正数, 返回包含 count 个数元素的集合, 集合元素各不相同。count 是负
数,返回一个 count 绝对值的长度的集合, 集合中元素可能会重复多次。
返回值:一个元素;多个元素的集合

例 1:随机显示集合的一个元素
在这里插入图片描述
例 2:使用 count 参数, count 是正数
在这里插入图片描述
例 3:使用 count 参数,count 是负数
在这里插入图片描述
B、 spop
语法:spop key [count]
作用:随机从集合中删除一个元素, count 是删除的元素个数。
返回值:被删除的元素,key 不存在或空集合返回 nil

例如 1:随机从集合删除一个元素
在这里插入图片描述
例 2:随机删除指定个数的元素
在这里插入图片描述

2.4.3 set命令运算
  • 集合的差集运算 A-B
    属于A并且不属于B的元素构成的集合。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    语法:SDIFF key [key ...]
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB 
1) "1"
127.0.0.1:6379> sdiff setB setA 
1) "4"
  • 集合的交集运算 A ∩ B
    属于A且属于B的元素构成的集合。
    在这里插入图片描述
    语法:SINTER key [key ...]
127.0.0.1:6379> sinter setA setB 
1) "2"
2) "3"
  • 集合的并集运算 A ∪ B
    属于A或者属于B的元素构成的集合
    在这里插入图片描述
    语法:SUNION key [key ...]
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
2.5 有序集合类型 zset (sorted set)
2.5.1 sorted set介绍

在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。

在某些方面有序集合和列表类型有些相似。
1、二者都是有序的。
2、二者都可以获得某一范围的元素。
但是,二者有着很大区别:
1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
4、有序集合要比列表类型更耗内存。

2.5.2 基本命令

A、zadd
语法:zadd key score member [score member…]
作用:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果 member
存在集合中,则更新值;score 可以是整数或浮点数
返回值:数字,新添加的元素个数

例 1:创建保存学生成绩的集合
在这里插入图片描述
例 2:使用浮点数作为 score
在这里插入图片描述
B、 zrange
语法:zrange key start stop [WITHSCORES]
作用:查询有序集合,指定区间的内的元素。集合成员按 score 值从小到大来排序。 start,
stop 都是从 0 开始。0 是第一个元素,1 是第二个元素,依次类推。以 -1 表示最后一
个成员,-2 表示倒数第二个成员。WITHSCORES 选项让 score 和 value 一同返回。
返回值:自定区间的成员集合

例 1:显示集合的全部元素,不显示 score,不使用 WITHSCORES
在这里插入图片描述
例 2:显示集合全部元素,并使用 WITHSCORES
在这里插入图片描述
例 3:显示第 0,1 二个成员
在这里插入图片描述
例 4:排序显示浮点数的 score
在这里插入图片描述
C、 zrevrange
语法:zrevrange key start stop [WITHSCORES]
作用:返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)
来排列。其它同 zrange 命令。
返回值:自定区间的成员集合

例 1:成绩榜
在这里插入图片描述
D、zrem
语法:zrem key member [member…]
作用:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略
返回值:被成功删除的成员数量,不包括被忽略的成员。

例 1:删除指定一个成员 wangwu
在这里插入图片描述
E、 zcard
语法:zcard key
作用:获取有序集 key 的元素成员的个数
返回值:key 存在返回集合元素的个数, key 不存在,返回 0

例 1:查询集合的元素个数
在这里插入图片描述

2.5.3 其他命令

A、zrangebyscore
语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
作用:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成
员,有序成员是按递增(从小到大)排序。
min ,max 是包括在内 , 使用符号 ( 表示不包括。 min , max 可以使用 -inf ,
+inf 表示最小和最大 limit 用来限制返回结果的数量和区间。
withscores 显示 score 和 value
返回值:指定区间的集合数据
使用的准备数据
在这里插入图片描述
例 1:显示指定具体区间的数据
在这里插入图片描述
例 2:显示指定具体区间的集合数据,开区间(不包括 min,max)
在这里插入图片描述
例 3:显示整个集合的所有数据
在这里插入图片描述
例 4:使用 limit
增加新的数据:
在这里插入图片描述
在这里插入图片描述
显示从第一个位置开始,取一个元素。
在这里插入图片描述
B、 zrevrangebyscore
语法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
作用:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有
的成员。有序集成员按 score 值递减(从大到小)的次序排列。其他同 zrangebyscore

例 1:查询工资最高到 3000 之间的员工
在这里插入图片描述
C、 zcount
语法:zcount key min max
作用:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )
的成员的数量

例 1:求工资在 3000-5000 的员工数量
在这里插入图片描述

2.5.4 应用-商品销售排行榜

需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。

写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10

192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002

商品编号1001的销量加1

192.168.101.3:7001> ZINCRBY items:sellsort 1 1001

商品销量前10名:

192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
posted @ 2021-02-17 14:37  那就这样吧~  阅读(51)  评论(0编辑  收藏  举报