工具:Xshell + 云服务器 + CentOS
Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同是,Redis中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成。
1. 速度快
- redis所有数据都是存放在内存中的。
- Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快。
- 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),是真正的分布式实现,提供了⾼可⽤、读写和容量的扩展性。
安装redis
yum -y install redis
查看是否启动
ps -ef|grep redis
启动redis
redis-server /etc/redis.conf &
停止redis
redis-cli shutdown
杀掉进程
(kill -9强制杀掉,kill -15优雅退出)
kill -9 PID
使用redis
redis-cli
具体操作如下:
远程连接就是在远程连接另外一台计算机。当某台计算机开启了远程桌面连接功能后我们就可以在网络的另一端控制这台计算机了,通过远程桌面功能我们可以实时的操作这台计算机,在上面安装软件,运行程序,所有的一切都像是直接在该计算机上操作一样。
这里的远程连接指的是远程连接redis,即6379端口。
⭐使用隧道的方式进行远程连接。
选择一个会话,右键->属性
⭐⭐注意:使用redis时,必须打开连接才可以。
其它电脑想访问云服务器:
使用的是redis 可视化客户端。
官网地址:redis
防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
查看防火墙状态
systemctl status firewalld
为dead表示未开启:
开启防火墙
systemctl start firewalld
列出当前开放端口
firewall-cmd --list-ports
开放6379端口
firewall-cmd --add-port 6379/tcp
Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅命令,会在使⽤ 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
语法:
KEYS pattern
示例:
redis> KEYS *name*
1) "firstname"
2) "lastname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"
EXISTS
判断某个 key 是否存在。返回key 存在的个数。
语法:
EXISTS key [key ...]
示例:
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 的个数。
语法:
DEL key [key ...]
示例:
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2
EXPIRE
为指定的 key 添加秒级的过期时间。返回值:1 表⽰设置成功。0 表⽰设置失败。
语法:
EXPIRE key seconds
示例:
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
TTL
获取指定 key 的过期时间,秒级。
语法:
TTL key
示例:
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
TYPE
返回 key 对应的数据类型。
语法:
TYPE key
示例:
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"
type 命令实际返回的就是当前键的数据结构类型
但这些只是 Redis 对外的数据结构。
实际上 Redis 针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实
现,这样 Redis 会在合适的场景选择合适的内部编码,如图所示。
缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到.核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅便随时读取。
举个例子:
- ⽐如我需要去⾼铁站坐⾼铁. 我们知道坐⾼铁是需要反复刷身份证的 (进⼊⾼铁 站, 检票, 上⻋, 乘⻋过程中, 出站…).
- 正常来说, 我的身份证是放在⽪箱⾥的(⽪箱的存储空间⼤, ⾜够能装). 但是每次刷 身份证都需要开⼀次⽪箱找身份证, 就⾮常不⽅便.
- 因此我就可以把身份证先放到⾐服⼝袋⾥. ⼝袋虽然空间⼩, 但是访问速度⽐⽪箱 快很多.
- 这样的话每次刷身份证我只需要从⼝袋⾥掏身份证就⾏了, 就不必开⽪箱了. 此时 “⼝袋” 就是 “⽪箱” 的缓存.使⽤缓存能够⼤⼤提⾼访问效率.
在⼀个⽹站中, 我们经常会使⽤关系型数据库 (⽐如 MySQL) 来存储数据. 关系型数据库虽然功能强⼤, 但是有⼀个很⼤的缺陷,就是性能不⾼. (换⽽⾔之, 进⾏⼀次查询操作消耗的系统资源多).
Redis 就是⼀个⽤来作为数据库缓存的常⻅⽅案.
Redis 访问速度⽐ MySQL 快很多. 或者说处理同⼀个访问请求, Redis 消耗的系统资源比MySQL 少很多. 因此 Redis 能⽀持的并发量更⼤.
- 客户端访问业务服务器, 发起查询请求.
- 业务服务器先查询 Redis, 看想要的数据是否在 Redis 中存在.
- 如果已经在 Redis 中存在了, 就直接返回. 此时不必访问 MySQL 了.
- 如果在 Redis 中不存在, 再查询 MySQL,同时存在保存在Redis中
缓存穿透
什么是缓存穿透?
访问的 key 在 Redis 和 数据库中都不存在. 此时这样的 key 不会被放到缓存上,后续如果仍然在访问该key, 依然会访问到数据库.这就会导致数据库承担的请求太多, 压⼒很⼤. 这种情况称为 缓存穿透.
产生原因
- 业务设计不合理. ⽐如缺少必要的参数校验环节, 导致⾮法的 key 也被进⾏查询了.
- 开发/运维误操作. 不⼩⼼把部分数据从数据库上误删了.
- ⿊客恶意攻击.
缓存雪崩
什么是缓存雪崩?
短时间内⼤量的 key 在缓存上失效, 导致数据库压⼒骤增, 甚⾄直接宕机.本来 Redis 是MySQL 的⼀个护盾, 帮 MySQL抵挡了很多外部的压⼒. ⼀旦护盾 突然失效了, MySQL ⾃身承担的压⼒骤增, 就可能直接崩溃.
产生原因
⼤规模 key 失效, 可能性主要有两种:
- Redis 挂了.
- Redis 上的⼤量的 key 同时过期
缓存击穿
什么是缓存击穿?
相当于缓存雪崩的特殊情况. 针对热点 key , 突然过期了, 导致⼤量的请求直接访问 到数据库上, 甚⾄引起数据库宕机.