一文详解 Redis 常见数据类型
- 1.Redis 数据类型
- 2.String
- 3.key的层级格式
- 4.Hash
- 5.List
- 6.Set
- 7.SortedSet
1.Redis 数据类型
Redis支持五种基本数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3 种特殊数据结构 :HyperLogLogs(基数统计)、Bitmap (位存储)、Geospatial (地理位置)。
2.String
命令演示:
批量添加查看键值对:
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"
数值递增:
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19
127.0.0.1:6379> get age
"19"
3.key的层级格式
Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?
例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1
Redis的key允许有多个单词形成层级结构,多个单词之间用’:
'隔开,格式如下:
尝试插入:
127.0.0.1:6379> set klza:user:1 dahezhiquan
OK
127.0.0.1:6379> set klza:user:2 pipijiang
OK
127.0.0.1:6379> set klza:video:1 weiqiang
OK
127.0.0.1:6379> set klza:video:2 huanghun
OK
之后打开客户端,会以层级的方式展开数据:
4.Hash
Hash类型,也叫散列,其value是一个无序字典,类似于到Java中的HashMap结构。
插入一个hash值:
127.0.0.1:6379> hset page name qian
(integer) 1
127.0.0.1:6379> hset page age 18
(integer) 1
127.0.0.1:6379> hmget page name
1) "qian"
字段自增演示:
127.0.0.1:6379> hincrby page age 2
(integer) 20
127.0.0.1:6379> hincrby page age 2
(integer) 22
127.0.0.1:6379> hmget page age
1) "22"
5.List
Redis中的List类型与Java中的LinkedList
类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList
类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
添加元素演示:
127.0.0.1:6379> lpush users xiaoqian dahe wuwu
(integer) 3
127.0.0.1:6379> rpush users zhangsan lisi wangwu
(integer) 6
取出元素:(剔除并返回)
127.0.0.1:6379> lpop users
"wuwu"
6.Set
Redis的Set结构与Java中的HashSet
类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet
类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等操作
演示:添加元素,查看元素:
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "b"
2) "c"
3) "a"
添加重复元素,会添加失败:
127.0.0.1:6379> sadd s1 a d e
(integer) 2
127.0.0.1:6379> smembers s1
1) "b"
2) "c"
3) "d"
4) "a"
5) "e"
类似的,Set数据结构还支持多个集合的运算:
演示交集操作:
127.0.0.1:6379> sadd s2 a c g h
(integer) 4
127.0.0.1:6379> smembers s1
1) "b"
2) "c"
3) "d"
4) "a"
5) "e"
127.0.0.1:6379> smembers s2
1) "g"
2) "c"
3) "h"
4) "a"
127.0.0.1:6379> sinter s1 s2
1) "c"
2) "a"
7.SortedSet
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet
有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。
SortedSet具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能👥
注意:所有的排名默认都是升序,如果要降序则在命令的
Z
后面添加REV
即可🫂
演示添加元素:
127.0.0.1:6379> zadd score 88 dahe 100 xiaoqian 55 feifei
(integer) 3
查看排名:(默认从0开始)
127.0.0.1:6379> zrank score dahe
(integer) 1
127.0.0.1:6379> zrank score xiaoqian
(integer) 2
127.0.0.1:6379> zrank score feifei
(integer) 0
按分数从高到低查看排名:
127.0.0.1:6379> zrevrank score dahe
(integer) 1
查询0-90分的人数:
127.0.0.1:6379> zcount score 0 90
(integer) 2