Redis学习(第八章缓存策略)

news2024/12/23 12:43:40

目录

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主要有以下特点:

  1. 线程安全:Jedis的pipeline是基于连接池的,因此它是线程安全的,可以在多个线程之间共享和并发使用同一个pipeline。
  2. 批量处理:pipeline模式可以将多个命令一次性发送到服务器,减少了网络通信的开销。特别是当需要执行大量的读写操作时,pipeline模式可以显著提高性能。
  3. 事务处理:pipeline模式支持事务,可以在多个命令组成的管道中实现原子性操作。如果中间任何一个命令失败,整个管道都会回滚,不会执行失败命令之后的命令。
  4. 连接管理:使用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 的步骤过程如下:

  1. Cache Aside:
  • 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
  • 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
  • 更新数据时,先删除缓存中的数据,再更新数据库中的数据。
  1. Read Through:
  • 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
  • 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
  • 更新数据时,先查询数据库,将要更新的数据放入缓存中,并更新数据库中的数据。
  1. Write Through:
  • 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
  • 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
  • 更新数据时,先查询数据库,将要更新的数据放入缓存中,并更新数据库中的数据。
  1. Write Back:
  • 读取数据时,先查询缓存,如果命中缓存,则直接返回数据。
  • 如果未命中缓存,则查询数据库,并将查询结果放入缓存。
  • 更新数据时,只更新缓存,将缓存中的数据标记为脏数据(需要同步到数据库的数据),并不立即同步到数据库中。 

    Write Back

Cache Aside、Read Through、Write Through 和 Write Back 都是缓存策略,它们有各自的优缺点和使用场景。

  1. Cache Aside 策略:
  • 优点:

实现简单,易于理解和实现。

不需要使用缓存服务代理,对业务代码无侵入。

  • 缺点:

需要自己维护数据更新后的逻辑,对业务代码有侵入。

在更新数据时,需要先查询缓存,再查询数据库,增加了查询的开销。

  • 使用场景:适用于轻量级应用,对数据一致性要求不高的场景。
  1. Read Through 策略:
  • 优点:

实现了缓存和数据库的同步,避免了脏读和重复查询的问题。

减少了数据库的负载压力,提高了查询效率。

  • 缺点:

需要使用缓存服务代理,对业务代码有侵入。

在高并发的情况下,可能会出现竞争问题,需要使用锁或者其他同步机制来保证数据的一致性。

  • 使用场景:适合需要频繁使用缓存的应用,例如电商网站、新闻网站等。
  1. Write Through 策略:
  • 优点:

在更新数据时,缓存服务代理会先更新缓存,再更新数据库,减少了更新时的开销。

保证了数据的一致性和完整性,减少了数据不一致的问题。

  • 缺点:

需要使用缓存服务代理,对业务代码有侵入。

在高并发的情况下,可能会出现竞争问题,需要使用锁或者其他同步机制来保证数据的一致性。

  • 使用场景:适合对数据一致性要求较高的场景,例如银行系统、交易系统等。
  1. 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协议则负责数据的传输和控制,确保数据在传输过程中的可靠性和正确性。

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

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

相关文章

Leetcode—104.二叉树的最大深度【简单】

2023每日刷题(六) Leetcode—104.二叉树的最大深度 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int maxDepth(struct TreeNode* root){…

2017年高热度编程语言简介

世上语言千千万,我却独爱这一种!”这句话用来形容程序员和编程语言之间的爱恨情仇实在是再精准不过了。根据GitHub 2016年的开源报告,其上所有开源项目共包含了316种编程语言,这是一个什么概念呢?举个例子来说,世界上共有226个国…

高防CDN的发展趋势

随着互联网的迅速发展,网站和在线服务的安全性变得至关重要。网络攻击如DDoS攻击和恶意流量正在增加,因此高防CDN(高防御内容分发网络)成为网络安全的重要组成部分。本文将探讨高防CDN未来的发展趋势,并比较其与传统CD…

PyCharm改变代码背景图片的使用教程

一个好的集成环境是学习和使用一门编程语言的重中之重,这次我给大家分享如何改变PyCharm软件的代码背景图片。 说明:本教程使用的是汉化版PyCharm软件。 打开PyCharm软件。 点击软件最上方导航栏的文件,然后找到设置。 打开设置然后点击外观…

小米妙享无法正常启动,用非管理员权限启动

网上找到的其他方法大多数不太好 1.非管理员方式运行的方法 1.创建一个用户123,密码123 2.创建一个bat文件,复制粘贴以下内容 runas /savecred /user:123 “C:\Program Files\MI\AIoT\Launch.exe” 第一次点击运行,要输入密码,以…

面试官:说说webpack的热更新是如何做到的?

一、是什么 HMR 全称 Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用 例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致…

靶机 DC_1

DC_1 信息搜集 存活检测 详细扫描 网页目录扫描 网页信息搜集 cms 为 Drupal 漏洞利用 使用 msf 搜索 drupal 的漏洞 启动 msfconsole搜索 search drupal尝试编号为 0 的漏洞 失败 利用编号为 1 的漏洞 use 1查看需要配置的选项 show options设置目标 ip set rhost 10…

Leetcode—1726.同积元组【中等】

2023每日刷题&#xff08;六&#xff09; Leetcode—1726.同积元组 哈希表解题思路 实现代码 class Solution { public:int tupleSameProduct(vector<int>& nums) {unordered_map<int, int>count;int n nums.size();int i, j;for(i 0; i < n - 1; i) {f…

C语言实现单链表(图解增删查改+代码)

文章目录 写在前面1. 链表节点的定义2. 链表的创建3. 插入数据3.1 头插3.2 尾插3.3 在指定位置的前面插入数据 4. 删除数据4.1 头删4.2 尾删4.3 删除指定位置的数据 5. 查找数据5. 链表的销毁 写在前面 上面文章用C语言实现了顺序表的增删查改&#xff0c;本片文章继续用C语言…

web各个指标理解

QPS : 单位时间得请求次数 TPS &#xff1a;单位时间得事务数 并发 &#xff1a; QPS *单位响应时间 pv &#xff1a;进入一个网站&#xff0c;又单击打开该网站的其他页面&#xff0c;每打开一个页面就 增加一个PV,甚至在同一页面每刷新一次也多一个PV 二八定律&#xff1a;百…

nonaDlA 逻辑分析仪 使用记录

注意事项&#xff0c;很灵敏&#xff0c;不要用手碰&#xff0c;产生误触发 安装软件 github地址 官方提供的淘宝地址与使用说明 1.安装 1.安装程序 &#xff1a;下载githubDLA源码&#xff0c;打开 software\PulseView.exe安装 2.安装驱动&#xff1a;安装完第一步后&a…

【OpenVINO】行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human-下篇

行人摔倒检测 — 基于 OpenVINO C# API 部署PP-Human 4. 配置 PP-Human_Fall_Detection 项目4.1 环境配置4.2 创建 AlxBoard_deploy_yolov8 项目4.3 添加项目源码4.4 添加 OpenVINO C# API4.5 添加 OpenCvSharp 5. 测试 PP-Human_Fall_Detection 项目5.1 创建视频读取器5.2 行人…

Python南瓜头

系列文章 ​​​​​​​ 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮…

生成二维码

Qt本地生成二维码-第三方库Libqrencode Chapter1 Qt本地生成二维码-第三方库Libqrencode一、功能简介二、本地生成二维码三、在线生成二维码 Chapter2 Qt生成二维码图片方法QRCode二维码简介如何选定QR码版本&#xff1f;主要方法(1) 下载qrencode源码(2) 将qrencode源码移植到…

C++ STL六大组件

目录 前言 一、容器 1 向量 1.1 向量&#xff08;Vector&#xff09;和数组&#xff08;array&#xff09;之间的区别 1.2 语法 1.3 示例 1.3.1 创建 vector 对象 1.3.2 不能打印向量对象&#xff1b;不能打印空向量中的元素&#xff0c;因为空向量中无元素可打印 1.3…

又哭又笑,这份面试宝典要是早遇到就好了

01、算法原理 选择排序(Selection sort)是一种简单直观的排序算法。 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#…

filebeat(8.9.0)采集日志到logstash,由logstash发送的es

filebeat采集日志到logstash&#xff0c;由logstash发送的es 下载并配置filebeat下载配置logback.xml logstash配置 下载并配置filebeat 下载 参考 配置 filebeat.inputs: - type: filestreamenabled: truepaths:# 日志文件目录- D:\modellog\elkdemo\*\*.logparsers:# 多…

消息队列 RocketMQ 消息重复消费问题(原因及解决)

目录 1.出现重复消费的原因 2.解决 2.1 数据库插入法 2.2 使用布隆过滤器 2.2.1 添加hutool的依赖 2.2.2 测试生产者 2.2.2 测试消费者 1.出现重复消费的原因 BROADCASTING(广播) 模式下&#xff0c;所有注册的消费者都会消费&#xff0c;而这些消费者通常是集群部署的…

hdlbits系列verilog解答(内部wire)-09

文章目录 wire线网类型介绍一、问题描述二、verilog源码三、仿真结果wire线网类型介绍 wire线网类型是verilog的一种数据类型,它是一种单向的物理连线。它可以是输入也可以是输出,它与reg寄存器数据类型不同,它不能存储数据,只能用于组合逻辑建模。常用于assign连续赋值语…

测试饱和了? 大数据测试就业薪资和前景究竟怎么样?

随着不断有转行人员及毕业的大学生进入IT行业&#xff0c;在很多外界人眼里&#xff0c;这个行业的“缺口”已满&#xff0c;人员趋于饱和&#xff0c;但事实真的这样吗&#xff1f;还真没有。只是最基础的岗位需求在慢慢变少了&#xff0c;但行业中比较深的细分岗位&#xff0…