Redis通用教程:数据结构类型、与其他数据库和缓存系统的比较
Redis通用教程旨在让大家对Redis有一个概念性和总体性的了解,为快速上手并为深入了解Redis奠定基础。
文章摘要:
- Redis简介
- Redis与其他数据库的对比
- Redisin♶数据♶缓存实现类型对比Redis命令功能多种数据types
- Spring Data Redis 使用多种数据类型
- ZSet(有序集) 保证顺序
- 集(Set) 我得到随机元素
断开到redis
redis 是一个非降级数据库(非放置数据库称为 nosql)。
Redis 是一个远程内存数据库。 Redis 客户端可以通过 TCP 协议向服务器请求。
Redis性能强劲,支持持久化和复制,可以轻松存储和读取海量数据。
Redis 有多快? Redis 附带了一个名为 redis-benchmark 的工具来模拟 N 个客户端同时发送 M 个请求。可以通过redis-benchmark -h命令查看参数。
下面测试了百万次SET和GET操作的性能:
$ redis-benchmark -n 1000000 -t set,get -P 16 –q
SET: 198098.27 requests per second
GET: 351988.72 requests per second
复制代码
Redis与其他数据库的比较
如果局限于一处,很容易“只见森林”而不见森林树。 ,或者“你手里的那个”拿着锤子,一切看起来都像钉子。
所以我们先和市场上常用的数据库系统进行横向比较,以便大家更直观地感受到Redis的特点。
Redis与其他缓存实现的比较
同时Redis是一种常用的缓存实现。我们还比较了常用缓存实现的优缺点。
Redis 数据类型
Redis 5 引入了新的流数据类型(Stream data type)。在此之前,Redis 可以存储键和 5 种不同数据结构类型之间的映射。这五种数据结构类型分别是STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。
Redis 中 5 种数据类型概述
数字 | 结构类型 | 结构体 STRING 中存储的值 | 字符串、整数、浮点数 | 执行以下操作整个字符串或它的一部分;对整数和浮点数进行加法或减法运算 |
---|---|---|---|---|
2 | LIST | 链表,链表的每个节点都包含一个字符串 | 从链表两端推送或弹出元素;按偏移量修剪链表;读取单个或多个元素;按值查找或删除元素 | |
3 | SET | 包含字符串和不可重复项的无序集合 | 插入、获取和删除单个元素;检查数组中是否存在元素;计算交集、并集和分离;从集合中随机获取元素 | |
4 | HASH | 包含键值对的无序哈希表 | 插入、获取、删除一个键值对;获取所有键值 | |
5 | ZSET | 字符串成员(成员)和浮点(计数)之间的有序映射。元素的顺序由点的大小决定 | 添加、获取和删除单个元素;通过 |
获取分数(范围)或会员元 Redis 命令使用 5 种数据类型
STRING 命令
字符串函数
SETs 最基本的 获取
和DEL
功能。它还支持许多复杂的功能,下面简单介绍一下。
数字 | 命令 | 描述 |
---|---|---|
1 | 设置键值 | 设置指定键值G❙❙❙指定键的值 |
3 | DEL键 | 删除该键及其对应的值。命令可用于五种数据类型 |
4 | GETRANGE 键开始 结束 | 返回 |
5 | w 键值的小写字符以及SETRANGE 键的溢出值。 value 参数 设置从偏移量 offset | |
6 | STRLEN 开始存储在键中的字符串的值 key | 返回存储在键 |
中的字符串的值。这里简单介绍一下命令函数字符串:SETEX和SETNX
SETEX和SETNX对于做分布式锁非常有用。
数字 | 命令 | 描述 | |
---|---|---|---|
1 | SETEX 键秒值 | 将结束值附加到第二个键 (s) (s) SETNX 键值 | 仅当没有键时才设置键值存在 |
数字功能
对于数字,支持以下功能: ❙❙ 描述
127.0.0.1:6379> SET key-num 0
OK
127.0.0.1:6379> INCR key-num
(integer) 1
127.0.0.1:6379> GET key-num
"1"
127.0.0.1:6379> INCR key-num
(integer) 2
127.0.0.1:6379> GET key-num
"2"
127.0.0.1:6379> INCR key-num
(integer) 3
127.0.0.1:6379> GET key-num
"3"
127.0.0.1:6379> INCRBY key-num 100
(integer) 103
127.0.0.1:6379> GET key-num
"103"
127.0.0.1:6379> INCRBY key-num 100
(integer) 203
127.0.0.1:6379> DECR key-num
(integer) 202
127.0.0.1:6379> DECRBY key-num 100
(integer) 102
127.0.0.1:6379> DECRBY key-num 100
(integer) 2
127.0.0.1:6379> DECRBY key-num 100
(integer) -98
复制代码
批量功能
编号 | 命令 | 说明 | 。 按值键检索所有(一个或多个) |
---|---|---|---|
2 | MSET 键值 [键值...] | 同时设置一对或多对键值 | |
3 | MSETNX 键值 [键值...] | 当且仅当所有给定键都不存在时,同时设置一个或多个键值对 |
127.0.0.1:6379> MSET a 1 b 2 c 3
OK
127.0.0.1:6379> MGET a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> MSETNX a 1 b 2 c 3
(integer) 0
127.0.0.1:6379> MSETNX a 1 b 2 d 4
(integer) 0
127.0.0.1:6379> MSETNX d 4 e 5
(integer) 1
127.0.0.1:6379>
复制代码
BIT 函数
数字 | 命令 ❙❙ 描述❝ TB❙ 已存储密钥string value ,获取指定偏移量的位 | |
---|---|---|
2 | SETBIT key offset value | 对于 key 中存储的字符串值,设置或清除指定 offset 的位 |
3 | BIT COUNT key [start] [end] 字符串中设置的位数 | |
4 | BITOP 函数 destkey key [key .. .] | 在多个键之间执行按位运算(包括字符串值) 应用并将结果存储到目标键中。 |
LIST 命令
Redis 的独特功能之一是它支持链表结构。以下是使用链表结构的命令。了解这些命令对于掌握Redis链表结构非常重要。
编号 | 命令 | 描述 |
---|---|---|
1 | BLPOP key1 [key2 ] 超时 | 删除并获取列表的第一个元素。如果列表中没有元素,它会阻塞列表,直到等待时间到期或找到弹出元素。 。 |
2 | BRPOP key1 [key2 ] 超时 | 删除并检索列表的最后一个元素。如果列表中没有元素,它会阻塞列表,直到超时或找到弹出窗口。 |
3 | BRPOPLPUSH源项超时 | 从列表中打开一个值,将弹出元素添加到另一个列表中,然后返回;如果列表中没有元素,它会阻塞列表,直到等待时间到期或找到弹出元素。 |
4 | LINDEX 键索引 | 按索引查找列表中的元素 |
5 | LINSERT 键 BEFORE | AFTER 枢轴值 |
1 | AFTER 枢轴值 | |
1 | ||
7 | LPOP 键 | 移出并获取列表的第一个元素 |
8 | LPUSH key value1 [value2] | 在列表开头添加一个或多个值 |
9 | LPUSHX key value | 在头部ofert一个值现有列表 |
10 | LRANGE -键开始停止 | 查找列表指定范围内包含的元素 |
11 | LREM键值 | 删除列表元素 |
10 | 索引值索引为 | |
13 | L的列表元素TRIM键启动stop | 剪切列表,即让列表只保留指定范围内的元素,不在指定范围内的元素被移除。 |
14 | RPOP键 | 删除列表的最后一个元素,所以返回值为被删除的元素。 |
15 | RPOPLPUSH 源项目 | 删除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 | RPUSH 键值 1 [值 2]❝ | 为现有列表添加价值 |
127.0.0.1:6379> LPUSH list1 1
(integer) 1
127.0.0.1:6379> RPOP list1
"1"
127.0.0.1:6379> RPOP list1
(nil)
127.0.0.1:6379> BRPOP list1 10
(nil)
(10.10s)
127.0.0.1:6379>
127.0.0.1:6379> LPUSH list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LSET list1 4 50
OK
127.0.0.1:6379> LSET list1 5 50
(error) ERR index out of range
复制代码
其中 BLPOP
SET命令
Redis的Set是字符串类型的无序集合。集合的成员是唯一的,这意味着集合中不能出现重复的数据。
Redis 中的集合是通过哈希表实现的,所以增删查查的复杂度都是 O(1)。
Redis限制每个key只能存储5.12亿条数据,最大集合成员数为232-1(4294967295,每个集合可以容纳超过40亿个成员)。
编号 | 命令 | 描述 | |
---|---|---|---|
1 | SADD关键成员1 [成员2] | 将一名或多名成员添加到ARD❀。 检索系列成员的数量 | |
3 | SDIFF key1 [key2] | 返回所有给定集合的差异集 | |
4 | SDIFFSTORE目标key1 [key2] | 返回所有给定集合的差异集和将其存储在 key 2 返回所有给定集合交集的集合 | |
6 | SINTERSTORE 目标 key1 [key2] | 返回所有给定集合的交集并将其存储在目标中。 set key | |
8 | SMEMBERS key | 返回集合中的所有成员 | |
9 | MOVE 源目标成员 | 从源集合中移动成员元素 SP 删除并返回收藏 | |
11 | SRANDMEMBER key [count] | 从集合中返回一个或多个随机数 | |
12 | SREM key member1 [member2] Key COUNT count] | 迭代集合的元素 |
127.0.0.1:6379> SADD set1 a b c d e
(integer) 5
127.0.0.1:6379> SCARD set
(integer) 0
127.0.0.1:6379> SCARD set1
(integer) 5
127.0.0.1:6379> SISMEMBER set1 f
(integer) 0
127.0.0.1:6379> SISMEMBER set1 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"
3) "a"
4) "b"
5) "e"
127.0.0.1:6379> SPOP set1
"d"
127.0.0.1:6379> SPOP set1
"a"
127.0.0.1:6379> SMOVE set1 set2 b
(integer) 1
127.0.0.1:6379> SMOVE set1 set2 c
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "b"
2) "c"
复制代码
SPOP
对于随机性来说,可以作为彩票等业务场景的基础实现。
HASH命令
Redis哈希是字符串类型字段和值的映射表。它类似于Java语言的map结构。哈希特别适合存储对象。† 查看哈希表键并判断字段是否存在
127.0.0.1:6379> HSET User001 name "Tom"
(integer) 1
127.0.0.1:6379> HSET User001 birthday "1990-01-20"
(integer) 1
127.0.0.1:6379> HSET User001 gender "Man"
(integer) 1
127.0.0.1:6379> HKEYS User001
1) "name"
2) "birthday"
3) "gender"
127.0.0.1:6379> HGETALL User001
1) "name"
2) "Tom"
3) "birthday"
4) "1990-01-20"
5) "gender"
6) "Man"
复制代码
ZSET 命令
排序数组(例如哈希)用于存储键值对。有序集的键称为成员,每个成员都是不同的;而有序集合的值称为点,该点必须是浮点数。† ZCARD 键
127.0.0.1:6379> ZADD Users 1 zhangsan 2 lisi 3 wangwu 4 maliu
(integer) 4
127.0.0.1:6379> ZCARD Users
(integer) 4
127.0.0.1:6379> ZRANK Users maliu
(integer) 3
127.0.0.1:6379> ZSCAN Users 0
1) "0"
2) 1) "zhangsan"
2) "1"
3) "lisi"
4) "2"
5) "wangwu"
6) "3"
7) "maliu"
8) "4"
127.0.0.1:6379>
复制代码
这个这篇文章介绍 Redis ,横向比较可以帮助大家对Redis的特性和功能有一个大概的了解。然后我们交替介绍了Redis的五种基本数据结构及其使用命令。作为Redis的入门指南,本文旨在让大家对Redis有一个概念性和总体性的了解,为彻底了解Redis打下基础。
作者:李江涛
来源:掘金
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。