【redis】redis的认识和安装

目录

  • 1.redis是什么
  • 2.Redis的特点
  • 3.安装redis
  • 4.设置远程连接
    • [4.1 开启隧道](#4.1 开启隧道)
    • [4.2 可视化客户端连接](#4.2 可视化客户端连接)
    • [4.3 开启防火墙](#4.3 开启防火墙)
  • 5.redis常见数据类型
    • [5.1 redis的一些全局命令](#5.1 redis的一些全局命令)
    • [5.2 数据结构](#5.2 数据结构)
  • [6. redis的典型应用---缓存(cache)](#6. redis的典型应用---缓存(cache))
    • [6.1 使用redis做缓存](#6.1 使用redis做缓存)
    • [6.2 缓存穿透,缓存雪崩和缓存击穿](#6.2 缓存穿透,缓存雪崩和缓存击穿)

工具:Xshell + 云服务器 + CentOS

1.redis是什么

Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同是,Redis中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成。

2.Redis的特点

1. 速度快

  1. redis所有数据都是存放在内存中的。
  2. Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 "距离" 操作系统更近,执⾏速度相对会更快。
  3. Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。

2. 基于键值对的数据结构服务器

  • Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。
  • Redis 的全称是 REmote Dictionary Server,它主要提供了 5 种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet)

3. 丰富的功能

  • 提供了键过期功能,可以⽤来实现缓存。

  • 提供了发布订阅功能,可以⽤来实现消息系统。

  • ⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的Redis 命令。

  • 提供了简单的事务功能,能在⼀定程度上保证事务特性。

  • 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开销。

4. 简单稳定

  • redis源码很少,也就意味着普通的开发和运维⼈员完全可以 "吃透" 它。
  • 其次,Redis 使⽤单线程模型,这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。
  • Redis 不需要依赖于操作系统中的类库,⾃⼰实现了事件处理的相关功能。
  • Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG⽽导致宕掉的情况。

5.客户端语言多

Redis 提供了简单的 TCP 通信协议,很多编程语⾔可以很⽅便地接⼊到 Redis,并且由于 Redis

受到社区和各⼤公司的⼴泛认可,所以⽀持 Redis 的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语⾔,例如 C、C++、Java、PHP、Python、NodeJS 等。

6. 持久化

通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢 失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。

7. 主从复制

Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica)。

8. 高可用和分布式

Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis

结点的故障发现和故障⾃动转移。也提供了 Redis 集群(Redis

Cluster),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。

3.安装redis

安装redis

powershell 复制代码
yum -y install redis

查看是否启动

powershell 复制代码
ps -ef|grep redis

启动redis

powershell 复制代码
redis-server /etc/redis.conf &

6379是redis默认端口号,出现6379则启动成功。

停止redis

powershell 复制代码
redis-cli shutdown

杀掉进程

(kill -9强制杀掉,kill -15优雅退出)

powershell 复制代码
kill -9 PID

使用redis

powershell 复制代码
redis-cli

具体操作如下:

4.设置远程连接

远程连接就是在远程连接另外一台计算机。当某台计算机开启了远程桌面连接功能后我们就可以在网络的另一端控制这台计算机了,通过远程桌面功能我们可以实时的操作这台计算机,在上面安装软件,运行程序,所有的一切都像是直接在该计算机上操作一样。

这里的远程连接指的是远程连接redis,即6379端口

⭐使用隧道的方式进行远程连接。

4.1 开启隧道

选择一个会话,右键->属性

  • 连接之后,需要重启会话连接,再打开才可以。
  • 后续访问云服务器的redis,就可以使用本地127.0.0.1+6379来访问。

⭐⭐注意:使用redis时,必须打开连接才可以。

其它电脑想访问云服务器:

  1. 开放端口号
  2. 防火墙

4.2 可视化客户端连接

使用的是redis 可视化客户端。

官网地址:redis

4.3 开启防火墙

防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。

查看防火墙状态

powershell 复制代码
systemctl status firewalld

为dead表示未开启:

开启防火墙

powershell 复制代码
systemctl start firewalld

列出当前开放端口

powershell 复制代码
firewall-cmd --list-ports

开放6379端口

powershell 复制代码
firewall-cmd --add-port 6379/tcp

5.redis常见数据类型

Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅命令,会在使⽤ Redis 的时候做到游刃有余。

5.1 redis的一些全局命令

KEYS

返回所有满⾜样式(pattern)的 key。支持如下统配样式:

  • h?llo 匹配 hello, hallo 和 hxllo

  • h*llo 匹配 hllo 和heeeello

  • h[ae]llo匹配hello 和hallo 但不匹配 hillo

  • h[^e]llo 匹配hallo, hbllo, ... 但不匹配 hello

  • h[a-b]llo 匹配hallo 和 hbllo

语法:

powershell 复制代码
KEYS pattern

示例:

powershell 复制代码
redis> KEYS *name*
1) "firstname"
2) "lastname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"

EXISTS

判断某个 key 是否存在。返回key 存在的个数。

语法:

powershell 复制代码
EXISTS key [key ...]

示例:

powershell 复制代码
redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

DEL

删除指定的 key。返回删除掉的 key 的个数。

语法:

powershell 复制代码
DEL key [key ...]

示例:

powershell 复制代码
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2

EXPIRE

为指定的 key 添加秒级的过期时间。返回值:1 表⽰设置成功。0 表⽰设置失败。

语法:

powershell 复制代码
EXPIRE key seconds

示例:

powershell 复制代码
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10

TTL

获取指定 key 的过期时间,秒级。

语法:

powershell 复制代码
TTL key

示例:

powershell 复制代码
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10

TYPE

返回 key 对应的数据类型。

语法:

powershell 复制代码
TYPE key

示例:

powershell 复制代码
redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

5.2 数据结构

type 命令实际返回的就是当前键的数据结构类型

  1. string(字符串)
  2. list(列表)
  3. hash(哈希)
  4. set(集合)
  5. zset(有序集合)

但这些只是 Redis 对外的数据结构。

实际上 Redis 针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实

现,这样 Redis 会在合适的场景选择合适的内部编码,如图所示。

6. redis的典型应用---缓存(cache)

缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到.核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅便随时读取。

举个例子:

  • ⽐如我需要去⾼铁站坐⾼铁. 我们知道坐⾼铁是需要反复刷身份证的 (进⼊⾼铁 站, 检票, 上⻋, 乘⻋过程中, 出站...).
  • 正常来说, 我的身份证是放在⽪箱⾥的(⽪箱的存储空间⼤, ⾜够能装). 但是每次刷 身份证都需要开⼀次⽪箱找身份证, 就⾮常不⽅便.
  • 因此我就可以把身份证先放到⾐服⼝袋⾥. ⼝袋虽然空间⼩, 但是访问速度⽐⽪箱 快很多.
  • 这样的话每次刷身份证我只需要从⼝袋⾥掏身份证就⾏了, 就不必开⽪箱了. 此时 "⼝袋" 就是 "⽪箱" 的缓存.使⽤缓存能够⼤⼤提⾼访问效率.

6.1 使用redis做缓存

在⼀个⽹站中, 我们经常会使⽤关系型数据库 (⽐如 MySQL) 来存储数据. 关系型数据库虽然功能强⼤, 但是有⼀个很⼤的缺陷,就是性能不⾼. (换⽽⾔之, 进⾏⼀次查询操作消耗的系统资源多).

Redis 就是⼀个⽤来作为数据库缓存的常⻅⽅案.

Redis 访问速度⽐ MySQL 快很多. 或者说处理同⼀个访问请求, Redis 消耗的系统资源比MySQL 少很多. 因此 Redis 能⽀持的并发量更⼤.

  • Redis 数据在内存中, 访问内存⽐硬盘快很多.
  • Redis 只是⽀持简单的 key-value 存储, 不涉及复杂查询的那么多限制规则.
  • 客户端访问业务服务器, 发起查询请求.
  • 业务服务器先查询 Redis, 看想要的数据是否在 Redis 中存在.
  • 如果已经在 Redis 中存在了, 就直接返回. 此时不必访问 MySQL 了.
  • 如果在 Redis 中不存在, 再查询 MySQL,同时存在保存在Redis中

6.2 缓存穿透,缓存雪崩和缓存击穿

缓存穿透

什么是缓存穿透?

访问的 key 在 Redis 和 数据库中都不存在. 此时这样的 key 不会被放到缓存上,后续如果仍然在访问该key, 依然会访问到数据库.这就会导致数据库承担的请求太多, 压⼒很⼤. 这种情况称为 缓存穿透.

产生原因

  • 业务设计不合理. ⽐如缺少必要的参数校验环节, 导致⾮法的 key 也被进⾏查询了.
  • 开发/运维误操作. 不⼩⼼把部分数据从数据库上误删了.
  • ⿊客恶意攻击.

缓存雪崩

什么是缓存雪崩?

短时间内⼤量的 key 在缓存上失效, 导致数据库压⼒骤增, 甚⾄直接宕机.本来 Redis 是MySQL 的⼀个护盾, 帮 MySQL抵挡了很多外部的压⼒. ⼀旦护盾 突然失效了, MySQL ⾃身承担的压⼒骤增, 就可能直接崩溃.

产生原因

⼤规模 key 失效, 可能性主要有两种:

  • Redis 挂了.
  • Redis 上的⼤量的 key 同时过期

缓存击穿

什么是缓存击穿?

相当于缓存雪崩的特殊情况. 针对热点 key , 突然过期了, 导致⼤量的请求直接访问 到数据库上, 甚⾄引起数据库宕机.

相关推荐
陌夏微秋3 分钟前
STM32单片机芯片与内部47 STM32 CAN内部架构 介绍
数据库·stm32·单片机·嵌入式硬件·架构·信息与通信
西海天际蔚蓝13 分钟前
递归查询全量分页数据问题
java
俎树振26 分钟前
深入理解与优化Java二维数组:从定义到性能提升的全面指南
java·算法
DARLING Zero two♡34 分钟前
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
java·开发语言·数据结构·c++·算法
love静思冥想39 分钟前
Apache Commons ThreadUtils 的使用与优化
java·线程池优化
君败红颜40 分钟前
Apache Commons Pool2—Java对象池的利器
java·开发语言·apache
意疏1 小时前
JDK动态代理、Cglib动态代理及Spring AOP
java·开发语言·spring
小王努力学编程1 小时前
【C++篇】AVL树的实现
java·开发语言·c++
计算机学无涯1 小时前
Spring事务回滚
数据库·sql·spring
找了一圈尾巴1 小时前
Wend看源码-Java-集合学习(List)
java·学习