【Redis】简单了解Redis中常用的命令与数据结构

希望文章能给到你启发和灵感~

如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~

阅读指南

开篇说明

说到redis,一定不陌生,Redis是一个开源的、基于内存的、支持多种类型数据结构的键值存储数据库,都知道他能实现快速读写高并发访问实时性快等特点,这篇就主要说说他的特点使用场景、以及我们日常可能常用的命令;

一、基础环境说明

考虑环境因素,大家适当的对比自己的软硬件环境情况分析~请仔细阅读硬件、软件环境

1.1 硬件环境

演示环境:Windows 11 专业版

1.2 软件环境

数据存储:Redis 3.0.504

二、Redis的特点和适用场景

  • 缓存(Caching)

    Redis最常见的用途是作为缓存层,比如存储一些热点数据,来减少我们数据库的访问压力。这原因其事很简单,因为Redis是基于内存的,因此其读写速度非常快,可以显著提升应用的响应速度。同时,Redis支持多种数据过期策略,能够自动清理长时间未访问的数据,优化内存使用。

  • 会话管理(Session Management)

    在Web应用中,Redis可以用来存储用户会话信息。

  • 消息队列(Message Queue)

    Redis的列表(Lists)和发布/订阅(Pub/Sub)功能可以用来实现简单的消息队列系统。虽然Redis不是专门设计来作为消息队列的,但在一些轻量级的场景下,使用Redis作为消息队列可以简化系统架构,降低部署成本。

  • 计数器(Counters)

    Redis的原子操作特性使得它非常适合实现计数器功能。例如,可以使用INCR命令来实现页面的访问计数、用户的点赞数统计等。由于Redis的操作是原子性的,因此不需要担心并发更新导致的数据不一致问题。

  • 排行榜(Leaderboards)

    利用Redis的有序集合(Sorted Sets)可以方便地实现排行榜功能。有序集合中的每个成员都有一个分数与之关联,Redis会根据分数对成员进行排序。这使得Redis成为实现排行榜、热门榜单等功能的理想选择。

  • 社交网络功能(Social Networking Features)

    Redis可以用来实现社交网络中的一些常见功能,如用户关注关系、好友列表、点赞、评论等。通过合理设计数据结构,Redis可以高效地存储和查询这些社交数据,支持大规模用户的实时交互。

  • 分布式锁(Distributed Locks)

    在分布式系统中,Redis可以用来实现分布式锁。通过Redis的SETNX(Set if Not eXists)命令或Lua脚本,可以确保在分布式环境中只有一个客户端能够获取锁,从而避免数据竞争和一致性问题。

  • 地理空间信息(Geospatial Information)

    Redis的地理空间索引功能可以用来存储和查询地理位置信息。这使得Redis在需要处理地理位置数据的场景(如地图应用、物流追踪等)中非常有用。

  • 实时分析(Real-time Analytics)

    虽然Redis主要是一个内存数据库,但它也可以与一些外部系统(如Apache Kafka、Apache Spark等)结合使用,来实现实时数据分析。通过将数据先写入Redis,然后再由其他系统进行处理和分析,可以显著提升数据分析的实时性和准确性。

三、Redis的数据类型和使用

redis中的数据类型目前主要分为几种,分别是字符串,列表,集合(有序和无序),哈希,位图,超日志,地理空间,流;后4个类型内容相对较多,我们这里就不细说了,后续再另起篇幅来细讲;

尝试使用一下命令时,请先保证自己的redis已正确安装并且已经通过客户端登录了;

3.1字符串(String)

Redis 中最基本的类型,是二进制安全的,即意味着它们能包含任何数据,比如图片或者序列化的对象。字符串类型的值最大能存储 512MB。

bash 复制代码
// 设置键的值为字符串。如果键已存在,则覆盖原有值
SET key value
bash 复制代码
// 获取键的值。如果键不存在,则返回nil。
GET key
bash 复制代码
// 将键的整数值增加1。如果键不存在,则将其值初始化为0再执行增加操作。
INCR key
// 有递增,自然有递减
DECR key
bash 复制代码
// 获取一个或多个键的值。
MGET key1 [key2...]

3.2 列表(List):

Redis 的列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

【1】如何列表中添加元素:lpush和rpush,实现左边和右边插入的方式;

【2】如何列表中删除元素:lpop和rpop,实现左边和右边移除的方式;

【3】如何查询列表中的元素:0~-1代表取所有元素,这里有点类似python切片的取法;

【4】如何移除指定元素:lrem key count value:移除列表中等于value的元素。count>0时,从表头开始搜索;count<0时,从表尾开始搜索;count=0时,移除所有等于value的元素。

3.3 集合(Set):

Redis 的集合是一个无序的字符串集合,不允许有重复的元素。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

所谓复杂度,也就是从复杂度的角度方面来看,理论上来讲,它不随你的数据量大小的增加而增加他增删查的执行时间,也就是你数据量再大,也不影响我的执行时间;不过吧,实际情况未必是这样,毕竟复杂度并不考虑具体的执行速度或硬件限制;而且有些情况这个复杂度也不是固定的,O(1)也可能比那成O(n);

【1】查询结合内的元素:smembers key

【2】集合添加元素:sadd key value

【3】检查member是否是集合key的成员。:sismember key member

【4】移除集合中一个或多个成员。:srem key member

3.4 有序集合(Sorted Set):

Redis 的有序集合和集合一样也是字符串集合不允许重复的成员。为了实现排序,给每个成员都关联一个 double 类型的分数。这使得有序集合既可以做为一个 set 来使用,又可以保存一个 value 对应的 score,从而实现排序等功能。

【1】向有序集合添加一个或多个成员,或者更新已存在成员的分数。

【2】返回有序集合中指定范围的成员,可包含分数。

【3】移除有序集合中的一个或多个成员。

【4】返回有序集合中成员的排名(按分数从低到高)。


zrank这里注意一下返回的情况,默认情况下返回0代表分数是最高的,如果第二返回的是1,依次类推就行,相反的zrevrank 则是和上面的相反;

3.5 哈希(Hash):

Redis 的哈希是键值对的集合。Redis 中的哈希类型可以存储不定数量的键值对,是一个字符串类型的 field 和 value 的映射表。

【1】hset key field value :为哈希表中的字段赋值。

【2】hget key field:获取哈希表中字段的值。

【3】hmset key field1 value1 [field2 value2...]:同时设置哈希表中的多个字段。

【4】hgetall key:获取哈希表中所有的字段和值。


【注】以下内容这里我们只做了解,具体使用根据实际场景再来说明;

3.6 位图(Bitmaps)

位图严格来说,不算是 Redis 的一种数据类型,但它是一个字符串的二进制表示形式,因此可以使用字符串类型来实现。位图支持位级别的操作,可以非常高效地处理大量的数据,例如用于用户签到、统计在线人数等场景。

【1】setbit key offset value

设置位(SETBIT)SETBIT命令用于将位图指定偏移量上的位设置为0或1。

key:位图的键名。

offset:位的偏移量(从0开始)。

value:要设置的值(0或1)。

【2】getbit key offset

获取位,GETBIT命令用于获取位图指定偏移量上的位的值。

【3】bitcount key [start end]

统计位,用于统计位图中值为1的位的数量

【4】bitop operation destkey key [key ...]

位运算,用于对一个或多个位图执行位运算,并将结果保存到新的位图中

【5】bitops key bit [start] [end]

用于查找位图中第一个被设置为指定值的二进制位,并返回它的偏移量。

3.7 超日志(HyperLogLog):

Redis 的 HyperLogLog 是一种概率性的数据结构,用于估计一个集合中不重复元素的数量。与集合相比,HyperLogLog 在保持一定的准确度的基础上,内存消耗极低。

3.8 地理空间(Geo):

Redis 3.2 版本中引入了地理空间数据类型,允许存储地理位置信息,并可以基于这些信息执行地理空间相关的查询,比如计算两个位置之间的距离,或者查找给定半径内的所有位置等。

3.9 流(Streams):

Redis 5.0 引入了 Streams 数据类型,它是一个新的强大的支持多播的原生数据类型,可以看作是一个仅追加的日志数据结构,用于消息队列等场景。

四、最后

【1】在Redis中,位图(Bitmap)、HyperLogLog、Geo和流(Stream)都被视为Redis支持的数据结构或数据类型,但它们各自具有不同的特性和应用场景。

【2】本篇我们只需要知道redis前5五种常见的数据类型的用法即可

【3】不同版本的redis,这些数据类型并不都是有的,例如Geo是Redis 3.2版本中新增的一种数据类型,流是Redis 5.0版本中新增加的数据结构,这个需要注意一下

相关推荐
中草药z几秒前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云2 分钟前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
不惑_9 分钟前
List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
数据结构·安全·list
带多刺的玫瑰38 分钟前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法
Ahern_41 分钟前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒1 小时前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao1 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
qystca1 小时前
洛谷 P11242 碧树 C语言
数据结构·算法
破 风1 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
冠位观测者1 小时前
【Leetcode 热题 100】124. 二叉树中的最大路径和
数据结构·算法·leetcode