redis 数据类型

redis 数据类型

通过该链接查看:http://www.redis.cn/topics/data-types.html

3.4.1 字符串

字符串是所有编程语言中最常见的和最常用的数据类型,而且也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。字符串通常用于保存 session 信息比较多

3.4.1.1 添加一个 key

# 1、登录 redis
[09:56:51 root@redis-server ~]#redis-cli -a 12345

-a 12345# 在命令行下使用密码登录

# 2、登录 redis 之后创建一个键值对
127.0.0.1:6379> set name jack       # 创建了一个键名为 name 的 key,键值为 jack
OK
127.0.0.1:6379> get name            # 通过查看 name 这个键名就会发现它的值为 jack
"jack"
127.0.0.1:6379> TYPE name           # 通过 type 查看 name 会发现是一个字符串数据类型
string

3.4.1.2 获取一个 key

127.0.0.1:6379> get name            # 通过 get 命令后面跟 key 即可获取
"jack"

3.4.1.3 删除一个 key

127.0.0.1:6379> DEL name            # 通过 DEL 命令后面跟 key 即可删除
(integer) 1                         # 提示删除成功

127.0.0.1:6379> get name            # 查看这个 name 的 key 值为空
(nil)

3.4.1.4 批量设置多个 key

# 使用 MSET 创建多个 key
127.0.0.1:6379> MSET key1 value1 key2 value2 
OK

# 通过 KEYS * 查看就会发现这两个 key
127.0.0.1:6379> KEYS *
1) "key2"
2) "key1"

3.4.1.5 批量获取多个 key

# 通过 MGET 后面跟 key 名即可获取所有值
127.0.0.1:6379> MGET key1 key2 
1) "value1"
2) "value2"

3.4.1.6 追加数据

# 创建一个 name 的 key 并且值为 jack
127.0.0.1:6379> SET name jack
OK

# 通过 APPEND 后面跟上 name 这个 key 最后在加上我们要追加的值是 zhang
127.0.0.1:6379> APPEND name zhang
(integer) 9

# 再次通过 get 查看 name 这个 key 就会得到 jackzhang 的值
127.0.0.1:6379> get name
"jackzhang"

3.4.1.7 数值递增

数据的递增和递减主要用于微信或者微博的点赞上面

# 创建一个 num 的 key 值为 100
127.0.0.1:6379> SET num 100
OK

# 通过 INCR 递增给 num 这个 key,incr默认是再原有的基础上加1
127.0.0.1:6379> INCR num
(integer) 101

# 再次通过 get 查看 num 这个值就为 101
127.0.0.1:6379> get num
"101"

3.4.1.8 数值递减

# 使用 decr 递减 num 这个key
127.0.0.1:6379> DECR num
(integer) 100

# 通过 get 查看就会发现现在的值为 100
127.0.0.1:6379> get num
"100"

3.4.1.9 返回字符串 key 长度

# 使用 get 查看 name 的值为 jackzhang
127.0.0.1:6379> get name                
"jackzhang"

# 然后再使用 strlen 查看 name 这个 key 的长度为 9
127.0.0.1:6379> STRLEN name             
(integer) 9

# 再使用 append 追加到 name 这个 key 中,追加的内容为 123
127.0.0.1:6379> APPEND name 123         
(integer) 12            # 提示现在的 key 长度为 12

# 再通过 STRLEN 查看 name 这个 key ,现在的 key 长度为 12
127.0.0.1:6379> STRLEN name
(integer) 12

3.4.1.10 判断 key 是否存在

#  使用 existe 判断 name 这个 key 是否存在,存在就会返回 1
127.0.0.1:6379> EXISTS name
(integer) 1

# 而 zhang 这个 key 是不存在的所以他就会返回0
127.0.0.1:6379> EXISTS zhang
(integer) 0

3.4.1.11 查看 key 的过期时间

过期时间主要用于电商的购物卷或者购物卡,缓存的特性是他有有效期。

ttl #查看key的剩余生存时间
    -1 #负一为永不过期,默认创建的key是永不过期,重新使用set对key赋值,也会从有剩余生命周期变成永不过期
    -2 #为没有此key
    num #key的剩余有效期

演示范例:

#  使用ttl去查看name这个key的有效期为-1 。-1表示永不过期
127.0.0.1:6379> ttl name
(integer) -1

# 使用ttl查看name1 的有效期。为-2因为没有这个key
127.0.0.1:6379> ttl name1
(integer) -2

# 使用 keys * 查看所有 key 只有 name 这个key
127.0.0.1:6379> KEYS *
1) "name"

3.4.1.12 设置 key 的过期时间

# 通过 set 设置一个 ttll 的 key 值为 100, ex 这个 key 存活 20 秒
127.0.0.1:6379> set ttll 100 ex 20
OK

# 通过查看这个 key 还能存活 17 秒
127.0.0.1:6379> ttl ttll
(integer) 17

# 再次查看返回值为 -2 表示没有此 key
127.0.0.1:6379> ttl ttll
(integer) -2

3.4.1.13 取消 key 过期时间

# 创建一个 zhang 的 key 值为 100
127.0.0.1:6379> SET zhang 100
OK

# 给 zhang 这个 key 添加一个存活时间为 1000 秒
127.0.0.1:6379> EXPIRE zhang 1000
(integer) 1

# 通过 ttl 查看 zhang 这个值的存活时间为 995
127.0.0.1:6379> ttl zhang
(integer) 995

# 在使用 PERIST 取消 zhang 这个 key 的过期时间
127.0.0.1:6379> PERSIST zhang
(integer) 1

# 在使用 tll 查看 zhang 的过期时间为永不过期
127.0.0.1:6379> ttl zhang
(integer) -1

3.4.2 列表

列表是一个双向可读写的管道,其头部是左侧尾部是右侧(左侧为L、右侧为R、可以从两侧进行增删改查),一个列表最多可以包含 2^32-1 个元素即 4294967295 个元素。LPUSH 是左侧往右侧写。RPUSH 是右侧往左侧写。列表使用与零时存数据。列表用户日志收集别较多。

3.4.2.1 生成列表并插入数据

1、LPUSH 是左侧往右侧写

# 使用 LPUSH 由左往右写入到 list1 表中,最后的 jhon 会在列表的最左侧。
127.0.0.1:6379> LPUSH list1 jack tom jhon
(integer) 3     # 提示有三个整数数据写入

# 查看 lsti1 这个表类型为 list 
127.0.0.1:6379> TYPE list1
list

2、RPUSH 是右侧往左侧写

# 使用 RPUSH 由右往左写入到 list2  表中,最后的 jhon 会在右侧
127.0.0.1:6379> RPUSH list2 jack tom jhon
(integer) 3     # 提示有三个整数数据写入

3.4.2.2 向列表追加数据

127.0.0.1:6379> LPUSH list1 zhang   # 往 list1 表的最左边追加一个 zhang 的数据
(integer) 4                         # 提示现在有 4 个数据

127.0.0.1:6379> RPUSH list1 zhang   # 往 list1 表的最右边追加一个 zhang 的数据
(integer) 5                         # 提示现在有 5 个数据

3.4.2.3 获取列表长度

# 因为我们刚才往 list1 这个表中追加了两个 zhang 的记录所以现在它的数据长度为 5 个数据
127.0.0.1:6379> LLEN list1
(integer) 5

# 我们没有往 list2 这个表中添加数据,只是默认写了 jack tom jhon 这三个数据
127.0.0.1:6379> LLEN list2
(integer) 3

3.4.2.4 获取列表指定位置数据

在 redis 中取值默认是从 0 开始。0 才是真正的第一个数据

# 创建一个由右至左的 list3 表,里面的数据为 zhang  wang li zhao
127.0.0.1:6379> RPUSH list3 zhang wang li zhao
(integer) 4

# 指定范围查找 list3 表中的 1 1 也就是说起始位是 1 结束位也是 1 的数据
127.0.0.1:6379> LRANGE list3 1 1
1) "wang"

# 指定范围查找起始位是 0 结束位是 1 的数据,就将 zhang wang 找到
127.0.0.1:6379> LRANGE list3 0 1
1) "zhang"
2) "wang"

3.4.2.5 移除列表数据

使用RPOP来取list 这个表中的元素。它默认是取一个元素而且从右往左取。并且他将元素取出来之后这个元素就会在list这个表中永久消失了。

# 使用 rpop 将 list3 表移除一个数据
127.0.0.1:6379> RPOP list3
"zhao"

# 通过 LLEN 查看 list3 表中就为三个数据,原本该表是有 4 个数据
127.0.0.1:6379> LLEN list3
(integer) 3

3.4.3 集合(set)

Set 是 String 类型的无序集合,集合中的成员是唯一的,这就意味着集合中不能出现重复的数据,可以在两个不同的集合中对数据进行对比并取值。一个集合中不能出现重名的数据。集合自带判断取重功能,将有差异的地方返回出来。集合主要用于对数据进行取值判断的

3.4.3.1 生成集合 key

# 使用SADD命令创建一个 set1 表的集合数据为 s1
127.0.0.1:6379> SADD set1 s1
(integer) 1

# 使用type 查看 set1 这个表的集合类型为set(集合)
127.0.0.1:6379> TYPE set1
set

2.4.3.2 追加数值

追加的时候不能追加已经存在的数值

# 使用SADD追加s2 s3这两个值到set1这个集合中
127.0.0.1:6379> SADD set1 s2 s3
(integer) 2                     # 返回为 2 表示追加了两个值到set1这个集合中

# 使用SADD来追加s2 到set1这个集合中
127.0.0.1:6379> SADD set1 s2
(integer) 0                     # 返回的就是0追加失败

2.4.3.3 查看集合的所有数据

# 使用SMEMBERS查看set1这个集合所有的值
127.0.0.1:6379> SMEMBERS set1
1) "s1"
2) "s3"
3) "s2"

2.4.3.4 获取集合的差集

差集:已属于 A 而不属于 B 的元素称为 A 与 B 的差(集),所谓差集就是将两个集合中有差异不相同的值获取出来。

# 创建一个 A 的集合,数据为 1 2 3
127.0.0.1:6379> SADD A 1 2 3
(integer) 3

# 创建一个 B 的集合,数据为 1 3
127.0.0.1:6379> SADD B 1 3
(integer) 2

# 通过 SDIFF 取出 A 和 B 之间不同的值,因为 A 有 2 而 B 没有就会将 2 打印
127.0.0.1:6379> SDIFF A B
1) "2"

# 但是取出 B 与 A 之间有不同的值,就显示空集合。因为在 B 集合中只有 1 和 3 这两个值但是在 B 这个集合中也有这两个值所以就会显示空集合
127.0.0.1:6379> SDIFF B A
(empty array)

2.4.3.5 获取集合的交集

交集:已属于A且属于B的元素称为A与B的交(集)所谓交集就是相同的意思

# 使用 sinter 将 A 和 B 两个集合之间有交集显示出来
127.0.0.1:6379> SINTER A B
1) "1"
2) "3"

# 这种情况不管将两个集合谁放前面都没有影响
127.0.0.1:6379> SINTER B A
1) "1"
2) "3"

2.4.3.6 获取集合的并集

并集:已属于 A 或属于 B 的元素为称为 A 与 B 的并(集)

# 使用 SUNION 将 A 和 B 两个集合之间拥有的值只显示一次
127.0.0.1:6379> SUNION A B
1) "1"
2) "2"
3) "3"

3.4.4 sorted set (有序集合)

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis 正是通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员 是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1), 集合中最大的成员数为 2^32 – 1 (4294967295, 每个集合可存储40多亿个成员)。

3.4.4.1 生成有序集合

在创建有序集合的时候不允许重复的成员,在同一个评分值可以有多个不同的值,但是在一个评分值只能有唯一的值

# 使用 ZADD 创建一个 zset1 有序集合表,并且写入一个 1 的值分数为 v1
127.0.0.1:6379> ZADD zset1 1 v1
(integer) 1

# 追加到 zset1 表中,写入 2 的值分数为 v2
127.0.0.1:6379> ZADD zset1 2 v2
(integer) 1

# 追加到 zset1 表中,写入 2 的值分数为 v2
127.0.0.1:6379> ZADD zset1 2 v3
(integer) 1

# 追加到 zset1 表中,写入 3 的值分数为 v4
127.0.0.1:6379> ZADD zset1 3 v4
(integer) 1

# 通过 type 查看 zset1 表为有序集合
127.0.0.1:6379> TYPE zset1
zset

# 但是在同一个评分值可以有多个不同的值,但是在一个分数只能有唯一的值
127.0.0.1:6379> ZADD zset1 1 v1
(integer) 0                         # 0 为创建失败

一次生成多个数据范例:

# 一次生成 1 v1 2 v2 3 v3 4 v4 这 4 个数值到 szte2 表中
127.0.0.1:6379> ZADD zste2 1 v1 2 v2 3 v3 4 v4
(integer) 4     # 提示创建 4 个成功

3.4.4.2 集合排行案例(用的多)

# 创建一个 paihangbang 的有序集合表,并且有 哪吒 90 票,战狼 199 票,侏罗纪 60 票,钢铁侠 30 票的这几个数据
127.0.0.1:6379> ZADD paihangbang 90 nezha 199 zhanlang 60 zhuluoji 30 gangtiexia
(integer) 4

# 通过 ZRANGE 查看排行榜并且指定排序依次从右往左排序 0 到-1, -1为最后一个。
127.0.0.1:6379> ZRANGE paihangbang 0 -1
1) "gangtiexia"
2) "zhuluoji"
3) "nezha"
4) "zhanlang"

# 显示指定集合内所有key和得分情况
127.0.0.1:6379> ZRANGE paihangbang 0 -1 withscores
1) "gangtiexia"
2) "30"
3) "zhuluoji"
4) "60"
5) "nezha"
6) "90"
7) "zhanlang"
8) "199"

3.4.4.3 获取集合的长度数

集合的长度一般用于商品的网页页面分页

# 查看 zset1 这个集合的长度
127.0.0.1:6379> ZCARD zset1
(integer) 4                         # 有 4 个数据长度

# 查看 排行榜 这个集合的长度
127.0.0.1:6379> ZCARD paihangbang
(integer) 4                         # 有 4 个数据长度

3.4.4.4 基于索引返回数值(用的多)

# 使用ZRANGE 取出paihangbang这个集合的0 到1 也就是第一个和第二个的值
127.0.0.1:6379> ZRANGE paihangbang 0 1
1) "gangtiexia"
2) "zhuluoji"

# 使用ZRANGE取出排行榜这个集合中0 到 9 的值。但是在排行榜这个集合中只有4个值所以就会将全部显示出来。超出范围的话就和0 到-1的一样的。
127.0.0.1:6379> ZRANGE paihangbang 0 9
1) "gangtiexia"
2) "zhuluoji"
3) "nezha"
4) "zhanlang"

3.4.4.5 返回某个数值的索引(用的不多)

知道这个数据但是不知道这个下标位的时候使用

127.0.0.1:6379> ZRANK zset1 v2
(integer) 1
127.0.0.1:6379> ZRANK zset1 v3
(integer) 2

3.4.5 哈希(hash)

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

3.4.5.1 生成 hash key

# 使用HSET创建一个hash1的 hash 类型表,名字为tom年龄18
127.0.0.1:6379> HSET hash1 name tom age 18
(integer) 2

# 通过 type 查看 hash1 表类型为 hash
127.0.0.1:6379> TYPE hash1
hash

3.4.5.2 获取 hash key 字段值

# 使用HGET来查看 hash1 表中的 name 字段值是 tom
127.0.0.1:6379> HGET hash1 name
"tom"

# 使用HGET来查看hash1 表中的 age 字段值是 18
127.0.0.1:6379> HGET hash1 age
"18"

3.4.5.3 删除一个 hash key 字段

# 删除 hash1 表中的 age 字段
127.0.0.1:6379> HDEL hash1 age
(integer) 1

# 通过 hget 查看 hash1 表中 age 字段为空
127.0.0.1:6379> HGET hash1 age
(nil)

3.4.5.4 获取所有 hash 表中的 key

# 使用 HKEYS 来查看 hash1 这个 hash 表中的 key,因为刚才我们上面将 age 这个 key 删除了所以现在只剩下了name 这个 key
127.0.0.1:6379> HKEYS hash1
1) "name"

3.4.5.5 获取指定 hash 的所有 key 及 value

# 通过 hset 创建 hash1 表 name key 字段为 zhang  age key 字段为 18
127.0.0.1:6379> HSET hash1 name zhang age 18
(integer) 1

# 通过 HGETALL 查看 hash1 表中所有的值。
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "zhang"
3) "age"
4) "18"
点赞