Redis学习(二) -数据类型

1.redis的数据类型

Redis常用的数据类型包含五类: string 字符串,list 列表,hash 哈希, set 集合,sorted-set 有序集合.
而我们所说的数据类型特指redis的 key: value中的value数据的类型.

各类命令作用连接 链接

注:以下命令执行环境为: Redis7.2.4

2. string 字符串

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。

help @string # 获取string对应的命令,了解命令的作用和使用

在这里插入图片描述

string操作1 - set,get简单使用

127.0.0.1:6379> set k1 hello # 添加一个string类型的数据
OK

127.0.0.1:6379> set k1 hi nx # 尝试更改
(nil) # 失败,可选参数nx (not exists)的作用为: 如果key值不存在则添加

127.0.0.1:6379> set k1 hi xx # 尝试更改
OK # 成功,可选参数xx(exists)的作用为: 如果key值存在则添加

127.0.0.1:6379> get k1 # 获取k1的值
"hi"

string操作2 - append,getset

127.0.0.1:6379> help GETSET # 获取相关命令的操作

  GETSET key value
  summary: Returns the previous string value of a key after setting it to a new value. 
  # 描述: 给key设定一个新值, 同时返回之前的数据值.
  since: 1.0.0
  group: string # 组别:string

127.0.0.1:6379> getset k1 xiaoming # 将k1的值修改为xiaoming
"hi"  # 返回之前的原值
127.0.0.1:6379> get k1 # 获取k1值,发现已经更改为我们期望的设定值
"xiaoming"
127.0.0.1:6379> getset k2 xiaoming # 尝试给一个未存在的key进行更新
(nil)
127.0.0.1:6379> get k2 # 成功添加
"xiaoming"
127.0.0.1:6379> help APPEND

  APPEND key value
  summary: Appends a string to the value of a key. Creates the key \if it doesn\'t exist.
  # 给key追加一个string类型的value, 如果key不存在则创建key
  since: 2.0.0
  group: string

127.0.0.1:6379> set k3 hello
OK
127.0.0.1:6379> get k3
"hello"
127.0.0.1:6379> APPEND k3  world #追加
(integer) 10
127.0.0.1:6379> get k3 # 获取发现没有我想要的空格展示
"helloworld"
127.0.0.1:6379> APPEND k3  ' !!' # 尝试使用引号
(integer) 13
127.0.0.1:6379> get k3
"helloworld !!"
127.0.0.1:6379> append k4 "hello world !" # 尝试使用引号
(integer) 13
127.0.0.1:6379> get k4
"hello world !"

结论:

  1. getset会对已存在的key进行更新,如果key值不存在则直接创建,且返回nil
  2. append直接在原有value的末尾添加数据, 如果存在特殊字符.可以使用引号(单,双引号不影响)

string操作3 - mset,mget,substr

127.0.0.1:6379> help mset

  MSET key value [key value ...]
  summary: Atomically creates or modifies the string values of one or more keys.
  # 原子性的创建或修改一个或多个键的字符串值。
  since: 1.0.1
  group: string

127.0.0.1:6379> help mget

  MGET key [key ...]
  summary: Atomically returns the string values of one or more keys.
  #原子性的获取一个或多个键的字符串值
  since: 1.0.0
  group: string
127.0.0.1:6379> FLUSHDB # 清空数据
OK
127.0.0.1:6379> KEYS * # 查询所有key
(empty array)
127.0.0.1:6379> mset k1 zhansan k2 lisi k3 wangwu # 批量创建
OK
127.0.0.1:6379> KEYS *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> get k1
"zhansan"
127.0.0.1:6379> mset k4 xiaoming k1 xiaohong k5 xiaozhang # 如果已存在的则直接更新value
OK
127.0.0.1:6379> KEYS *
1) "k2"
2) "k1"
3) "k3"
4) "k4"
5) "k5"
127.0.0.1:6379> mget k1 k2 k3 # 批量获取
1) "xiaohong"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> help SUBSTR

  SUBSTR key start end
  summary: Returns a substring from a string value.
  # 返回一个string类型值的部分长度
  since: 1.0.0
  group: string

127.0.0.1:6379> SUBSTR k1 0  -1 #redis存在正反向索引, 正向(从左至右)从0开始,反向(从右至左)从-1开始. [0 -1]就表示字符串的开始和结尾,即字符串长度,等同于strlen k1
"xiaohong"

string操作4 - 自增自减
包含: incr, incrby, incrbyfloat, decr, decrby.(具体描述自行查看)
incr, decr: 默认自增/自减1
incrby, decrby: 提供增/ 减的整数数据
incrbyfloat: 提供增/ 减的浮点数数据

127.0.0.1:6379> INCR k1 #如果key不存在初始化一个value为0的key,并自增1
(integer) 1
127.0.0.1:6379> INCRBY k1 10
(integer) 11
127.0.0.1:6379> INCRBY k1 10.0 # 如果增加的数据不是整数类型则会报错
(error) ERR value is not an integer or out of range
127.0.0.1:6379> INCRBYFLOAT k1 0.5 
"11.5"
127.0.0.1:6379> INCRBYFLOAT k1 1 # 使用浮点数的命令,也可以添加整数类型
"12.5"
127.0.0.1:6379> get k1
"12.5"
127.0.0.1:6379> INCR k1 # k1此时已经是浮点数,再次使用会报错
(error) ERR value is not an integer or out of range
127.0.0.1:6379> DECR k1 # k1此时已经是浮点数,再次使用会报错
(error) ERR value is not an integer or out of range
127.0.0.1:6379> DECR k2
(integer) -1
127.0.0.1:6379> DECRBY k2 10
(integer) -11
127.0.0.1:6379> mget k1 k2
1) "12.5"
2) "-11"
127.0.0.1:6379> INCRBYFLOAT k1 -12
"0.5"
127.0.0.1:6379> DECRBY k2 -12
(integer) 1
127.0.0.1:6379> mget k1 k2 # 尝试给命令提供相反的数据,发现可以进行反向操作
1) "0.5"
2) "1"

结论:

  1. 数值的计算是在string类型为数据基础上
  2. 命令会改变数值的类型, int -> float, 一旦变成浮点型,就只能通过incrbyfloat命令进行计算.

3.list 列表

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

list基础操作(左 L), 具体命令的用法可以参考 1.里面的链接, 或者使用help帮助命令

127.0.0.1:6379> LPUSH k1 a b c d e f g # 从列表的开头插入一个或多个元素
(integer) 7
127.0.0.1:6379> LLEN k1 # 查看元素个数
(integer) 7
127.0.0.1:6379> LRANGE k1 0 -1 # 查看元素信息, 可以发现最开始的元素会被插入到末尾
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> LREM k1 2 e # 移除k1的元素'e',共计2次. 执行结果发现就移除了一个,说明在列表中如果存在改元素,至多会被移除两次.
(integer) 1
127.0.0.1:6379> LRANGE k1 0 -1
1) "g"
2) "f"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> LSET k1 5 99 # 修改下标为5的元素,结果成功
OK
127.0.0.1:6379> LINDEX k1 5 # 获取下标为5的元素
"99"
127.0.0.1:6379> LSET k1 6 99 #当我们想要修改的下标大于给定的key的下标,就会报错:下标越界
(error) ERR index out of range
127.0.0.1:6379> LPOP k1 #默认移除列表的第一个元素,并返回对应的值
"g"
127.0.0.1:6379> LPOP k1  2 #移除两个
1) "f"
2) "d"
127.0.0.1:6379> LPOP k1 100 # 当移除的个数大于列表的元素个数时,则会清空列表
1) "c"
2) "b"
3) "99"
127.0.0.1:6379> LRANGE k1 0 -1
(empty array)

根据列表的命令,我们可以获取到对应的数据结构

  1. 数组
  2. 栈: 插入和弹出命令为同向
  3. 队列: 插入和弹出命令为异向
  4. 阻塞队列: list组别中的 'b’首字母的命令
=============================栈: FILO===================================
127.0.0.1:6379> LPUSH k1 1 2 3 4 5 # 插入元素
(integer) 5
127.0.0.1:6379> LPOP k1 # 弹出栈顶元素
"5"
127.0.0.1:6379> LPOP k1 
"4"
127.0.0.1:6379> LPOP k1 4
1) "3"
2) "2"
3) "1"
=============================队列: FIFO===================================
127.0.0.1:6379> LPUSH k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> RPOP k1 # 弹出数组末尾的元素
"1"
127.0.0.1:6379> RPOP k1 
"2"
127.0.0.1:6379> RPOP k1 5
1) "3"
2) "4"
3) "5"

阻塞队列

在这里插入图片描述

4.hash 哈希

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

127.0.0.1:6379> hset  xiaoming  sex man age 18 addr bj # 创建一个对象存储小明的信息
(integer) 3
127.0.0.1:6379> HGET xiaoming age # 获取单个字段
"18"
127.0.0.1:6379> HMGET xiaoming age addr # 获取多个字段
1) "18"
2) "bj"
127.0.0.1:6379> HMGET xiaoming age add #获取多个字段 ,如果存在则返回对应的val,否则返回nil
1) "18"
2) (nil)
127.0.0.1:6379> HGETALL xiaoming #获取给定key下的key-value
1) "sex"
2) "man"
3) "age"
4) "18"
5) "addr"
6) "bj"
127.0.0.1:6379> HLEN xiaoming #字段的长度
(integer) 3
127.0.0.1:6379> HKEYS xiaoming # 获取全部字段
1) "sex"
2) "age"
3) "addr"
127.0.0.1:6379> HVALS xiaoming # 获取全部值
1) "man"
2) "18"
3) "bj"
127.0.0.1:6379> HINCRBY xiaoming age 2 # 对于数值可以进行计算
(integer) 20
127.0.0.1:6379> HGET xiaoming age
"20"

5.set 集合

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

set基本操作

127.0.0.1:6379> SADD k1 mysql redis oracle redis # 创建集合
(integer) 3
127.0.0.1:6379> SMEMBERS k1 # 获取给定key的全部元素
1) "mysql"
2) "redis"
3) "oracle"
127.0.0.1:6379> SISMEMBER k1 redis # 是否为key的元素,如果是返回1
(integer) 1
127.0.0.1:6379> SISMEMBER k1 re # 否则返回0
(integer) 0
127.0.0.1:6379> SCARD k1 # 集合元素的个数
(integer) 3
127.0.0.1:6379> SPOP k1 # 删除随机一个元素,并返回
"redis"
127.0.0.1:6379> SREM k1 mysql # 删除一个或者多个给定的元素
(integer) 1
127.0.0.1:6379> SADD k1 mysql redis oracle redis 
(integer) 2
127.0.0.1:6379> SRANDMEMBER k1 1 # 获取一个随机元素
1) "redis"
127.0.0.1:6379> SRANDMEMBER k1 1
1) "mysql"
127.0.0.1:6379> SMOVE k1 k2 redis  # 将给定集合的某个元素移到另一个集合
(integer) 1
127.0.0.1:6379> SMEMBERS k1
1) "oracle"
2) "mysql"
127.0.0.1:6379> SMEMBERS k2
1) "redis"

应用场景 - 抽奖, 假设一共10个人进行抽奖, 一等奖1个,二等奖2个,三等奖3个.

127.0.0.1:6379> SADD name Emily John David Michael James Anna Laura Peter Robert Kelly 
(integer) 10
============================中奖人可以重复=============================
127.0.0.1:6379> SRANDMEMBER name 3
1) "John"
2) "Anna"
3) "Peter"
127.0.0.1:6379> SRANDMEMBER name 2
1) "David"
2) "Kelly"
127.0.0.1:6379> SRANDMEMBER name 1 # 这时候一等奖和三等奖中奖人出现重复
1) "John"
127.0.0.1:6379> SCARD name # 查看个数,还是之前的10个
(integer) 10
============================中奖人不可重复=============================
127.0.0.1:6379> SPOP name 3 
1) "James"
2) "Anna"
3) "Peter"
127.0.0.1:6379> SPOP name 2
1) "David"
2) "Michael"
127.0.0.1:6379> SPOP name 1
1) "Emily"
127.0.0.1:6379> SCARD name # 查看个数,发现只剩下未中奖的人数
(integer) 4

set操作 - 交,并,差集

127.0.0.1:6379> SADD k1 1  2  3 4 
(integer) 4
127.0.0.1:6379> SADD k2 3 4 5 6 
(integer) 4
127.0.0.1:6379> SUNION k1 k2 # 并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SDIFF k1 k2 # 差集, 返回结果为 第一个集合对第二个集合的差异
1) "1"
2) "2"
127.0.0.1:6379> SDIFF k2 k1 # 差集, 返回结果为 第二个集合对第一个集合的差异
1) "5"
2) "6"
127.0.0.1:6379> SINTER k1 k2  #交集
1) "3"
2) "4"
127.0.0.1:6379> SINTERSTORE dest k1 k2 # 将交集的结果存储到指定集合
(integer) 2
127.0.0.1:6379> SMEMBERS dest
1) "3"
2) "4"

6 sroted-set 有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

127.0.0.1:6379> ZADD xiaoming 99 math #新增集合
(integer) 1
127.0.0.1:6379> ZADD xiaoming 78 english
(integer) 1
127.0.0.1:6379> ZRANK xiaoming math #获取指定元素的排名
(integer) 2
127.0.0.1:6379> ZRANK xiaoming math withscore #获取指定元素的排名和分值
1) (integer) 2
2) "99"
127.0.0.1:6379> ZSCORE xiaoming english # 获取指定元素分值
"78"
127.0.0.1:6379> ZRANDMEMBER xiaoming #获取随机元素
"chinese"
127.0.0.1:6379> ZRANDMEMBER xiaoming 2 withscores # 获取随机两个元素,以及对应的分值
1) "english"
2) "78"
3) "chinese"
4) "80"
127.0.0.1:6379> ZRANGE xiaoming 0 -1 # 获取元素的排名(从小到大)
1) "english"
2) "chinese"
3) "math"
127.0.0.1:6379> ZRANGE xiaoming 0 -1 rev # 获取元素的排名(从大到小)
1) "math"
2) "chinese"
3) "english"
127.0.0.1:6379> ZREVRANGE xiaoming 0 -1 #作用同上
1) "math"
2) "chinese"
3) "english"

应用场景 - 排名. 张三语数英分别为: 87.66.89, 李四: 67,93,80,王五:92,88,82,计算总分并排名

127.0.0.1:6379> ZADD chinese 87 zhangsan 67 lisi 92 wangwu
(integer) 3
127.0.0.1:6379> ZADD match 66 zhangsan 93 lisi 88 wangwu
(integer) 3
127.0.0.1:6379> ZADD english 89 zhangsan 80 lisi 82 wangwu # 创建对应学科的成绩
(integer) 3
127.0.0.1:6379> ZUNIONSTORE sumsc 3 chinese  match english aggregate sum # 取三科的交集的总分数,存储到指定集合
(integer) 3
127.0.0.1:6379> ZREVRANGE sumsc 0 -1 withscores # 排名
1) "wangwu"
2) "262"
3) "zhangsan"
4) "242"
5) "lisi"
6) "240"

7 bitmap 位图

在Redis中,位图并不是一种独立的数据类型,而是以字符串的形式实现的,其中每个字符的每一位用来代表0或1。这种结构允许高效的位级操作,如设置某个位的值、获取某个位的值以及计算位图中1的数量等

127.0.0.1:6379> setbit k1 3 1 # 因为bitmap是用string进行表示的, 8bit=1byte
(integer) 0
127.0.0.1:6379> setbit k1 13  1
(integer) 0
127.0.0.1:6379> GETBIT k1 13 # 获取偏移量为13的值
(integer) 1
127.0.0.1:6379> get k1 # 查看k1.16进制, 转成二进制为: 0001 0000 0000 0100 刚好是3,13下标为1
"\x10\x04"
127.0.0.1:6379> BITCOUNT k1 0 -1 # 计算1出现的次数
(integer) 2

127.0.0.1:6379> BITPOS k1 1 
(integer) 3
127.0.0.1:6379> BITPOS k1 1 0
(integer) 3
127.0.0.1:6379> BITPOS k1 1 0 -1 bit # 以上为指定范围内查看1第一次出现的索引
(integer) 3
127.0.0.1:6379> BITPOS k1 1 7 19  # 当起始值不是0开始的时候发现结果不是13,而是-1,说明获取有误
(integer) -1
127.0.0.1:6379> BITPOS k1 1 7 19 bit # 当起始值不为0的时候,需要带上单位进行识别,返回值依旧是索引值
(integer) 13
127.0.0.1:6379> BITPOS k1  1 1 1 byte # 当起始值不为0的时候,需要带上单位进行识别,返回值依旧是索引值
(integer) 13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值