Redis远程字典服务器(1)—— 初识Redis

目录

一,关于Redis

二,Redis特性介绍

[2.1 In-memory data structures(在内存中存储数据)](#2.1 In-memory data structures(在内存中存储数据))

[2.2 Programmablilty(编程能力)](#2.2 Programmablilty(编程能力))

[2.3 Extensibility(扩展能力)](#2.3 Extensibility(扩展能力))

[2.4 Persistence(持久化)](#2.4 Persistence(持久化))

[2.5 Clustering(集群)](#2.5 Clustering(集群))

[2.6 High availability(高可用)](#2.6 High availability(高可用))

三,Redis应用场景

[3.1 Real-time data store(实时的数据存储)](#3.1 Real-time data store(实时的数据存储))

[3.2 session storage(会话存储)](#3.2 session storage(会话存储))

[3.3 Streaming & messaging(消息队列)](#3.3 Streaming & messaging(消息队列))

四,Redis为什么快?

五,在Linux上安装Redis

六,Redis客户端介绍


一,关于Redis

Redis是一个和MySQL一样的"客户端 - 服务器" 结构的程序,Redis客户端和服务器可以在同一个主机上,也可以在不同主机上。

Redis是一个能在内存中存储数据的中间件,可以用作数据库,也可以用作数据缓存,在分布式系统中能大展拳脚

二,Redis特性介绍

2.1 In-memory data structures(在内存中存储数据)

MySQL主要是通过" "的方式来存储和组织数据的,称为"关系型数据库"。

而Redis主要是通过"键值对 "的方式来存储组织数据的 --> key是string,value可以是其它的数据结构 --> 称为"非关系型数据库"。

2.2 Programmablilty(编程能力)

针对Redis的操作,我们可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量执行一些操作 --> Lua语言,也是编程语言

2.3 Extensibility(扩展能力)

我们可以在Redis原有的功能基础上,再进行扩展,Redis提供了一组API(C,C++,Rust,通过这几个语言编写Redis扩展,本质上就是一个动态链接库)

除了它提供的API,我们可以去自己扩展Redis的功能,比如Redis自身提供了很多的数据结构和命令,通过扩展可以让Redis可以支持更多的数据结构和命令

2.4 Persistence(持久化)

Redis是把数据放在内存上的,这样就可以快速访问而内存上的数据是易失的 ,进程退出/系统重启等等事件都会使内存没了。

所以Redis会把部分数据存储在硬盘上,内存为主,硬盘为辅,硬盘相当于备份内存数据,如果Redis重启,就会在重启时加载硬盘数据到内存。

2.5 Clustering(集群)

Redis作为一个分布式系统的中间件,能够支持集群是很关键的

一个Redis存储的数据是有限的,内存也是有限的,就可以引入多个服务器,部署多个Redis节点,每个节点存储数据的一部分

2.6 High availability(高可用)

Redis自身也支持主从结构的,从节点相当于主节点的备份,保证系统的可用性(主节点挂了,从节点也能顶上,这个过程是自动的)

三,Redis应用场景

3.1 Real-time data store(实时的数据存储)

  1. 这个就是把Redis当做了数据库,应用与对实时性要求比较高的场景,需要有更低的延迟和更高的吞吐量
  2. 大多数情况下,对于数据存储的考虑首先是"大",即存储的空间要大,但是仍然有一些场景考虑的是"快"。
  3. 比如"搜索引擎",广告搜索(商业搜索),对于性能的要求是非常高的,所以搜索引擎中没有用到MySQL这样的数据库,所以就把所有需要检索的数据都存储在内存中,就是使用类似于Redis这样的内存数据库来完成的
  4. 当然,使用这样的内存数据库存储大量的数据,需要不少的硬件资源的,所以一般只有不差钱的大厂才用得起
  5. Redis也可以和MySQL一起使用,遵循二八原则,将热点数据存在Redis中,这种时候Redis存的是全量数据,不能随便丢。也可以让Redis存部分数据,全量数据以mysql为主

3.2 session storage(会话存储)

  1. cookie 是实现用户身份信息的保存,同时也需要session配合(前者只是在浏览器这边存储了一个用户的身份标识,session才是真正存储在服务器上的用户的数据)
  2. 之前的session是直接存储在应用服务器上的,现在变成分布式系统后,引入负载均衡器,用户服务器有多个,用户的请求可能会被随机分发到不同的服务器,所以假设用户第一次请求,负载均衡器分到了1号服务器,生成了会话,但是用户第二次请求时,负载均衡器可能会把数据发到2号服务器,由于2号服务器没有会话,所以可能会重新登录,这样的反复登录会造成大量的资源浪费
  3. 解决:1:想办法让负载均衡器把同一个用户的请求始终打到同一个服务器上 2:把会话数据单独拿出来,放到一台独立的服务器上,每个应用服务器都把会话放到这个服务器上,访问也访问这一个

3.3 Streaming & messaging(消息队列)

  1. 此处的消息队列不是Linux进程间通信的那个,此处的消息队列是一个单独的服务器,只是有了消息队列的功能
  2. 基于这个我们就可以实现一个基于网络版本的生产者消费者模型
  3. 优势:1:解耦合 2,削峰填谷
  4. 业界也有很多知名的消息队列:RabbitMQ,Kafka,RocketMQ等,Redis也是提供了消息队列的功能的,是Redis研发的初心
  5. 但我们几乎不使用Redis作为消息队列使用

四,Redis为什么快?

  1. Redis数据在内存中,就比访问硬盘的数据库,要快很多
  2. Redis的核心功能都是比较简单的逻辑 ------ 核心功能基本都是操作内存中的数据结构
  3. 从网络角度上,Redis使用了IO多路复用的方式(epoll,用一个线程管理很多个socket)
  4. Redis使用的是单线程模型(虽然更高版本的Redis引入了多线程,但是只是在网络IO用到了,核心业务逻辑还是单线程),减少了不必要的线程之间的竞争开销,提高效率(多线程不一定能提高效率,前提是CPU密集型的任务,使用多线程可以充分利用CPU多核资源,但是Redis核心任务,主要就是操作内存的数据结构,是比较简单快捷的,不会吃很多CPU资源 ------ 没有银弹)
  5. Redis使用C语言开发的,所以快(该结论太勉强,不太认可),比如MySQL也是C语言开发的,凭啥Redis快

五,在Linux上安装Redis

下面展示在Ubuntu环境上安装Redis客户端和服务器,并启动服务器再让客户端连接上服务器

bash 复制代码
sudo apt install redis

如果是Centos,就八上面的apt换成yum即可

然后就是修改下配置文件,因为Redis是基于网络的,所以配置文件会默认将Redis的连接IP设为127.0.0.1,我们需要修改成0.0.0.0,表示该服务器可以支持任何其它IP来进行连接

bash 复制代码
vim /etc/redis/redis.conf

修改完成后我们直接启动redis服务器(都需要root权限)

bash 复制代码
sudo service redis-server start

也可以输入这个,查看服务状态,里面有的active,表示正常运行

bash 复制代码
service redis-server status

然后就是用客户端连接服务器,直接在命令行输入 redis-cli 即可;进入到客户端以后,输入ping,如果打印PONG,表示客户端正常运行。

然后我们也可以在其它主机上使用特定IP和端口来连接Redis服务器,如下图:

六,Redis客户端介绍

Redis也是一个客户端-服务器 结构的程序,MySQL也是这样,redis客户端和服务器可以在同一个主机上,也可以在不同主机上。并且服务器可以给多个客户端提供服务,Redis服务器是本体,负责存储和管理数据

Redis也有很多形态:

  • 自带命令行的客户端:redis-cli 或者也可以redis-cli -h 127.0.0.1 -p 6379
  • 图形化界面:桌面程序,web程序,但是图形化程序依赖与Windows。而以后在实际工作中,用来办公的windows系统,连接到服务器可能会有很多限制,所以不能保证和Linux一样,能100%连上redis服务器(Windows中间可能会经历跳板机,堡垒机,权限校验等)
  • 基于Redis的API自行开发客户端:工作中最主要的形态,非常类似于MySQL的C语言API和JDBC

咱们说Redis快,是相对于MySQL这样的关系型数据库的,但是如果是和内存中的操作变量相比,就没有优势了,甚至更慢。

比如我要存一个键值对,可以用redis来存,也可以直接在内存中搞个hash map来存,但是使用hash map是直接操作内存 ,使用redis是先通过"网络",再操作内存的。

所以,是否要使用redis是需要结合实际业务的,引入redis会变慢,但是可以把数据单独存储,服务器重启不会影响到数据内容,假设未来要扩展分布式系统,使用redis是最佳的

相关推荐
BestandW1shEs1 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师1 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球1 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...1 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00011 小时前
MySQL的权限管理机制--授权表
数据库
wqq_9922502771 小时前
ssm旅游推荐系统的设计与开发
数据库·旅游
难以触及的高度2 小时前
mysql中between and怎么用
数据库·mysql
Jacky(易小天)2 小时前
MongoDB比较查询操作符中英对照表及实例详解
数据库·mongodb·typescript·比较操作符
Karoku0663 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch