Redis保存数据的方式是【key-value】形式的,其中key的数据类型为 String ,本文介绍的五种基本数据类型指的是【key-value】中的value的数据类型。
Redis 基本数据类型概要
先看一下表格及示意图再读每个类型的解析有利于让你的知识结构化。
Redis 基本数据类型 Key-Value 概要表
| Key | Value | 读写能力 |
|---|---|---|
| String | 字符串、整数、浮点数 | 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作 |
| List | 一个存储字符串的链表 | 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素 |
| Set | 包含字符串的无序集合 | 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等 |
| Hash | 与Java中的HashMap类似,key-value均为字符串。 | 包含方法有添加、获取、删除单个元素 |
| SortedSet | 存储键的值及分数 | 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素 |
Redis 基本数据类型 Key-Value 概要图
Redis 基本数据类型之 String
String 是 Redis 最基本的类型,其他基本数据类型包含的元素都是 String 类型,而且 String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。比如 jpg 图片或者序列化的对象。从内部实现来看其实 String 可以看作 byte 数组,最大上限是 512MB 。
String 类型的源码
struct sdshdr {long len;long free;char buf[];};
String 类型的源码说明
从上面 String 源码我们了解到 buf 是个char数组用于存储字符串内容。其实char和c#中的byte是等价的,都是一个字节。len 表示 buf 数组的长度,free 表示数组中可用字节数。由此可以理解为什么 String 类型是二进制安全的了,因为它本质上就是个byte数组,当然可以包含任何数据了。另外 String类型可以被部分命令按 int 处理比如incr 、decr 等命令。
String 常用命令
这里仅列出常用的命令,具体命令可以查看 Redis 官方提供的文档。
| 命令 | 描述 |
|---|---|
| GET key | 根据 key 获取 value |
| SET key value | 为 key 设置 value |
| DEL key | 删除 key 及 value |
| INCR key | 将 key 对应的 value 加 1 |
| DECR key | 将 key 对应的 value 减 1 |
| INCRBY key num | 将 key 对应的 value 加 num |
| DECRBY key num | 将 key 对应的 value 减 num |
String 常用命令演示
命令行简单的演示一下。
127.0.0.1:6379> set key1 value1OK127.0.0.1:6379> get key1"value1"127.0.0.1:6379> del key1(integer) 1127.0.0.1:6379> get key1(nil)127.0.0.1:6379> get key2"2"127.0.0.1:6379> incr key2(integer) 3127.0.0.1:6379> get key2"3"127.0.0.1:6379> incrby key2 100(integer) 103127.0.0.1:6379> get key2"103"127.0.0.1:6379> decr key2(integer) 102127.0.0.1:6379> get key2"102"
Redis 基本数据类型 List
List 是一个 String 类型的双向链表,可以把他当作 Java 中的 String 类型的 LinkedList 或者 ArrayDeque。
List 常用命令
| 命令 | 描述 |
|---|---|
| LPUSH key value | 将 value 从链表的左侧插入 |
| RPUSH key value | 将 value 从链表的右侧插入 |
| LPOP key | 将链表最左侧的元素移除并返回结果 |
| RPOP key | 将链表最右侧的元素移除并返回结果 |
| LRANGE key 0 -1 | 获取列表在给定范围上的所有值 |
| LINEX key index | 通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 |
List 常用命令演示
命令行简单的演示一下。
127.0.0.1:6379> lpush mylist 1 2 ll ls mem(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "mem"2) "ls"3) "ll"4) "2"5) "1"127.0.0.1:6379> lindex mylist -1"1"127.0.0.1:6379> lindex mylist 10 # index不在 mylist 的区间范围内(nil)
实战场景
实战!
场景一:比如某微博大V由于 ta 独到的见解访问量大,使用结构数据库 MySQL 无法满足响应速度的要求,这时我们可以使用 Redis中的 List 数据类型将他的微博内容进行保存以提高访问速度。每发布一条微博就将 ta 的微博内容使用 PUSH 命令保存至 Redis 。
场景二:比如我们做抢购类业务开发时,由于这类业务是短时间内会有大量的请求使用结构型数据库是无法满足业务场景的,这是我们可以先将请求的数据按照先保存在 List 中,然后再使用MySQL慢慢地对数据进行消化。
Redis 基本数据类型 Set
Set 结构特性及底层实现与 Java 中的 HashSet 非常相似,Set 是一个String 类型的集合,集合中的元素不会重复。
Set 常用命令
| 命令 | 描述 |
|---|---|
| SADD key value1 value 2 .. | 向集合中添加元素 |
| SCARD key | 获取集合中的元素数量 |
| SMEMBERS key | 获取集合中的全部元素 |
| SISMEMBER key value | 判断集合中是否包含 value 返回值1表示包含 0表示不包含 |
Set 常用命令演示
127.0.0.1:6379> sadd setKey1 hello world hello beacon(integer) 3127.0.0.1:6379> smember setKey11) "hello"2) "world"3) "beacon"127.0.0.1:6379> sismember setKey1 beacon(integer) 1
Redis 基本数据类型 Hash
Redis hash 是一个 String 类型的 field 和 String 类型的 value映射表,hash 特别适合用于存储对象,类似Java里面的 Map
。
Hash 常用命令
| 命令 | 描述 |
|---|---|
| HSET key1 sub_key1 value1 | 添加键值对 |
| HGET key1 sub_key1 | 获取指定散列键的值 |
| HGETALL hash-key | 获取散列中包含的所有键值对 |
| HDEL key1 sub_key1 | 移除 key1 对应的键值对当中键为 sub_key1 的值 |
Hash常用命令演示
127.0.0.1:6379> hset user name1 hao(integer) 1127.0.0.1:6379> hset user email1 hao@163.com(integer) 1127.0.0.1:6379> hgetall user1) "name1"2) "hao"3) "email1"4) "hao@163.com"127.0.0.1:6379> hget user user(nil)127.0.0.1:6379> hget user name1"hao"127.0.0.1:6379> hset user name2 xiaohao(integer) 1127.0.0.1:6379> hset user email2 xiaohao@163.com(integer) 1127.0.0.1:6379> hgetall user1) "name1"2) "hao"3) "email1"4) "hao@163.com"5) "name2"6) "xiaohao"7) "email2"8) "xiaohao@163.com"
实战场景
用于缓存一组相关数据,相比于 String 类型更直观的查看数据,且更节省内容空间。例如:存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储有如下两种方式
- 方式一:
![]()
此种方式每次修改用户的某个属性时需要先反序列化改好后再序列化,开销较大。
- 方式二:
![]()
此种方式Key中包含用户ID数据冗余,浪费了一些不必要的内存空间。
使用 Hash 数据结构来实现上面的业务需求,如下图所示,减少了不必要的序列化和反序列化,同时也没有冗余的用户ID信息。
Redis 基本数据类型 Zset
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
Zset 与 Set 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合中的元素是唯一的,但评分可以是重复的。
Zset 常用命令
| 命令 | 描述 |
|---|---|
| ZADD key1 666 socre1 | 将一个带有给定分值的元素添加到有序集合里面。 |
| ZRANGE key1 0 -1 withscores | 返回有序集 key 中,下标在0到-1之间的元素. |
| ZREM zset-key member1 | 如果给定元素成员存在于有序集合中,那么就移除这个元素。 |
Zset 常用命令演示
127.0.0.1:6379> zadd key1 99 大杯 88 中杯(integer) 2127.0.0.1:6379> ZRANGE key1 0 -11) "大杯"2) "中杯"127.0.0.1:6379> ZSCORE key1 大杯"100"
实战场景
使用Zset可以实现一个文章的访问量排行榜。
