10.Redis 数据类型
Redis 数据类型
- Redis 数据类型
- 1. 字符串 string
- 1.1 创建一个key
- 1.2 查看一个key的值
- 1.3 删除key
- 1.4 批量设置多个key
- 1.5 批量获取多个key
- 1.6 追加key的数据
- 1.7 设置新值并返回旧值
- 1.8 返回字符串 key 对应值的字节数
- 1.9 判断 key 是否存在
- 1.10 获取 key 的过期时长
- 1.11 重置key的过期时长
- 1.12 取消key的期限
- 1.13 数字递增
- 1.14 数字递减
- 1.15 数字增加
- 1.16 数字减少
- 2. 列表 list
- 2.1 创建列表和数据
- 2.2 列表追加新数据
- 2.3 获取列表长度(元素个数)
- 2.4 获取列表指定位置元素数据
- 2.5 修改列表指定索引值
- 2.6 删除列表数据
- 3. 集合 set
- 3.1 创建集合
- 3.2 集合中追加数据
- 3.3 获取集合的所有数据
- 3.4 删除集合中的元素
- 3.5 取集合的交集
- 3.6 取集合的并集
- 3.7 取集合的差集
- 4. 有序集合 sorted set
- 4.1 创建有序集合
- 4.2 查看集合的成员个数
- 4.3 基于索引查找数据
- 4.4 获取分数
- 4.5 删除元素
- 4.6 实现排名
- 4.7 查询指定数据的排名
- 5. 哈希 hash
- 5.1 创建 hash
- 5.2 查看hash的指定field的value
- 5.3 删除hash 的指定的 field/value
- 5.4 批量设置hash key的多个field和value
- 5.5 批量查看hash指定field的value
- 5.6 查看hash的所有field
- 5.7 查看hash 所有value
- 5.7 查看指定 hash的所有field及value
- 5.8 删除 hash
Redis 数据类型
1. 字符串 string
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任 意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。一个字符串类型的值最多能 存储512M字节的内容。Redis 中所有 key 都是字符串类型的。此数据类型最为常用
1.1 创建一个key
set 指令可以创建一个key 并赋值
如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。、Key 大小写敏感从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX
milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行SETNX key value 。
XX : 只在键已经存在时, 才对键进行设置操作。# 不论key是否存在.都设置
127.0.0.1:6379> set name munan
OK
127.0.0.1:6379> get name
"munan"
127.0.0.1:6379> type name # 判断类型
string127.0.0.1:6379> set age 18 ex 3 # 设置自动过期时间3s
OK
127.0.0.1:6379> get age # 3s后再查看值不存在
(nil)# key不存在,才设置,相当于add
127.0.0.1:6379> get title
(nil)
127.0.0.1:6379> setnx title good # set key value nx
(integer) 1# key存在,才设置,相当于update
127.0.0.1:6379> get title
"good"
127.0.0.1:6379> set title better xx
OK
127.0.0.1:6379> get title
"better"
1.2 查看一个key的值
127.0.0.1:6379> get title
"better"
1.3 删除key
127.0.0.1:6379> del title
(integer) 1
127.0.0.1:6379> get title
(nil)
1.4 批量设置多个key
127.0.0.1:6379> mset name zhang age 18
OK
1.5 批量获取多个key
127.0.0.1:6379> mget name age
1) "zhang"
2) "18"127.0.0.1:6379> keys *
1.6 追加key的数据
127.0.0.1:6379> get name
"zhang"
127.0.0.1:6379> append name " mu nan"
(integer) 12
127.0.0.1:6379> get name
"zhang mu nan"
1.7 设置新值并返回旧值
127.0.0.1:6379> set car BYD
OK
127.0.0.1:6379> getset car xiaomi
"BYD"
127.0.0.1:6379> get car
"xiaomi"
1.8 返回字符串 key 对应值的字节数
127.0.0.1:6379> get car
"xiaomi"
127.0.0.1:6379> strlen car
(integer) 6127.0.0.1:6379> set grade 六
OK
127.0.0.1:6379> get grade
"\xe5\x85\xad"
127.0.0.1:6379> strlen grade
(integer) 3
1.9 判断 key 是否存在
127.0.0.1:6379> exists name
(integer) 1
1.10 获取 key 的过期时长
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> ttl a
(integer) -2
127.0.0.1:6379> set bag hello ex 50
OK
127.0.0.1:6379> ttl bag
(integer) 44# ttl key 查看key的剩余生存时间,如果key过期后,会自动删除-1 # 返回值表示永不过期,默认创建的key是永不过期,重新对key赋值,也会从有剩余生命周期变成永不过期
-2 # 返回值表示没有此key
num # key的剩余有效期
1.11 重置key的过期时长
127.0.0.1:6379> set bag hello ex 50
OK
127.0.0.1:6379> ttl bag
(integer) 41
127.0.0.1:6379> expire bag 100
(integer) 1
127.0.0.1:6379> ttl bag
(integer) 98
1.12 取消key的期限
127.0.0.1:6379> ttl bag
(integer) 60
127.0.0.1:6379> persist bag
(integer) 1
127.0.0.1:6379> ttl bag
(integer) -1
1.13 数字递增
# 利用INCR命令簇(INCR, DECR, INCRBY,DECRBY)来把字符串当作原子计数器使用
127.0.0.1:6379> set num 0 # 设置初始值
OK
127.0.0.1:6379> get num
"0"
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> get num
"1"
1.14 数字递减
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> decr num
(integer) 0
127.0.0.1:6379> get num
"0"
1.15 数字增加
# 可以增加数值(也减小增加) 如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。127.0.0.1:6379> get num
"0"
127.0.0.1:6379> incrby num 10
(integer) 10
127.0.0.1:6379> get num
"10"
127.0.0.1:6379> incrby num -5
(integer) 5
127.0.0.1:6379> get num
"5"
1.16 数字减少
# decrby 可以减小数值(也可以增加)127.0.0.1:6379> get num
"5"
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> decrby num -5
(integer) 7
127.0.0.1:6379> get num
"7"
2. 列表 list
Redis列表实际就是简单的字符串数组,按照插入顺序进行排序
支持双向读写,可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含 2^32-1=4294967295个元素
每个列表元素用下标来标识,下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推
也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,元素值可以重复,常用于存入日志等场景,此数据类型比较常用
列表特点
- 有序
- 可重复
- 左右都可以操作
2.1 创建列表和数据
LPUSH和RPUSH都可以插入列表# LPUSH
将一个或多个值 value 插入到列表 key 的表头(最左边)如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表
mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH
mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作当 key 存在但不是列表类型时,返回一个错误# RPUSH
将一个或多个值 value 插入到列表 key 的表尾(最右边)如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作当 key 存在但不是列表类型时,返回一个错误# 从左边添加数据,已添加的需向右移
127.0.0.1:6379> lpush box 1 2 3 4
(integer) 4
127.0.0.1:6379> type box
list# 从右边添加数据,已添加的向左移
127.0.0.1:6379> rpush bug 1 2 3 4
(integer) 4
127.0.0.1:6379> type bug
list
2.2 列表追加新数据
127.0.0.1:6379> lpush box 5
(integer) 5
127.0.0.1:6379> rpush bug 5
(integer) 5
2.3 获取列表长度(元素个数)
127.0.0.1:6379> llen box
(integer) 5
2.4 获取列表指定位置元素数据
127.0.0.1:6379> lindex box 0 # 获取0编号的元素
"5"
127.0.0.1:6379> lindex box -1 # 获取最后一个的元素
"1"
127.0.0.1:6379> lrange box 0 -1 # 获取所有元素
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"127.0.0.1:6379> lrange bug 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
2.5 修改列表指定索引值
127.0.0.1:6379> lrange bug 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lset bug 2 22
OK
127.0.0.1:6379> lrange bug 0 -1
1) "1"
2) "2"
3) "22"
4) "4"
5) "5"
2.6 删除列表数据
127.0.0.1:6379> lrange box 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop box # 弹出左边第一个元素,即删除第一个
"5"
127.0.0.1:6379> rpop box # 弹出右边第一个元素,即删除最后一个
"1"
127.0.0.1:6379> lrange box 0 -1
1) "4"
2) "3"
3) "2"#LTRIM 对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
127.0.0.1:6379> lrange bug 0 -1
1) "1"
2) "2"
3) "22"
4) "4"
5) "5"
127.0.0.1:6379> ltrim bug 1 3
OK
127.0.0.1:6379> llen bug
(integer) 3
127.0.0.1:6379> lrange bug 0 -1
1) "2"
2) "22"
3) "4"# 删除list
127.0.0.1:6379> del bug
(integer) 1
127.0.0.1:6379> exists bug
(integer) 0
3. 集合 set
Set 是一个无序的字符串合集
同一个集合中的每个元素是唯一无重复的
支持在两个不同的集合中对数据进行逻辑处理,常用于取交集,并集,统计等场景,例如: 实现共同的朋友
集合特点
- 无序
- 无重复
- 集合间操作
3.1 创建集合
127.0.0.1:6379> sadd set1 s1 s2 s3
(integer) 3
127.0.0.1:6379> type set1
set
3.2 集合中追加数据
# 追加时,只能追加不存在的数据,不能追加已经存在的数值
127.0.0.1:6379> sadd set1 s4 s5 s6
(integer) 3
3.3 获取集合的所有数据
127.0.0.1:6379> smembers set1
1) "s1"
2) "s2"
3) "s3"
4) "s4"
5) "s5"
6) "s6"
3.4 删除集合中的元素
127.0.0.1:6379> srem set1 s6
(integer) 1
127.0.0.1:6379> smembers set1
1) "s1"
2) "s2"
3) "s3"
4) "s4"
5) "s5"
3.5 取集合的交集
交集:同时属于集合A且属于集合B的元素
可以实现共同的朋友
127.0.0.1:6379> sadd set2 s4 s5 s6 s7 s8
(integer) 5
127.0.0.1:6379> smembers set1
1) "s1"
2) "s2"
3) "s3"
4) "s4"
5) "s5"
127.0.0.1:6379> smembers set2
1) "s4"
2) "s5"
3) "s6"
4) "s7"
5) "s8"127.0.0.1:6379> sinter set1 set2
1) "s4"
2) "s5"
3.6 取集合的并集
并集:属于集合A或者属于集合B的元素
127.0.0.1:6379> sunion set1 set2
1) "s1"
2) "s2"
3) "s3"
4) "s4"
5) "s5"
6) "s6"
7) "s7"
8) "s8"
3.7 取集合的差集
差集:属于集合A但不属于集合B的元素
可以实现我的朋友的朋友
127.0.0.1:6379> sdiff set1 set2
1) "s1"
2) "s2"
3) "s3"
127.0.0.1:6379> sdiff set2 set1
1) "s6"
2) "s7"
3) "s8"
4. 有序集合 sorted set
Redis有序集合和Redis集合类似,是不包含相同字符串的合集。
它们的差别是,每个有序集合的成员都关联着一个双精度浮点型的评分
这个评分用于把有序集合中的成员按最低分到最高分排序。
有序集合的成员不能重复,但评分可以重复,一个有序集合中最多的成员数为 2^32 - 1=4294967295个, 经常用于排行榜的场景
有序集合特点
- 有序
- 无重复元素
- 每个元素是由score和value组成
- score 可以重复
- value 不可以重复
4.1 创建有序集合
127.0.0.1:6379> zadd zset1 1 z1
(integer) 1
127.0.0.1:6379> zadd zset1 2 z2 3 z3
(integer) 2
127.0.0.1:6379> type zset1
zset
4.2 查看集合的成员个数
127.0.0.1:6379> zcard zset1
(integer) 3
4.3 基于索引查找数据
127.0.0.1:6379> zrange zset1 0 2
1) "z1"
2) "z2"
3) "z3"
4.4 获取分数
127.0.0.1:6379> zscore zset1 z2
"2"
4.5 删除元素
127.0.0.1:6379> zrange zset1 0 -1
1) "z1"
2) "z2"
3) "z3"
127.0.0.1:6379> zrem zset1 z2
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
1) "z1"
2) "z3"
4.6 实现排名
127.0.0.1:6379> zadd course 99 linux 88 python 77 go 66 java 55 c
(integer) 5
127.0.0.1:6379> zrange course 0 -1 withscores # 正序排序后显示集合内所有的key,按score从小到大显示并显示指定集合内所有key和得分情况1) "c"2) "55"3) "java"4) "66"5) "go"6) "77"7) "python"8) "88"9) "linux"
10) "99"
127.0.0.1:6379> zrevrange course 0 -1 withscores # 倒序排序后显示集合内所有的key,score从大到小显示并显示指定集合内所有key和得分情况1) "linux"2) "99"3) "python"4) "88"5) "go"6) "77"7) "java"8) "66"9) "c"
10) "55"
4.7 查询指定数据的排名
127.0.0.1:6379> zrange course 0 -1
1) "c"
2) "java"
3) "go"
4) "python"
5) "linux"
127.0.0.1:6379> zrank course python
(integer) 3 # 第4个
5. 哈希 hash
hash 即字典, 用于保存字符串字段field和字符串值value之间的映射,即key/value做为数据部分
hash特别适合用于存储对象场景
一个hash最多可以包含2^32-1 个key/value键值对
哈希特点
- 无序
- K/V 对
- 适用于存放相关的数据
5.1 创建 hash
将哈希表 hash 中域 field 的值设置为 value 如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。127.0.0.1:6379> hset h1 name zhang age 18
(integer) 2
127.0.0.1:6379> type h1
hash# 查看所有字段的值
127.0.0.1:6379> hgetall h1
1) "name"
2) "zhang"
3) "age"
4) "18"# 增加字段
127.0.0.1:6379> hset h1 gender man
(integer) 1
127.0.0.1:6379> hgetall h1
1) "name"
2) "zhang"
3) "age"
4) "18"
5) "gender"
6) "man"
5.2 查看hash的指定field的value
127.0.0.1:6379> hget h1 age
"18"# 获取多个值
127.0.0.1:6379> hmget h1 name age
1) "zhang"
2) "18"
5.3 删除hash 的指定的 field/value
127.0.0.1:6379> hgetall h1
1) "name"
2) "zhang"
3) "age"
4) "18"
5) "gender"
6) "man"
127.0.0.1:6379> hdel h1 gender
(integer) 1
127.0.0.1:6379> hgetall h1
1) "name"
2) "zhang"
3) "age"
4) "18"
5.4 批量设置hash key的多个field和value
127.0.0.1:6379> hmset h2 name shi age 22 city hangzhou gender man
OK
127.0.0.1:6379> hgetall h2
1) "name"
2) "shi"
3) "age"
4) "22"
5) "city"
6) "hangzhou"
7) "gender"
8) "man"
5.5 批量查看hash指定field的value
127.0.0.1:6379> hmget h2 name city gender
1) "shi"
2) "hangzhou"
3) "man"
5.6 查看hash的所有field
127.0.0.1:6379> hkeys h1
1) "name"
2) "age"
5.7 查看hash 所有value
127.0.0.1:6379> hvals h1
1) "zhang"
2) "18"
5.7 查看指定 hash的所有field及value
127.0.0.1:6379> hgetall h1
1) "name"
2) "zhang"
3) "age"
4) "18"
5.8 删除 hash
127.0.0.1:6379> del h1
(integer) 1
127.0.0.1:6379> exists h1
(integer) 0