后端开发必须要懂的Redis,Redis的数据结构
认识Redis与Redis的数据结构
本文作为Redis的通识教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础。
文章概要:
- Redis的介绍
- Redis与其他数据库的对比
- Redis与其他缓存实现对比
- Redis的数据结构类型
- Redis命令操作几种数据类型
- Spring Data Redis操作几种数据类型
- ZSET(有序集合)保证顺序
- SET(集合)随机获取元素
Redis的介绍
Redis是一种非关系型数据库(non-relational database, 简称nosql)。
Redis是一个远程内存数据库,Redis客户端可以通过TCP协议请求服务端。
Redis性能强劲,且支持持久化和复制,可以方便地存储和读取海量数据。
那么Redis到底有多快? Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求,你可以使用 redis-benchmark -h 来查看参数。
下面测试了100万次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可以存储键(key)与5种不同数据结构类型之间的映射,这5种数据结构类型分别为STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。
分享更多关于 Linux后端开发网络底层原理知识学习提升 ,完善技术栈,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。学习视频点击:C/C++Linux后台服务器开发高级架构师学习视频
Redis 5种数据类型概览
编号 |
结构类型 |
结构存储的值 |
结构的读写能力 |
1 |
STRING |
字符串、整数、浮点数 |
对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作 |
2 |
LIST |
一个链表,链表上的每个节点都包含了一个字符串 |
从链表的两端推入或者弹出元素(队列操作);根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素 |
3 |
SET |
包含字符串的无序收集器(unordered collection)且不可重复 |
添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
4 |
HASH |
包含键值对的无序散列表 |
添加、获取、移除单个键值对;获取所有键值 |
5 |
ZSET |
字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 |
添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元 |
Redis命令操作5种数据类型
STRING命令
字符串操作
对于字符串,Redis支持最基础的SET GET 和 DEL操作。也支持很多复杂的操作,下面简要介绍一下。
编号 |
命令 |
描述 |
1 |
SET key value |
设置指定 key 的值 |
2 |
GET key |
获取指定 key 的值 |
3 |
DEL key |
删除此key以及其对应的value,这个命令对5种数据类型都适用 |
4 |
GETRANGE key start end |
返回 key 中字符串值的子字符 |
5 |
SETRANGE key offset value |
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
6 |
STRLEN key |
返回 key 所储存的字符串值的长度 |
下面简单演示一下Command操作字符串:
127.0.0.1:6379> GET key-string
(nil)
127.0.0.1:6379> SET key-str "my string value"
OK
127.0.0.1:6379> GET key-str
"my string value"
127.0.0.1:6379> DEL key-str
(integer) 1
127.0.0.1:6379> GET key-str
(nil)
127.0.0.1:6379>
SETEX与SETNX
SETEX与SETNX在做分布式锁的时候很有用。
编号 |
命令 |
描述 |
1 |
SETEX key seconds value |
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
2 |
SETNX key value |
只有在 key 不存在时设置 key 的值 |
举个 SETEX 应用的例子:
在实现分布式session时,当用户登录时设置指定的过期时间。每当用户请求一个接口,就重新设置一下过期时间。当在指定的时间内未调用任何接口时,分布式session就失效了。
数字操作
对于数字,支持如下操作:
编号 |
命令 |
描述 |
1 |
INCR key |
将 key 中储存的数字值增一 |
2 |
INCRBY key increment |
将 key 所储存的值加上给定的增量值(increment) |
3 |
INCRBYFLOAT key increment |
将 key 所储存的值加上给定的浮点增量值(increment) |
4 |
DECR key |
将 key 中储存的数字值减一 |
5 |
DECRBY key decrement |
key 所储存的值减去给定的减量值(decrement) |
下面简单演示一下Command:
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
批量操作
编号 |
命令 |
描述 |
1 |
MGET key1 [key2..] |
获取所有(一个或多个)给定 key 的值 |
2 |
MSET key value [key value ...] |
同时设置一个或多个 key-value 对 |
3 |
MSETNX key value [key value ...] |
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
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操作
编号 |
命令 |
描述 |
1 |
GETBIT key offset |
对 key 所储存的字符串值,获取指定偏移量上的位(bit) |
2 |
SETBIT key offset value |
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
3 |
BITCOUNT key [start] [end] |
计算字符串中的设置位数 |
4 |
BITOP operation destkey key [key ...] |
在多个键(包含字符串值)之间执行按位操作并将结果存储在目标键中。 |
LIST命令
Redis的独特之处之一就在于它支持一个链表结构,下面是对链表结构的操作命令,熟悉这些命令对于你掌握Redis的链表结构十分重要。
编号 |
命令 |
描述 |
1 |
BLPOP key1 [key2 ] timeout |
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
2 |
BRPOP key1 [key2 ] timeout |
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
3 |
BRPOPLPUSH source destination timeout |
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
4 |
LINDEX key index |
通过索引获取列表中的元素 |
5 |
LINSERT key BEFORE |
AFTER pivot value |
6 |
LLEN key |
获取列表长度 |
7 |
LPOP key |
移出并获取列表的第一个元素 |
8 |
LPUSH key value1 [value2] |
将一个或多个值插入到列表头部 |
9 |
LPUSHX key value |
将一个值插入到已存在的列表头部 |
10 |
LRANGE key start stop |
获取列表指定范围内的元素 |
11 |
LREM key count value |
移除列表元素 |
12 |
LSET key index value |
通过索引设置列表元素的值 |
13 |
LTRIM key start stop |
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
14 |
RPOP key |
除列表的最后一个元素,返回值为移除的元素。 |
15 |
RPOPLPUSH source destination |
移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 |
RPUSH key value1 [value2] |
在列表中添加一个或多个值 |
17 |
RPUSHX key value |
为已存在的列表添加值 |
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 BRPOP BRPOPLPUSH 是阻塞式的,通常用在消息队列中。
分享更多关于 Linux后端开发网络底层原理知识学习提升 ,完善技术栈,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。学习视频点击:C/C++Linux后台服务器开发高级架构师学习视频
SET命令
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
Redis限制了每个key只能存储512M数据,集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
编号 |
命令 |
描述 |
1 |
SADD key member1 [member2] |
向集合添加一个或多个成员 |
2 |
SCARD key |
获取集合的成员数 |
3 |
SDIFF key1 [key2] |
返回给定所有集合的差集 |
4 |
SDIFFSTORE destination key1 [key2] |
返回给定所有集合的差集并存储在 destination 中 |
5 |
SINTER key1 [key2] |
返回给定所有集合的交集 |
6 |
SINTERSTORE destination key1 [key2] |
返回给定所有集合的交集并存储在 destination 中 |
7 |
SISMEMBER key member |
判断 member 元素是否是集合 key 的成员 |
8 |
SMEMBERS key |
返回集合中的所有成员 |
9 |
SMOVE source destination member |
将 member 元素从 source 集合移动到 destination 集合 |
10 |
SPOP key |
移除并返回集合中的一个随机元素 |
11 |
SRANDMEMBER key [count] |
返回集合中一个或多个随机数 |
12 |
SREM key member1 [member2] |
移除集合中一个或多个成员 |
13 |
SUNION key1 [key2] |
返回所有给定集合的并集 |
14 |
SUNIONSTORE destination key1 [key2] |
所有给定集合的并集存储在 destination 集合中 |
15 |
SSCAN key cursor [MATCH pattern] [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 hash 是一个string类型的field和value的映射表,类似于Java语言中的Map结构,hash特别适合用于存储对象。
编号 |
命令 |
描述 |
1 |
HDEL key field1 [field2] |
删除一个或多个哈希表字段 |
2 |
HEXISTS key field |
查看哈希表 key 中,指定的字段是否存在 |
3 |
HGET key field |
获取存储在哈希表中指定字段的值 |
4 |
HGETALL key |
获取在哈希表中指定 key 的所有字段和值 |
5 |
HINCRBY key field increment |
为哈希表 key 中的指定字段的整数值加上增量 increment |
6 |
HINCRBYFLOAT key field increment |
为哈希表 key 中的指定字段的浮点数值加上增量 increment |
7 |
HKEYS key |
获取所有哈希表中的字段 |
8 |
HLEN key |
获取哈希表中字段的数量 |
9 |
HMGET key field1 [field2] |
获取所有给定字段的值 |
10 |
HMSET key field1 value1 [field2 value2 ] |
同时将多个 field-value (域-值)对设置到哈希表 key 中 |
11 |
HSET key field value |
将哈希表 key 中的字段 field 的值设为 value |
12 |
HSETNX key field value |
只有在字段 field 不存在时,设置哈希表字段的值。 |
13 |
HVALS key |
获取哈希表中所有值 |
14 |
HSCAN key cursor [MATCH pattern] [COUNT count] |
迭代哈希表中的键值对。 |
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命令
有序集合和散列一样,都用于存储键值对。有序集合的键被称为成员(member),每个成员都是各不相同的;而有序集合的值则被称为分值(score),分值必须为浮点数。
编号 |
命令 |
描述 |
1 |
ZADD key score1 member1 [score2 member2] |
向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 |
ZCARD key |
获取有序集合的成员数 |
3 |
ZCOUNT key min max |
计算在有序集合中指定区间分数的成员数 |
4 |
ZINCRBY key increment member |
有序集合中对指定成员的分数加上增量 increment |
5 |
ZINTERSTORE destination numkeys key [key ...] |
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
6 |
ZLEXCOUNT key min max |
在有序集合中计算指定字典区间内成员数量 |
7 |
ZRANGE key start stop [WITHSCORES] |
通过索引区间返回有序集合成指定区间内的成员 |
8 |
ZRANGEBYLEX key min max [LIMIT offset count] |
通过字典区间返回有序集合的成员 |
9 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] |
通过分数返回有序集合指定区间内的成员 |
10 |
ZRANK key member |
返回有序集合中指定成员的索引 |
11 |
ZREM key member [member ...] |
移除有序集合中的一个或多个成员 |
12 |
ZREMRANGEBYLEX key min max |
移除有序集合中给定的字典区间的所有成员 |
13 |
ZREMRANGEBYRANK key start stop |
移除有序集合中给定的排名区间的所有成员 |
14 |
ZREMRANGEBYSCORE key min max |
移除有序集合中给定的分数区间的所有成员 |
15 |
ZREVRANGE key start stop [WITHSCORES] |
返回有序集中指定区间内的成员,通过索引,分数从高到底 |
16 |
ZREVRANGEBYSCORE key max min [WITHSCORES] |
返回有序集中指定分数区间内的成员,分数从高到低排序 |
17 |
ZREVRANK key member |
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
18 |
ZSCORE key member |
返回有序集中,成员的分数值 |
19 |
ZUNIONSTORE destination numkeys key [key ...] |
计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
20 |
ZSCAN key cursor [MATCH pattern] [COUNT count] |
迭代有序集合中的元素(包括元素成员和元素分值) |
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的5种基本数据结构,以及操作它的命令。作为Redis的入门教程,本文旨在让大家对Redis有一个概念性和整体性的认识,为深入Redis打下基础。
后端开发必须要懂的Redis,Redis的数据结构相关推荐
- 作为后端开发人员应该懂的TCP、HTTP、Socket、Socket连接池,一文详解丨Linux后端开发
前言:作为一名开发人员我们经常会听到HTTP协议.TCP/IP协议.UDP协议.Socket.Socket长连接.Socket连接池等字眼,然而它们之间的关系.区别及原理并不是所有人都能理解清楚,这篇 ...
- java后台转前端_从后端开发转职前端开发,我都经历了些什么?
原标题:从后端开发转职前端开发,我都经历了些什么? 从前端转行后端 从后端开发转职到前端开发真的不容易. 特别是当你已经习惯了后端开发的工作模式,习惯了构建数据结构,编写类似于测试驱动开发的测试,习惯 ...
- php 监听redis,php监听redis key失效触发回调事件_后端开发
php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...
- php redis 关闭,php redis如何关闭_后端开发
php如何替换中文字符_后端开发 php替换中文字符的方法:首先打开"mb_string"扩展:然后用双字节可靠的"mb_ereg_replace"函数实现替换 ...
- 揭开后端开发-中间组件、内存数据库Redis的迷雾,听完瞬间豁然开朗丨C/C++Linux服务器开发丨中间件
揭开后端开发-中间组件.内存数据库Redis的迷雾,听完瞬间豁然开朗 视频讲解如下: 揭开后端开发-中间组件.内存数据库Redis的迷雾,听完瞬间豁然开朗丨C/C++Linux服务器开发丨中间件丨组件 ...
- 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步
深度解析串行并发并行,开发人员需彻底搞懂 视频讲解如下,点击观看: 深度解析串行并发并行,开发人员需彻底搞懂丨mysql|redis|skynet|协程|索引|读写分离|分布式锁|主从同步丨C/C++ ...
- redis,memcached到nginx,底层网络io中剥离精髓丨C/C++Linux丨C++后端开发丨Linux服务器开发丨底层原理
redis,memcached到nginx,底层网络io中剥离精髓 1. redis单线程网络的优缺点 2. memcached多线程网络的并发优势 3. nginx多进程网络的优势 视频讲解如下,点 ...
- C++后端开发程序员应该彻底搞懂的【libevent网络库】,libevent组件构成以及编程要领丨Linux服务器开发丨服务端编程
90分钟搞懂libevent网络库 1. 服务端事件组成 2. libevent组件构成以及编程概要 3. memcached是如何使用libevent 视频讲解如下,点击观看: C++后端开发程序员 ...
- 基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis)
基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后 ...
最新文章
- 全国大学生智能汽车竞赛获奖证书文字
- 判断是否是2的N次方
- 【网络安全】Nacos Client Yaml反序列化漏洞分析
- Redis站点流量统计HyperLogLog
- linux 打开db文件怎么打开方式,linux服务器打开数据库文件
- (88)FPGA写文件激励(fwrite)
- 计算机设备安装属于劳务吗,​安装服务费属于劳务费吗
- 错误使用 eig 输入矩阵包含 nan 或 inf_特斯拉AI主管提醒你神经网络的几大常见错误...
- 苹果Mac网络视频下载工具推荐:Downie 4
- 19条优秀的编码原则
- c语言:查ascii码值
- win10默认壁纸_渐变彩色Hero壁纸,微软免费Win10主题《Pride 2020 Flags》下载
- 嵌入式软件开发工程师未来的薪资待遇是什么情况
- 如何搭建一个网站 -- 搭建一个网站需要多少钱
- Linux下IO监控与分析 --转载
- Java 窗口透明化(无边框)
- 带有EP4CE的FPGA(ALTERA)的固化程序图文教程
- 图片去水印工具-图片去水印工具在线下载
- linux获取夏令时时间,关于时区:获取C中时区的夏令时转换日期
- 有哪些无副作用的助眠神器推荐,五款助眠神器帮你告别失眠困扰
热门文章
- 推荐Bandicam(高清录像工具)
- 数据结构:二叉树的创建,打印前中后序遍历,节点个数,叶子节点数,销毁,第K层中节点的个数,查找值为x的节点
- 股价上扬,战略*组织力正成为汽车之家的“新增长门票”
- 知一的 2021 年已读书单
- 在Linux上的安装Tomcat
- 2021-2027全球与中国灭火机器人市场现状及未来发展趋势
- idea 下划线字段转驼峰_欲善事先利器——IDEA 插件篇
- POI导出EXCEL文档、水平垂直居中、表头添加颜色
- 微信小程序+Python Flask后端实战开发案例
- 北风网java微信_北风网--Java中级班之JSP+servlet+论坛项目+论坛项目MVC实现