推广 热搜: 行业  设备    系统  参数  经纪    教师  机械  中国 

手把手实战 Redis 教学

   日期:2024-11-10     作者:n19v1    caijiyuan   评论:0    移动:http://mip.xhstdz.com/mobile/news/4335.html
核心提示:「2022 年什么会火?什么该学?本文正在参与“聊聊 2022 技术趋势”征文活动 」 Redis(Remote Dictionary Server )

2022 年什么会火?什么该学?本文正在参与“聊聊 2022 技术趋势”征文活动

手把手实战 Redis 教学

Redis(Remote Dictionary Server ) 使用 C 语言编写的,开源的 高性能

  • Redis 可以存储键和五种不同类型的值之间的映射

    值支持五种数据类型:字符串、列表、集合、散列表、有序集合

  • 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快

  • Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案;

  • Redis是单线程+多路IO复用技术

Redis 端口:6379,默认16个数据库,类似数组下标从0开始,初始默认使用0号库

优点

  • Redis 是基于内存进行的直接操作,因此读取速度非常快 有效处理程序:高性能 高并发
  • 虽然Redis 是基于内存的操作,同时为了保证数据安全可靠,会定时对数据进行持久化 两种持久化方式
  • 支持事务,丰富数据结构,支持多种集群操作

缺点

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写

Windows 版本:下方网盘连接中提供解压包,解压即用… 可以学习使用.

实际工作中,都是使用linux 的更多,所以这里顺便,记录学习下Redis Linux服务安装

安装 C语言环境

因为,Redis 是 C语言开发的,所以,运行需要C语言的开发环境需要安装

C语言环境安装

 

查看 C语言环境的版本

Linux安装 Redis

① 下载安装包:官方网址🚀 点击页面的,Download 下载最新版本的安装包

② 通过工具:等工具将,安装包上传到Linux 上

③ 解压,配置,启动运行

 

Redis高级配置

上面已经将 Redis 服务安装完毕

  • 我们可以通过 可以启动redis服务,但有些效果并不方便,可以通过修改 Redis配置文件设置Redis服务的配置

  • 为了方便操作,建议将 上传的安装包路径中配置文件 拷贝一份在方便操作的目录

    将linux 目录下文件,复制一份到 /MyRedis 目录下方便操作更改;

  • 在Redis 启动服务时候可以指定,启动的配置文件来进行Redis 设置

    通过指定路径下配置文件,来启动加载Redis 服务

Redis 后台启动

  • redis 默认不是后台启动的,在服务上操作,会一直占着页面,不方便后面的操作… 需要将Redis 设置为

  • 将 更改为此时Redis 为

Redis 远程访问

  • 在服务器上并不方便操作,Redis命令官方提供一个远程连接的工具:可以在Windows上操作远程Redis

  • redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf

    注释掉

  • 在redis3.2之后,redis增加了protected-mode,在这个模式下,即使注释掉了bind 127.0.0.1,再访问redisd时候还是报错

    修改 redis.conf 关闭保护模式

Redis 启动

  • Redis 启动成功 可以在服务器启动客户端操作Redis命令;
  • 开启了远程连接之后 也可以在 Windows 上直接操作, Linux上的Redis~

a06d17acd399e958c4c09f5b84ee8f5

Redis服务关闭

服务根路径执行 ,在客户端

Linux查看Redis 服务是否启动

 

设置密码

这个非常重要, 我学习的时候使用的是 阿里服务器上面搭建的Redis

开始着只是为了学习,随便搞搞,没想到因为没有密码第二天就被 黑客攻击了,用我的 去挖矿人都傻了,赶紧上一个密码

Redis 设置密码

  • 持久密码 通过设置 配置文件来设置密码,设置之后需要重启更新配置文件… 每次启动都是这个密码

  • 临时密码 不在 中设置,而是每次启动服务的时候设置一次临时密码同样,重启服务就没有密码…

持久密码

  • redis.conf 文件中 参数设置Redis 登录密码
  • 示例 设置Redis持久密码为:123

临时密码

  • 每次服务启动的时候,如果需要设置密码时使用
  • 建立连接之后执行: 设置临时密码为 123456临时|持久 密码都存在时候,就近原则 使用临时密码🤯

密码登录

  • 设置密码之后的控制台登录就需要输入密码了
  • 就可以完成登录✔
 

以上基础操作非常简单,多多练习即可

String是Redis最基本的类型,因为Redis 是k, v 存储的所以可以理解为:是一个HashMap<String,String>

  • String 是二进制存储的

    String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M.

常用命令

  • Redis 下标都是从 0开始计算的
 

原子性

incr | decr 是原子性操作

  • 原子操作是指不会被线程调度机制打断的操作

  • 这种操作一旦开始,就一直运行到结束,中间不会有任何

    单线程中:能够在单条指令中完成的操作都可以认为是"原子操作"

    多线程中:不能被其它进程(线程)打断的操作就叫原子操作

  • Redis单命令的原子性主要得益于Redis的单线程

java中的i++是否是原子操作

  • i++ 本质被分为

数据结构

Redis: String的数据结构为简单动态字符串

  • 类似于 Java 的Arraylist 采用, 方式来减少内存的频繁分配

    当字符串长度小于1M时,扩容都是加倍现有的空间 乘2

    字符长度超过 1M 时,每次扩容只会扩容 1M 需要注意的是字符串最大长度是

Redis 的列表类型,类似于Java 的List 集合

  • 同时它的存储方式又像一个

    你可以添加一个元素到队列

    image-20220129114047308

  • 它底层是一个 队列

  • 当一个队列 的所有值被取走,Redis 的这个k 就会消失… 这样的结构就像是Java的

常用命令

 

数据结构

Redis 中的 list数据结构为

是由多个 组成的一个链表

  • **因为List 是一个双向列表为了节省空间,普通的链表需要附带 **
  • 对于少量的数据都是直接创建一个,连续的存储空间 ,

Redis 功能与 类似

  • 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择
  • set 还提供了一个

Redis的Set是string类型的无序集合

  • 它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

常用命令

Set 不像 List 取值不会删除值

 

数据结构

Set数据结构是dict字典,字典是用哈希表实现的

Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值

Redis hash 是一个键值对集合

  • hash特别适合用于存储对象 类似Java里面的

  • 通过Redis 的Hash 可以很好的表示一个对象

    以 对应的 value 又是一个 HashMap

常用命令

 

数据结构

Hash类型对应的数据结构是两种

  • (压缩列表 否则使用

Redis有序集合zset与普通集合set非常相似

  • 不同之处在于,Zset 有序集合的每个成员都关联了一个

    Redis 通过这个 对每个元素进行 排序集合中的成员

  • 通过评分,Zset 集合中的元素是

  • 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表

有序集合可以用于实现

常用命令

 

数据结构

SortedSet(zset)是Redis提供的一个非常特别的数据结构

zset底层使用了两个数据结构

  • Hash

    hash的作用就是关联元素value和权重score,保障元素value的唯一性; 可以通过元素value找到相应的score值

  • 跳跃表

    跳跃表的目的在于给元素value排序,根据score的范围获取元素列表.

跳跃表

  • 有序集合在生活中比较常见

    例如根据成绩对学生排名,根据得分对玩家排名等

    对于有序集合的底层实现,可以用数组、平衡树、链表等…

    Redis采用的是跳跃表

跳跃表 类似于是一种算法

跳表,是基于链表实现的一种类似“二分”的算法。它可以快速的实现增,删,改,查操作

在这里插入图片描述

正常查询 16 需要依次比较 10次

在这里插入图片描述

而使用 跳跃表:我们每隔一个节点就提取出来一个元素到上一层,把这一层称作索引

每次查询先比较最上层的索引间隔,通过down 到下一层索引继续比较,知道比较对的结果…

  • , 不成立—>往后没有了down 往下 第一级索引
  • 原始链表:16==16

但这种,方式是以空间换取时间,随着数据增大 索引也会越来越多

Redis 发布订阅 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道

  • Redis 客户端可以

    发消息客户端,通过往固定的 上发布消息.

    接收消息客户端,可以订阅 多个客户端可以订阅同一个 类似于MQ的

9de367ceef6f6b99d58fc9c1221fe4b

WSM1 对频道 www 发布消息 hello

WSM2 WSM3 订阅 www 评到,可以事实监听到消息订阅…

Redis6中除了有5中基本的数据类型外,还有另外3中新数据类型

现代计算机用二进制(位) 作为信息的基础单位, 1个字节byte 等于8位bit

  • 例如: 是由三个字节组成 等于

Redis提供了Bitmaps这个“数据类型”可以实现对位的操作

  • Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同.

  • 把Bitmaps想象成一个以位为单位的数组

     

    image-20220201104021992

常用命令

setbit 根据偏移量设置 v 位上的值

  • 语法 设置Bitmaps中某个 的值

getbit 根据偏移量获取该位上的值

  • 语法 获取Bitmaps中某个偏移量的值

bitcount 这个和上面很不同✨

  • 正常清空下可以查询指定 下所有的 1 的个数

  • **除此之外还提供两个参数 **

    就是这个 start 和 end 正常人都会认为这个是数值下标其实不是, Redis可能为了方便表示的是一个字节单位而且是个范围

    实际上的 对应数据的下标是 例如是0 表示的是:0-7 Redis 对start end 设置的是字节单位所以需要 才是数组真实坐标

  • 语法 [] 可选, 如果不输入 start end 则直接返回改key 所有的1

bitop and 是一个复合操作

  • 语法 and|or|not|xor选其一即可

    and交集

    or并集 集合A差集合B:集合A中排除掉和集合B中共同元素 后剩下的元素

    not非 是一种二进制算法

    xor异或 A|B集合 中互相没有的元素.

实际场景

模拟场景

  • 统计一个网站,每天的用户浏览量

  • 定义一个

    用户的 id 就是,BitMaps 的下标 只需要通过用户 id 就可以得到改用户在这一天有没有登录系统;

 

很多应用的用户id以一个指定数字

  • 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费

    在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞

  • Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字

Bitmaps与set对比

假设网站有1亿用户, 每天独立访问的用户有5千万,如果每天用集合类型和Bitmaps分别存储活跃用户可以得到表

set和Bitmaps存储一天活跃用户对比数据 类型每个用户id占用空间需要存储的用户量全部内存量集合 类型64位5000000064位*50000000 = 400MBBitmaps1位1000000001位*100000000 = 12.5MB

很明显, 这种情况下使用Bitmaps能节省很多的内存空间, 尤其是随着时间推移节省的内存还是非常可观的

  • 但Bitmaps并不是万金油, 假如该网站每天的独立访问用户很少
  • 只有10万 , 那么两者的对比如下表所示, 很显然, 这时候使用Bitmaps就不太合适了, 因为基本上大部分位都是0
set和Bitmaps存储一天活跃用户对比(独立用户比较少)数据类型每个userid占用空间需要存储的用户量全部内存量集合类型64位10000064位*100000 = 800KBBitmaps1位1000000001位*100000000 = 12.5MB

简介

在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV

可以使用Redis的、轻松实现

  • 但像UV 、搜索记录数等需要去重和计数的问题如何解决? 对每个浏览的ip进行统计, 统计该网站每天被多少个ip 访问…

    这要求对每个不同的 ip 进行存储,并统计集合中

  • 解决基数问题有很多种方案

    数据存储在MySQL表中,使用distinct count计算不重复个数

    Redis提供的hash、set、bitmaps等数据结构来处理

什么是基数:就是一组不重复的数据~

  • 数据集 {1, 3, 5, 7, 5, 7, 8} 那么这个基数数据集就是

Hyperloglog

  • 是用来做基数统计的算法,HyperLogLog 的优点是
  • 在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的.
  • 可以理解HypeLogLog就是高级的 Set

常用命令

将指定的元素添加到

  • 语法 插入成功返回1

统计 中的元素个数.

  • 语法

将一个|多个 合并并存储到另外一共

  • 语法 会自动过滤 重复的值…

简介

Redis 3.2 中增加了对类型的支持

Redis 可以通过记录地图上的坐标 来设置地理信息:提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作

常用命令

添加一个经纬度坐标

  • 语法

  • 实例 创建一个 上海的坐标是

  • 注意 两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入

    有效的经度从 -180 度到 180 度

    有效的纬度从 -85.05112878 度到 85.05112878 度 当坐标位置超出指定范围时,该命令将会返回一个错误

    南北极,无法暂时直接添加…

根据 获取该位置的

  • 语法
  • 实例 获取上海的坐标.

获取两个坐标之间的

  • 语法 两个地址首先要在同一个 中

    如果没有指定则,默认使用 m 做单位;

以给定的经纬度为中心,找出某一半径内的元素

  • 语法

    以指定 为中心,查找附近的设备…

请结合配置文件: 配置文件进行管理;

image-20220131225702533

  • Units 单位

    Redis 开头定义了一些基本度量单位配置文件:敏感大小写…

  • 这里无需更改了解,Redis的规则单位说明:

引入外部配置

类似jsp中的include,多实例的情况可以把公用的配置文件提取出来

  • 引入外部的配置文件,就像 jsp 的 < include > 可以引入外部的小脚本~

自定义模块配置

  • redis3.0的爆炸功能是新增了集群

  • redis4.0就是在3.0的基础上新增了许多功能

    通过 loadmodule 配置将引入自定义模块来新增一些功能.

网络配置

  • 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址 这样访问 Redis服务只能通过本机的客户端连接,而

    如果bind选项为空的话,那会接受所有来自于可用网络接口的连接…

  • 指定redis运行的端口,默认是

    由于Redis是单线程模型,因此单机开多个Redis进程的时候会修改端口

  • 设置客户端连接的超时时间

    当客户端在这段时间内没有发出任何指令,那么Redis服务自动关闭该连接。

  • 对访问客户端的一种,每个n秒检测一次

    将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞.

  • 设置tcp的backlog backlog其实是一个

    在高并发环境下你需要一个高backlog值来避免慢客户端连接问题.

Redis 总体常用的配置

  • 设置为 表示指定Redis以守护进程的方式启动

  • 配置PID文件路径,当redis作为守护进程运行的时候,会将服务 pid 默认写到Linux系统可以通过查看该文件获取 redis服务pid

  • 定义日志级别:默认值为,有如下4种取值

    debug(记录大量日志信息,适用于开发、测试阶段

    verbose(较多日志信息

    notice(适量日志信息,使用于生产环境

    warning(仅有部分重要、关键信息才会被记录

  • 配置log文件地址, 默认打印在命令行终端的窗口上, 默认不输出配置文件;

  • 设置数据库的索引。默认的数据库是 0

SNAPSHOTTING 快照

  • 配置触发 Redis的持久化条件, 也就是什么时候将内存中的数据保存到硬盘

    如果你只是用Redis的缓存功能,不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能

  • 默认值为yes

    当启用了RDB且最后一次后台保存数据失败Redis是否停止接收数据

    这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了 Redis重启 又可以重新开始接收数据了

  • 默认值是yes

    对于存储到磁盘中的快照,可以设置是否进行

    如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大

  • 默认值是yes

    在存储快照后,我们还可以让redis使用CRC64算法来进行

  • 设置快照的文件名,默认是

  • 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名

SECURITY 安全保护

  • 命令重命名,对于一些危险命令例如: 一些黑客不法分子,输入命令执行…

    服务端redis-server,常常需要禁用以上命令来使得服务器更加安全禁用 flushdb命令

    也可以保留命令但是不能轻易使用,重命名这个命令即可重命名,之后更简单了😀

  • 置redis连接密码…

CLIENTS 客户端设置

  • 设置客户端最大并发连接数,默认无限制

    当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回

MEMORY MANAGEMENT 内存管理

  • 设置Redis的最大内存,如果设置为0 表示不作限制

    建议设置,否则, 内存满了造成服务器宕机 可以对内存满载进行设置…

  • 当内存使用达到maxmemory设置的最大值时,redis使用的

    volatile-lru 利用LRU算法移除设置过过期时间的key

    volatile-ttl

    volatile-random

    allkeys-lru

    allkeys-random

    no-enviction 默认值

  • lru ttl 样本数量

    LRU算法和最小TTL算法都并非是精确的算法

    所以:你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个

APPEND onLY MODE 追加模式

默认值为no 关闭

  • 默认redis使用的是rdb方式持久化
  • Append only File是另一种持久化方式 设置 yes 开启 aof

  • aof文件名,默认是"appendonly.aof"

aof持久化策略的配置

  • no:表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快
  • always:表示每次写入都执行fsync,以保证数据同步到磁盘
  • everysec:表示每秒执行一次fsync,可能会导致丢失这1s数据

默认值为no

  • 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于和的aof模式来说

  • 执行fsync会造成阻塞过长时间,如果对延迟要求很高的应用,这个字段可以设置为yes

    默认为no,建议yes Linux的默认fsync策略是30秒。可能丢失30秒数据

64mb

  • 设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写

默认值为 yes

  • aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存会执行异常
  • 如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后
  • 如果是no,用户必须手动redis-check-aof修复AOF文件才可以

LUA scriptING lua脚本设置

  • lua-time-limit:一个lua脚本执行的最大时间,单位为ms。默认值为5000

REPLICATION 复制

Redis 集群的配置, 下面介绍…

Redis 集群的配置, 下面介绍…

Redis 为了方便提供了一共依赖, 就想Java 操作数据库一样需要引入一个

里面定义了大量操作 Redis 的接口方法… 这个不需要太细致精通,了解即可,毕竟现在Java 都是SpringBoot 的工程了. 下面整合SpringBoot 才是关键

① 创建一共Maven工程 本地Git 进行管理…

② 添加Maven依赖

 

③ 编写测试类

  • 为了方便管理创建一个包

  •  

    执行测试连接

  • 通过 获取的 进行操作Redis 的各种方法… 下面进行逐一简单测试~

  • 使用完毕之后,记得 回收资源

注意:使用远程连接操作时候

Redis 配置文件要打开允许网络远程调用 关闭保护模式

如果是Linux 操作系统,要关闭

 
 

Redis 的大部分方法都和 Jedis 中API 一致不详细一一介绍了

个人代码,需要的可以下方地址下载…

image-20220201201816466

Spring Boot整合Redis非常简单

 

 

创建

 

发送一请求

  • 请求发送成功,后台成功接收到请求
  • ,Redis存储的k 是乱码

41c81896321e77112616116c1bb5445

之前通过,Redis 整合Java 使用的是

  • 可以直接通过 我个人感觉良好,挺好用的但是 Springboot2 移除了…
  • Jedis 采用直连方式,多个线程操作是不安全的,A B线程同时操作Redis共享数据… 为了避免需要使用
  • Lettuce 实例可以在多线程中共享,不存在线程安全问题可以减少线程的数据.
 

查看SpringBoot 自动注入的

自动配置文件下

  • SpringBoot 自动集成的配置类,不可更改,是 默认实现
  • 注解,当程序中没有 则使用,注入改配置类对象到 Spring容器

 

StringRedisTemplate 只能对 key=String

  • StringRedisTemplate 继承了 RedisTemplate

  • RedisTemplate 是一个泛型类,而 StringRedisTemplate 则不是

  • 他们各自序列化的方式不同,但最终都是得到了一个字节数组

    StringRedisTemplate 使用的是 StringRedisSerializer 类

    RedisTemplate 使用的是 JdkSerializationRedisSerializer 类

  • 两者的数据是不共通的

    StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据

    RedisTemplate 只能管理 RedisTemplate中 的数据

定义 配置包

 

重启配置执行

image-20220202004410968

Redis 存储的key 不在乱码…

正常情况下,公司存储对象都是JSON 类型所以,发送的value

当然 Redis 也支持发送存储 对象,实体类要进行序列化配置,不然不可以进行网络传输…

image-20220127104517687

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速

  • 数据存储结构,类似于HashMap,HashMap的优势就是查找和操作的 时间复杂度都是O(1)

  • 采用单线程,避免了不必要的上下文切换和竞争条件

  • 多路IO复用,非阻塞IO

    这里不好解释多路复用,可以理解为网络IO多路复用技术来

    多路-指的是多个socket网络连接

    复用-指的是复用一个线程

    多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术.

    复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗,Redis在内存中操作数据的速度非常快,内存内的操作不会成为这里的性能瓶颈

多路复用

多路复用主要有三种技术:select,poll,epoll

select | poll

  • 两者很类似,大概是一种轮询的形式进行多路执行,每个请求与服务建立连接,对多个连接进行轮询操作处理,未处理的会进入堵塞

  • 缺点:会有空操作情况,大量的连接如果有的连接没有操作,也会进行轮询…浪费上下文切换时间

  • select | poll 区别

epoll

  • 每个连接,的操作会进行统计,如果没有操作的连接,不会进行操作
本文地址:http://mip.xhstdz.com/news/4335.html    物流园资讯网 http://mip.xhstdz.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新文章
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新文章
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号