Redis最新入门教程

news2025/5/10 9:33:24

文章目录

  • Redis最新入门教程
    • 1.安装Redis
    • 2.连接Redis
    • 3.Redis环境变量配置
    • 4.入门Redis
      • 4.1 Redis的数据结构
      • 4.2 Redis的Key
      • 4.3 Redis-String
      • 4.4 Redis-Hash
      • 4.5 Redis-List
      • 4.6 Redis-Set
      • 4.7 Redis-Zset
    • 5.在Java中使用Redis
    • 6.缓存雪崩、击穿、穿透
      • 6.1 缓存雪崩
      • 6.2 缓冲击穿
      • 6.3 缓冲穿透
      • 6.4 业务可靠性处理
    • 参考

Redis最新入门教程

Redis 是互联网技术领域中使用最广泛的存储中间件,它是 Remote Dictionary Service 三个单词中加粗字母的组合。它是一个存储在磁盘上的内存数据库。数据模型是键-值对,但支持许多不同类型的值:Strings, Lists, Sets, Sorted Sets, Hashes

1.安装Redis

Redis 官方不建议在 windows 下使用 Redis,所以官网没有 Windows 版本可以下载。但是官方给出了一个在 Windows 下使用Redis的方法:Install Redis on Windows,具体操作就是安装 WSL,然后在电脑上运行 Ubuntu,大家也可以尝试。

对于我们本地开发与学习,下载非官方的 Windows 版本就可以。这里推荐两个 Windows 版本的 Redis 仓库:

  • 微软的开源 Windows版本 --> 这个项目已经不再被维护了,最高版本为 3.2.100。
  • redis-windows 项目 --> 借助 GitHub Actions 强大的自动化构建能力,实时编译最新版本的 Redis for Windows 系统。版本和官方保持一致,推荐👍

note:建议使用 Windows 版本进行本地开发,并按照 Redis 官方指导将其部署在 Linux 上用于生产环境。


安装流程

  • 下载 Redis Latest for Windows。

    image-20250508112614297

  • 解压,直接运行项目中的 start.bat 脚本,一键启动。或者使用命令行启动 redis-server.exe redis.conf

    image-20250508112738342

    note:使用 Redis 时,这个窗口不可以关闭。若想要停止 Redis 服务,直接关闭窗口。

2.连接Redis

Redis 本身就自带了一个命令行客户端,可以直接通过 redis-cli 命令来连接 Redis 服务。如下所示,表明连接成功:

image-20250508115228575

这里推荐两款好用的 Redis 图形化客户端,大家可以根据自己喜好下载:

  • AnotherRedisDesktopManager,github 已经有 32k+ 的 star 了。
  • Redis Insight,官方 Redis 数据库工具。

由于我个人喜欢使用官方版本,所以接下来介绍一下 Redis Insight 的安装:进入官网 Redis Insight 下载安装包,然后一直下一步即可安装成功。第一次打开勾选上 I have read and understood the Terms 点击 Submit 就好,其他选项(主要是隐私设置以及通知设置)不用勾选。这样就可以开始使用 Redis Insight了。

3.Redis环境变量配置

每次连接 Redis 都必须到解压后的目录,才可以输入启动命令。所以通过配置环境变量,解决这一问题。

  • 复制 Redis 的地址。Example: D:\Redis\Redis-8.0.0-Windows-x64-cygwin

    image-20250508140043082

  • 「环境变量」->「系统变量」->「path」->「编辑」->「新建」,粘贴 Redis 路径。

    image-20250508140553453

这样在任何位置,打开 cmd 就可以输入 Redis 的命令了。

  • 启动 Redis:

    redis-server
    
  • 连接 Redis:

    redis-cli
    

4.入门Redis

4.1 Redis的数据结构

Redis 有 5 种基础数据结构,String、Hash、List、Set、SortedSet。除此之外,还有 HyperLogLog、Geo、Pub/Sub 等高级数据结构。

  • string(字符串): 基本的数据存储单元,可以存储字符串、整数或者浮点数。
  • hash(哈希):一个键值对集合,可以存储多个字段。
  • list(列表):一个简单的列表,可以存储一系列的字符串元素。
  • set(集合):一个无序集合,可以存储不重复的字符串元素。
  • zset(sorted set:有序集合): 类似于集合,但是每个元素都有一个分数(score)与之关联。
  • 位图(Bitmaps):位数组,可以对字符串进行位操作。常用于实现布隆过滤器等位操作。
  • 超日志(HyperLogLogs):用于基数统计,可以估算集合中的唯一元素数量。
  • 地理空间(Geospatial):用于存储地理位置信息,支持地理空间索引和半径查询。
  • 发布/订阅(Pub/Sub):一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息。
  • 流(Streams):用于消息队列和日志存储,支持消息的持久化和时间排序。
  • 模块(Modules):Redis 支持动态加载模块,可以扩展 Redis 的功能。

4.2 Redis的Key

Redis 键命令用于管理 redis 的键。Redis 键命令的基本语法如下:

COMMAND KEY_NAME
127.0.0.1:6379> set name redis
OK
127.0.0.1:6379> del name
(integer) 1
  • del 命令用来删除一个键值对,(integer) 1 表示执行成功,(integer) 0 表示执行失败。
  • exists 命令用来测试一个键值对是否存在,(integer) 1 表示存在,(integer) 0 表示不存在。

4.3 Redis-String

String 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

常用命令:

  • SET key value:设置键的值。
  • GET key:获取键的值。
  • INCR key:将键的值加 1。
  • DECR key:将键的值减 1。
  • APPEND key value:将值追加到键的值之后。
127.0.0.1:6379> set name1 xiaoming
OK
127.0.0.1:6379> get name1
"xiaoming"

4.4 Redis-Hash

Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。每个 hash 最多可以存储 2 32 − 1 2^{32}-1 2321 个键值对。

常用命令:

  • HSET key field value:设置哈希表中字段的值。
  • HGET key field:获取哈希表中字段的值。
  • HGETALL key:获取哈希表中所有字段和值。
  • HDEL key field:删除哈希表中的一个或多个字段。
127.0.0.1:6379> hset student id 1 name "zhangsan" gender "男"
(integer) 3
127.0.0.1:6379> hgetall student
1) "id"
2) "1"
3) "name"
4) "zhangsan"
5) "gender"
6) "\xe7\x94\xb7"
127.0.0.1:6379> hget student name
"zhangsan"
127.0.0.1:6379> hget student id
"1"

4.5 Redis-List

List 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可以存储 2 32 − 1 2^{32}-1 2321 个元素。

常用命令:

  • LPUSH key value:将值插入到列表头部。
  • RPUSH key value:将值插入到列表尾部。
  • LPOP key:移出并获取列表的第一个元素。
  • RPOP key:移出并获取列表的最后一个元素。
  • LRANGE key start stop:获取列表在指定范围内的元素。
127.0.0.1:6379> lpush order first second
(integer) 2
127.0.0.1:6379> lrange order 0 1
1) "second"
2) "first"
127.0.0.1:6379> lpush order third
(integer) 3
127.0.0.1:6379> lrange order 0 3
1) "third"
2) "second"
3) "first"
127.0.0.1:6379> lrange order 0 2
1) "third"
2) "second"
3) "first"
127.0.0.1:6379> lrange order 0 1
1) "third"
2) "second"

4.6 Redis-Set

Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2 32 − 1 2^{32}-1 2321

常用命令:

  • SADD key value:向集合添加一个或多个成员。
  • SREM key value:移除集合中的一个或多个成员。
  • SMEMBERS key:返回集合中的所有成员。
  • SISMEMBER key value:判断值是否是集合的成员。
127.0.0.1:6379> sadd color red yellow blue
(integer) 3
127.0.0.1:6379> smembers color
1) "red"
2) "yellow"
3) "blue"
127.0.0.1:6379> srem color red
(integer) 1
127.0.0.1:6379> smembers color
1) "yellow"
2) "blue

4.7 Redis-Zset

zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序zset 的成员是唯一的,但分数(score)却可以重复

常用命令:

  • ZADD key score value:向有序集合添加一个或多个成员,或更新已存在成员的分数。
  • ZRANGE key start stop [WITHSCORES]:返回指定范围内的成员。
  • ZREM key value:移除有序集合中的一个或多个成员。
  • ZSCORE key value:返回有序集合中,成员的分数值。
127.0.0.1:6379> zadd class 100 "one" 90 "two" 100 three
(integer) 3
127.0.0.1:6379> zrange class 0 2
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> zscore class two
"90"

5.在Java中使用Redis

  • 第一步,在项目中添加 Jedis(Java 和 Redis 的混拼)依赖:

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>8.0.0</version>
    </dependency>
    
  • 第二步,新建 UserInfo(用户信息)类:

    package org.example;
    
    public class UserInfo {
        private String name;
        private int age;
    
        public UserInfo() {
        }
    
        public UserInfo(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "UserInfo{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  • 第三步,在项目中添加 Gson(用于序列化和反序列化用户信息)依赖:

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.6</version>
        <scope>compile</scope>
    </dependency>
    
  • 第四步,新建测试类 RedisTest:

    public class RedisTest {
        // 定义 Redis 中存储用户信息的键
        private static final String REDIS_KEY = "user";
    
        public static void main(String[] args) {
            // 创建 Jedis 实例,连接到本地 Redis 服务器,端口为 6379
            Jedis jedis = new Jedis("localhost", 6379);
    
            // 创建 Gson 实例,用于 Java 对象和 JSON 字符串之间的转换
            Gson gson = new Gson();
            // 创建 UserInfo 对象,存储用户信息
            UserInfo userInfo = new UserInfo("鱼儿也有烦恼", 18);
    
            // 将 UserInfo 对象转换为 JSON 字符串,并存储到 Redis 中
            jedis.set(REDIS_KEY, gson.toJson(userInfo));
            // 从 Redis 中获取 JSON 字符串,并转换为 UserInfo 对象
            UserInfo getUserInfoFromRedis = gson.fromJson(jedis.get(REDIS_KEY), UserInfo.class);
    
            // 打印从 Redis 中获取的用户信息
            System.out.println("get:" + getUserInfoFromRedis);
            // 打印指定键是否存在于 Redis 中
            System.out.println("exists:" + jedis.exists(REDIS_KEY));
            // 删除 Redis 中指定键对应的值,并打印删除的键的数量
            System.out.println("del:" + jedis.del(REDIS_KEY));
            // 尝试获取已删除键的值,并打印结果
            System.out.println("get:" + jedis.get(REDIS_KEY));
        }
    }
    
  • 输出结果:

    get:UserInfo{name='鱼儿也有烦恼', age=18}
    exists:true
    del:1
    get:null
    

6.缓存雪崩、击穿、穿透

6.1 缓存雪崩

概念:即缓存同一时间大面积的失效,这个时候来了一大波请求,都怼到数据库上,最后数据库处理不过来崩了。

业务场景举例:APP首页放着很多热门数据,大型活动期间,首页数据得按不同时间更新。就像零点要换一批新数据,旧数据刚过期,新数据还没完全加载好。偏偏零点又有个小活动启动,一下子来了好多人打开APP,服务器收到海量请求。可新数据没加载完,缓存里大多找不到对应内容,这些请求全跑到数据库那儿去了。数据库应付不过来这么多请求,最后直接瘫痪了。

解决方案

  • 给过期时间加个随机时间。需要注意的是,这里设置的随机过期时间并非短短几秒,而是可以长达数分钟。这是因为当数据量庞大时,再结合上述场景,考虑到Redis采用单线程处理数据的特性,仅仅几秒的缓冲时间,根本无法确保所有新数据都能加载完毕。 因此,在设置过期时间时,宁长勿短。毕竟无论时间长短,数据最终都会过期,从最终效果来看并无差别。而且,适当扩大过期时间范围,能让Redis的key分布得更加分散。这样一来,Redis在批量处理过期key时,阻塞时间也会相应缩短,有效提升系统运行效率。
  • 加互斥锁,但这个方案会导致吞吐量明显下降。(上述例子不合适用)
  • 热点数据不设置过期。不过期的话,正常业务请求自然就不会打到数据库了。

6.2 缓冲击穿

概念:缓存击穿是指一个热点 key 过期或被删除后,导致线上原本能命中该热点 key 的请求,瞬间大量地打到数据库上,最终导致数据库被击垮。

业务场景举例:出现情况一般是误操作,比如设置错了过期时间、误删除导致的。

解决方案

  • 仔细检查每一处代码细节,确保没有潜在问题。对于热点数据,要明确制定清晰的过期策略:究竟需不需要设置过期时间?如果需要,具体在何时让数据过期?这些都要有明确的规划。
  • 线上误操作问题,需加强权限管理,特别是线上权限必须审核,防止误操作。

6.3 缓冲穿透

概念:客户端请求缓存和数据库中不存在的数据,导致所有的请求都打到数据库上。如果请求很多,数据库依旧会挂掉。

业务场景举例

  • 数据库主键 id 都是正数,然后客户端发起了 id = -1 的查询。
  • 一个查询接口,有一个状态字段 status,其实 0 表示开始、1 表示结束。结果有请求一直发 status=3 的请求过来。

解决方案

  • 做好参数校验,对于不合理的参数要及时 return 结束。
  • 对于查不到数据的 key,也将其短暂缓存起来。比如 30s。这样能避免大量相同请求瞬间打到数据库上,减轻压力。
  • 提供一个能迅速判断请求是否有效的拦截机制,比如布隆过滤器,Redis 本身就具有这个功能。可以利用 Redis 维护所有合法的键(key),当有请求到来时,先通过布隆过滤器检查请求参数中的键是否合法。若不合法,就直接返回响应结果;若合法,再从缓存或者数据库里获取所需数据。

6.4 业务可靠性处理

  • 提高 Redis 可用性。

    Redis 要么用集群架构,要么用主从 + 哨兵。保证 Redis 的可用性。

    光搞主从架构,没加哨兵的话,出问题根本不会自动切换。要是赶上业务高峰期或者搞活动的时候服务器挂了,等系统报警、排查问题、跟团队沟通完,再等运维来修,黄花菜都凉了!

  • 减少对缓存的依赖。

    对于热点数据,可以考虑加上本地缓存,比如:Guava、Ehcache,更简单点,hashMap、List 等也可以。减少 Redis 压力的同时,还能提高性能,一举两得。

  • 业务降级。

    从保护下游接口或者数据库的方面来想,在碰到大流量的情况时,搞个限流措施挺有必要的。就算缓存突然崩了,也不至于让下游直接全垮掉。还有,那些能降级的功能就降级。提前把降级开关和降级逻辑写好,到了关键时候,全指望着它们来稳住局面呢。

🤗🤗🤗

参考

  • Redis官方Commands查阅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北斗三号手持终端设备功能与应用

北斗三号卫星系统是我国自主建设、独立运行的全球卫星导航系统。通过多颗不同轨道卫星组成的&#xff0c;这些卫星持续向地球发射携带精确时间和位置信息的信号。地面上的北斗手持终端接收到至少四颗卫星信号后&#xff0c;利用信号传播时间差&#xff0c;通过三角函数等算法&a…

opencv中的图像特征提取

图像的特征&#xff0c;一般是指图像所表达出的该图像的特有属性&#xff0c;其实就是事物的图像特征&#xff0c;由于图像获得的多样性&#xff08;拍摄器材、角度等&#xff09;&#xff0c;事物的图像特征有时并不特别突出或与无关物体混杂在一起&#xff0c;因此图像的特征…

【JVM-GC调优】

一、预备知识 掌握GC相关的VM参数&#xff0c;会基本的空间调整掌握相关工具明白一点&#xff1a;调优跟应用、环境有关&#xff0c;没有放之四海而皆准的法则 二、调优领域 内存锁竞争cpu占用io 三、确定目标 【低延迟】&#xff1a;CMS、G1&#xff08;低延迟、高吞吐&a…

shopping mall(document)

shopping mall&#xff08;document&#xff09; 商城的原型&#xff0c;学习&#xff0c;优化&#xff0c;如何比别人做的更好&#xff0c;更加符合大众的习惯 抄别人会陷入一个怪圈&#xff0c;就是已经习惯了&#xff0c;也懒了&#xff0c;也不带思考了。 许多产品会迫于…

qiankun微前端任意位置子应用

qiankun微前端任意位置子应用 主项目1、安装qiankun2、引入注册3、路由创建4、路由守卫 二、子项目1、安装sh-winter/vite-plugin-qiankun2、main.js配置3、vite.config.js配置 三、问题解决 主项目 1、安装qiankun npm i qiankun -S2、引入注册 创建存放子应用页面 //whpv…

第十五章,SSL VPN

前言 IPSec 和 SSL 对比 IPSec远程接入场景---client提前安装软件&#xff0c;存在一定的兼容性问题 IPSec协议只能够对感兴趣的流量进行加密保护&#xff0c;意味着接入用户需要不停的调整策略&#xff0c;来适应IPSec隧道 IPSec协议对用户访问权限颗粒度划分的不够详细&…

spring5.x讲解介绍

Spring 5.x 是 Spring Framework 的重要版本升级&#xff0c;全面拥抱现代 Java 技术栈&#xff0c;其核心改进涵盖响应式编程、Java 8支持、性能优化及开发模式创新。以下从特性、架构和应用场景三个维度详细解析&#xff1a; 一、核心特性与架构改进 Java 8 全面支持 Spring …

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…

levelDB的数据查看(非常详细)

起因:.net大作业天气预报程序(WPF)答辩时&#xff0c;老师问怎么维持数据持久性的&#xff0c;启动时加载的数据存在哪里&#xff0c;我明白老师想考的应该是json文件的解析&#xff08;正反&#xff09;&#xff0c;半天没答上来存那个文件了&#xff08;老师默认这个文件是自…

在Fiddler中添加自定义HTTP方法列并高亮显示

在Fiddler中添加自定义HTTP方法列并高亮显示 Fiddler 是一款强大的 Web 调试代理工具&#xff0c;允许开发者检查和操作 HTTP 流量。一个常见需求是自定义 Web Sessions 列表&#xff0c;添加显示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通过颜色区…

基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践

随着医疗健康数据的爆发式增长,如何有效整合、分析和利用这些数据已成为公共卫生领域的重要挑战。传统方法往往难以应对数据的复杂性、多样性和海量性,而人工智能技术的迅猛发展为解决这些挑战提供了新的可能性。基于数据整合与公共卫生大数据的AI平台旨在构建一个全面的生态…

clahe算法基本实现

一、背景介绍 图像算法处理中&#xff0c;经常需要遇到图像对比度调整的情况&#xff0c;CLAHE(Contrast Limited Adaptive Histogram Equalization)则是一种基于直方图&#xff0c;使用非常普遍的图像对比度调整算法。 关于这个算法的介绍有很多&#xff0c;基本原理这些&…

python打卡day20

特征降维------特征组合&#xff08;以SVD为例&#xff09; 知识点回顾&#xff1a; 奇异值的应用&#xff1a; 特征降维&#xff1a;对高维数据减小计算量、可视化数据重构&#xff1a;比如重构信号、重构图像&#xff08;可以实现有损压缩&#xff0c;k 越小压缩率越高&#…

数字化转型-4A架构之数据架构

系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数据架构 Data Architecture&#xff08;DA&#xff09; 1. 定义 数据架构&#xff0c;是组织管理数据资产的科学之…

React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项

React Router 中的 useOutlet 是 v6 版本新增的 Hook&#xff0c;用于在父路由组件中访问当前嵌套的子路由元素。它提供了比 <Outlet> 组件更灵活的控制方式&#xff0c;适合需要根据子路由状态进行动态处理的场景。 一、useOutlet的基本用法 import { useOutlet } fro…

AGV通信第3期|AGV集群智能应急响应系统:从故障感知到快速恢复

随着智慧工厂物流系统复杂度的提升&#xff0c;AGV运行过程中的异常处理能力已成为保障生产连续性的关键指标。面对突发障碍、设备故障等意外状况&#xff0c;传统依赖人工干预的响应模式已无法满足现代智能制造对时效性的严苛要求。 一、AGV异常应急体系面临的挑战 响应时效瓶…

军事目标无人机视角坦克检测数据集VOC+YOLO格式4003张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4003 标注数量(xml文件个数)&#xff1a;4003 标注数量(txt文件个数)&#xff1a;4003 …

软件安全(二)优化shellcode

我们在上一节课中所写的shellcode&#xff0c;其中使用到的相关的API是通过写入其内存地址来实现调用。这种方法具有局限性&#xff0c;如切换其他的操作系统API的内存地址就会发生变化&#xff0c;从而无法正常调用。 所谓的shellcode不过是在目标程序中加一个区段使得程序可…

RabbitMQ-运维

文章目录 前言运维-集群介绍多机多节点单机多节点 多机多节点下载配置hosts⽂件配置Erlang Cookie启动节点构建集群查看集群状态 单机多节点安装启动两个节点再启动两个节点验证RabbitMQ启动成功搭建集群把rabbit2, rabbit3添加到集群 宕机演示仲裁队列介绍raft算法协议 raft基…

深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒​&#x1f338;​ 博客主页&#xff1a;羊小猪~~-CSDN博客 内容简介&#xff1a;常见目标检测算法简介​&#x1f…