Redis学习(第八章缓存策略)
目录
RdisExample
课程介绍
1.Redis介绍
2.Redis 安装
3. Redis的数据结构
4. Redis缓存特性
5. Redis使用场景
6. Redis客户端-Jedis
7. Jedis Pipeline
8. Redis缓存策略
学习资料
QA 相关问题
http, socket ,tcp的区别
RdisExample
项目代码地址:https://gitee.com/bseaworkspace/redis-example
课程介绍
目标是提供一个高效、可靠的学习和实践Redis的环境。我们将通过搭建Redis集群、实现缓存数据的持久化存储、制定缓存数据的淘汰策略以及同步缓存数据等步骤来深入了解和学习Redis的特性和功能。通过这个项目,你可以掌握Redis的核心概念和技术,并能够熟练地将其应用到实际的开发工作中。无论你是初学者还是有一定经验的开发者,都可以从这个项目中获得收获和成长。欢迎加入我们的行列,一起学习Redis!
1.Redis介绍
Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA 脚本(Lua scripting), LRU 驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis 哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
2.Redis 安装
- Windows 下安装
下载地址:https://github.com/tporadowski/redis/releases。
双击 redis-server.exe
- Linux 源码安装
下载地址:http://redis.io/download,下载最新稳定版本。
本教程使用的最新文档版本为 2.8.17,下载并安装:
# wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar -xzvf redis-6.0.8.tar.gz # cd redis-6.0.8 # make
执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:
下面启动 redis 服务:
# cd src # ./redis-server
注意这种方式启动 redis 使用的是默认配置。也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。
# cd src # ./redis-server ../redis.conf
redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:
# cd src # ./redis-cli redis> set foo bar OK redis> get foo "bar"
Ubuntu apt 命令安装 在 Ubuntu 系统安装 Redis 可以使用以下命令:
# sudo apt update # sudo apt install redis-server 启动 Redis # redis-server 查看 redis 是否启动? # redis-cli 以上命令将打开以下终端:redis 127.0.0.1:6379> 127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。redis 127.0.0.1:6379> ping PONG
3. Redis的数据结构
Redis支持以下五种数据结构:
- String(字符串):最简单的类型,可以理解为与Memcached一模一样的类型,一个key对应一个value。
- List(列表):由若干个字符串元素组成的集合,每个字符串元素都是按照插入顺序排序的。
- Set(集合):由不重复且无序的字符串元素组成的。
- Hash(散列):可以存储多个键值对之间的映射,键的类型必须为字符串,而值的类型既可以是字符串也可以是数字,但是值必须是唯一的,不可重复。
- Sorted Sets(有序集合):和散列类似,主要区别是有序集合是按照值进行自动排序的。
4. Redis缓存特性
- 速度快,读写性能 10W/s,当然了和机器配置也有关系为什么快呢?内存操作,C语言实现,离操作系统API更近;单线程架构(务必不要记错),避免了多线程竞争带来的损耗。IO多路复用,协议简单。
- 支持持久化,虽然是交互时是内存操作,但提供数据落盘机制,防止断电产生的数据丢失问题。
- 支持主从复制:多副本 Master-Slave 节点
- 支持高可用 HA:哨兵(sentinel)机制实现高可用,保证节点故障自动发现和故障转移
- 支持多客户端语言:Java、Python、C++等。
5. Redis使用场景
- 缓存:数据库之前加缓存,降低数据库读写压力
- 排行榜:按照热度排名、按照发布时间排名
- 计数器:播放数、浏览数
- 社交网络:赞、踩、粉丝、下拉刷新
- 消息队列:发布订阅
6. Redis客户端-Jedis
Jedis String(字符串) 实例
import redis.clients.jedis.Jedis;public class RedisStringJava {public static void main(String[] args) {//连接本地的 Redis 服务Jedis jedis = new Jedis("localhost");System.out.println("连接成功");//设置 redis 字符串数据jedis.set("name", "test");// 获取存储的数据并输出System.out.println("redis 存储的字符串为: "+ jedis.get("name"));} }
7. Jedis Pipeline
Jedis的pipeline实现基于Redis的协议规范,可以将多个命令发送到Redis服务器,并且无需等待每个命令的回复,而是在所有命令都发送完毕后,一次性获取所有的回复。
具体实现上,Jedis将多个命令放入一个列表中,然后通过pipeline.sync()或pipeline.close()将所有命令一次性发送到Redis服务器。在服务器端,所有的命令会被依次执行,并记录每个命令的执行结果。当所有的命令都执行完毕后,Jedis会一次性获取所有的执行结果,并返回给客户端。
因此,Jedis pipeline的实现原理可以总结为:将多个命令打包成一个请求,发送到服务器,然后在服务器端依次执行这些命令,并记录每个命令的执行结果。最后,将所有的执行结果打包成一个响应,返回给客户端。
使用Jedis pipeline可以提高效率,因为它可以减少客户端和服务器之间的网络通信开销,特别是在需要执行大量的读写操作时。同时,pipeline模式还可以保证事务的原子性,适用于需要执行一系列读写操作的业务场景。
Jedis的pipeline主要有以下特点:
- 线程安全:Jedis的pipeline是基于连接池的,因此它是线程安全的,可以在多个线程之间共享和并发使用同一个pipeline。
- 批量处理:pipeline模式可以将多个命令一次性发送到服务器,减少了网络通信的开销。特别是当需要执行大量的读写操作时,pipeline模式可以显著提高性能。
- 事务处理:pipeline模式支持事务,可以在多个命令组成的管道中实现原子性操作。如果中间任何一个命令失败,整个管道都会回滚,不会执行失败命令之后的命令。
- 连接管理:使用pipeline模式时,多个命令被缓存到本地,然后一次性发送到服务器,而不是每执行一个命令就向服务器发送请求,这可以减少客户端与服务器之间的交互次数。
Jedis的pipeline支持所有基本的Redis命令,包括但不限于以下类型: 好的,以下是Markdown格式的表格内容:
- 字符串命令:例如SET, GET, MSET, MGET等。
- 哈希表命令:例如HSET, HGET, HMSET, HMGET等。
- 列表命令:例如LPUSH, RPUSH, LPOP, RPOP等。
- 集合命令:例如SADD, SMEMBERS等。
- 有序集合命令:例如ZADD, ZRANGE等。
- 数据库命令:例如SELECT, MOVE, DEL等。
- 事务命令:例如MULTI, EXEC, DISCARD等。
- Lua脚本命令:例如EVAL, EVALSHA等。 请注意,不是所有的命令都支持pipeline方式执行,比如一些需要多个步骤才能完成的操作,像SUBSCRIBE、PSUBSCRIBE、PUBLISH等命令就不支持pipeline方式执行。对于这些不支持pipeline的命令,你只能一个个单独发送并等待响应。更多细节可以参考Jedis的官方文档或源码。
8. Redis缓存策略
Cache Aside、Read Through、Write Through 和 Write Back 的步骤过程如下:
- Cache Aside:
- 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
- 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
- 更新数据时,先删除缓存中的数据,再更新数据库中的数据。
- Read Through:
- 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
- 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
- 更新数据时,先查询数据库,将要更新的数据放入缓存中,并更新数据库中的数据。
- Write Through:
- 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
- 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
- 更新数据时,先查询数据库,将要更新的数据放入缓存中,并更新数据库中的数据。
- Write Back:
- 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
- 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
- 更新数据时,只更新缓存,将缓存中的数据标记为脏数据(需要同步到数据库的数据),并不立即同步到数据库中。
Cache Aside、Read Through、Write Through 和 Write Back 都是缓存策略,它们有各自的优缺点和使用场景。
- Cache Aside 策略:
- 优点:
实现简单,易于理解和实现。
不需要使用缓存服务代理,对业务代码无侵入。
- 缺点:
需要自己维护数据更新后的逻辑,对业务代码有侵入。
在更新数据时,需要先查询缓存,再查询数据库,增加了查询的开销。
- 使用场景:适用于轻量级应用,对数据一致性要求不高的场景。
- Read Through 策略:
- 优点:
实现了缓存和数据库的同步,避免了脏读和重复查询的问题。
减少了数据库的负载压力,提高了查询效率。
- 缺点:
需要使用缓存服务代理,对业务代码有侵入。
在高并发的情况下,可能会出现竞争问题,需要使用锁或者其他同步机制来保证数据的一致性。
- 使用场景:适合需要频繁使用缓存的应用,例如电商网站、新闻网站等。
- Write Through 策略:
- 优点:
在更新数据时,缓存服务代理会先更新缓存,再更新数据库,减少了更新时的开销。
保证了数据的一致性和完整性,减少了数据不一致的问题。
- 缺点:
需要使用缓存服务代理,对业务代码有侵入。
在高并发的情况下,可能会出现竞争问题,需要使用锁或者其他同步机制来保证数据的一致性。
- 使用场景:适合对数据一致性要求较高的场景,例如银行系统、交易系统等。
- Write Back 策略:
- 优点:
在更新数据时,只更新缓存,然后异步更新数据库,提高了性能。
在写入数据时,不会立即同步到数据库中,减少了同步的开销。
- 缺点:
如果缓存宕机或者应用程序崩溃,可能会导致数据丢失。
在高并发的情况下,可能会出现竞争问题,需要使用锁或者其他同步机制来保证数据的一致性。
- 使用场景:适合对数据一致性要求不高的场景,例如电商网站、新闻网站等。在使用时需要注意缓存的容量限制和更新频率问题。
学习资料
- Redis官网:http://redis.io/
- Redis官方文档:http://redis.io/documentation
- Redis教程:https://www.runoob.com/redis/redis-tutorial.html
- Redis下载:http://redis.io/download
- redis英文文档 https://redis.io/topics/data-types
- redis中文文档 http://www.redis.cn/documentation.
- 博客 https://blog.csdn.net/h356363/category_8930846.html
QA 相关问题
http, socket ,tcp的区别
HTTP、Socket和TCP是网络通信中常用的协议和技术,它们各自扮演着不同的角色。
- HTTP协议:HTTP是Hypertext Transfer Protocol(超文本传输协议)的简称,它是互联网上应用最为广泛的一种网络协议。HTTP协议用于浏览器和服务器之间的通信,它规定了浏览器如何向服务器发送请求以及服务器如何将响应返回给浏览器。HTTP协议是基于应用层的协议,它提供了一种具体的方式来传输和接收数据。
- Socket:Socket是对TCP/IP协议的封装和应用,它是支持TCP/IP协议的网络通信的基本操作单元。在网络通信过程中,Socket用于端点的抽象表示,它包含了进行网络通信所必需的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址和远地进程的协议端口。程序员使用Socket进行网络通信时,需要对TCP/IP协议进行操作,Socket则提供了一个TCP的接口。可以说,Socket是对TCP/IP协议的应用层封装。
- TCP协议:TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过在发送方和接收方之间建立虚连接,提供了一种可靠的数据传输服务,能够确保数据在传输过程中的正确性和可靠性。TCP协议对应于传输层,它在网络通信过程中负责数据的传输和控制,它可以确保数据在传输过程中不丢失、不重复、不错乱。
总结来说,HTTP协议、Socket和TCP协议各自有不同的特点和作用。HTTP协议用于规定浏览器和服务器之间的通信规则;Socket是对TCP/IP协议的应用层封装,用于网络通信的基本操作;TCP协议则负责数据的传输和控制,确保数据在传输过程中的可靠性和正确性。
相关文章:

Redis学习(第八章缓存策略)
目录 RdisExample 课程介绍 1.Redis介绍 2.Redis 安装 3. Redis的数据结构 4. Redis缓存特性 5. Redis使用场景 6. Redis客户端-Jedis 7. Jedis Pipeline 8. Redis缓存策略 学习资料 QA 相关问题 http, socket ,tcp的区别 RdisExample 项目代码地址:htt…...

springboot+vue开发的视频弹幕网站动漫网站
springbootvue开发的视频弹幕网站动漫网站 演示视频 https://www.bilibili.com/video/BV1MC4y137Qk/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 功能: 前台: 首页(猜你喜欢视频推荐)、轮播图、分类…...

【CSS】常见 CSS 布局
1. 响应式布局 <!DOCTYPE html> <html><head><title>简单的响应式布局</title><style>/* 全局样式 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}/* 头部样式 */header {background-color: #333;color: #fff;padding: …...

数据结构---HashMap和HashSet
HashMap和HashSet都是存储在哈希桶之中,我们可以先了解一些哈希桶是什么。 像这样,一个数组数组的每个节点带着一个链表,数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值,一个val值…...

SLAM中相机姿态估计算法推导基础数学总结
相机模型 基本模型 内参 外参 对极几何 对极约束 外积符号 基础矩阵F和本质矩阵E 相机姿态估计问题分为如下两步: 本质矩阵 E t ∧ R Et^{\wedge}R Et∧R因为 t ∧ t^{\wedge} t∧其实就是个3x3的反对称矩阵,所以 E E E也是一个3x3的矩阵 用八点法估计E…...
【RS】遥感影像/图片64位、16位(64bit、16bit)的意义和区别
在数字图像处理中,我们常常会听到不同的位数术语,比如64位、16位和8位(64bit、16bit、8bit)。这些位数指的是图像的深度,也就是图像中每个像素可以显示的颜色数。位数越高,图像可以显示的颜色数就越多&…...
【单元测试】--基础知识
一、什么是单元测试 单元测试是软件开发中的一种测试方法,用于验证代码中的单个组件(通常是函数、方法或类)是否按预期工作。它旨在隔离和测试代码的最小单元,以确保其功能正确,提高代码质量和可维护性。单元测试通常…...

golang 反射机制
在 go 语言中,实现反射能力的是 reflect包,能够让程序操作不同类型的对象。其中,在反射包中有两个非常重要的 类型和 函数,两个函数分别是: reflect.TypeOfreflect.ValueOf 两个类型是 reflect.Type 和 reflect.Value…...

【Javascript】创建对象的几种方式
通过字面量创建对象 通过构造函数创建对象 Object()-------------构造函数 通过构造函数来实例化对象 给person注入属性 Factory工厂 this指向的是对象的本身使⽤new 实例化⼀个对象,就像⼯⼚⼀样...

深度学习_3_实战_房价预测
梯度 实战 代码: # %matplotlib inline import random import torch import matplotlib.pyplot as plt # from d21 import torch as d21def synthetic_data(w, b, num_examples):"""生成 Y XW b 噪声。"""X torch.normal(0,…...
HCIA -- 动态路由协议之RIP
一、静态协议的优缺点: 缺点: 1、中大型网络配置量过大 2、不能基于拓扑的变化而实时的变化 优点: 1、不会额外暂用物理资源 2、安全问题 3、计算路径问题 简单、小型网络建议使用静态路由;中大型较复杂网络,建议使用…...
JS常用时间操作moment.js参考文档
Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率。日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等。下面…...
基于 FFmpeg 的跨平台视频播放器简明教程(九):Seek 策略
系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)基于 FFmpeg 的跨平台视频…...

设计模式_备忘录模式
备忘录模式 介绍 设计模式定义案例问题堆积在哪里解决办法备忘录模式行为型模式, 保存了数据某一个时间点的状态 在需要的时候进行回档单机游戏的角色 数据保存并且回档保存和回档加一个状态管理类 类图 代码 MomentData using UnityEngine;public class MomentD…...
双势阱模型
双势阱模型 原子钟 传统的原子钟利用氨分子 由于隧道效应,上顶点的氮原子可以贯穿三个氢原子形成的势垒,到达下顶点对体系注入微波能量后,氮原子在上下定点之间振荡,体系的能量在两个稳定态之间交替变换,其振荡频率决…...

文献阅读:The Reversal Curse: LLMs trained on “A is B” fail to learn “B is A”
文献阅读:The Reversal Curse: LLMs trained on “A is B” fail to learn “B is A” 1. 文章简介2. 实验 & 结果考察 1. finetune实验2. 真实知识问答 3. 结论 & 思考 文献链接:https://arxiv.org/abs/2309.12288 1. 文章简介 这篇文章是前…...

真实感受:是智能家居在选择合适的技术!
科技从来都是为了让我们的生活更加的简单、舒适,而智能家居的智能,体现在如何更更更方便的使用我需要控制的家居。 例如:下班躺在床上想休息,房间和大厅的灯还开着,这时你会选择什么产品躺着解决问题? 红外…...
前端 TS 快速入门之二:接口
1. 接口有什么用 通过 interface 定义接口。 检测对象的属性,不会去检查属性的顺序,只要相应的属性存在并且类型也是对的就可以。 interface IPerson {name: string;age: number; } function say(person: IPerson): void {console.log(my name is ${pers…...

论文生成器(论文、文献综述、开题报告……),Java、Python、C++
“让论文生成器为您省时省力,轻松写出高质量的论文!” 2022年,腾讯全球数字生态大会腾讯云智能专场发布。 链接:http://xiezuo.saiertewl.cn/tb/xrWQed?dCodeh1xDrXmuhZbKPKgI&couponCodexiaoweilunwen...

【Java基础面试三十六】、遇到过异常吗,如何处理?
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:遇到过异常吗࿰…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...