一、初识Redis
1.1、什么是Redis
完全开源免费,使用C语言编写,遵守BSD协议的一个高性能key-value分布式内存数据库并提供持久化的NoSQL数据库。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),可用作数据库、缓存和消息中间件。
1.2、Redis特性
1.2.1、速度快
Redis官方给出的数据是10W OPS(每秒可以操作数据10W次),这个数据会根据电脑性能和Redis的使用方式不同而略微不同,但是在万级数据中操作没有压力。
那么Redis为什么这么快,主要有以下几个方面
1、纯内存操作
数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。
2、编程语言
纯ANSI C编写,不依赖第三方类库,没有像memcached那样使用libevent,因为libevent迎合通用性而造成代码庞大,所以作者用libevent中两个文件修改实现了自己的epoll event loop。
3、线程模型
Redis使用单线程操作,避免了频繁的上下文切换,虽然是采用单线程,但是单线程避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;虽然作者认为CPU不是瓶颈,内存与网络带宽才是,但实际测试时并非如此。
4、采用了非阻塞I/O多路复用机制
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间
1.2.2、持久化
Redis的数据存储在内存中,对数据的更新会异步存储在磁盘中,Redis提供两种持久化策略保证服务在宕机或者断电等不正常情况发生时,重启Redis服务来恢复数据到内存中。
1.2.3、多种数据结构
Redis提供了string、List、set、Zset、Hash五种数据结构来存储数据,而memcached只支持string数据类型。在redis的新版本中提供了 bitmaps(位图), hyperloglogs (超小内存唯一值计数)和 geospatial(地理空间)数据类型
1.2.4、支持多种编程语言
1.2.5、功能丰富
1、消息发布订阅
2、Lua脚本
3、事务
4、pipeline
1.2.6、简单
Redis单节点的核心代码只有23000行,我们来吃透Redis这个项目,或者有些企业通过修改Redis源代码来实现定制化功能都是非常容易的,Redis不依赖于外部的第三库,单线程模型,无论服务端还是客户端开发都会相对容易。
1.2.7、主从复制
在Redis中有主从复制,分为主服务器和从服务器两个角色,主服务器数据可以同步到从服务器上,可以为高可用和分布式提供很好的基础。
1.2.8、高可用和分布式
Redis的单点或者主从复制模型,如果想要实现高可用是比较困难的,在2.8版本推出Redis-Sentinel支持高可用,Redis在3.0版本推出Redis-Cluster支持分布式
1.3、Redis典型使用场景
1.3.1、缓存系统
我们要获取数据先从cache(缓存)中获取,如没有在从数据库中获取,以减轻数据库的压力
1.3.2、计数器和计时器
我们可以使用redis的incr来记录转发数,评论数,视频播放数等,而不会发生错误,这个功能对公司项目的决策是很重要的, 计时,比如验证码一分钟内有效。可以使用 Redis 的 setex 命令设置验证码只保存一分钟,一分钟后失效
1.3.3、消息队列系统
消息队列,一般我们会简称它为MQ(Message Queue),我们使用消息队列可以实现解耦,异步,削峰限流等功能,成熟的消息队列有ActiveMQ,RabbitMQ、Kafka等,Redis页提供了消息队列功能,如果你的项目中使用了大量的Redis,需要实现简单的消息队列功能,这时可以考虑使用Redis实现。Redis 的 List 类型能够很轻松的实现一个消息队列,使用 lpush 和 rpop/brpop(阻塞版rpop)即可实现一个消息队列
1.3.4、排行榜
Redis提供的有序集合(Zset),可以实现排行榜
1.3.5、社交网络
Redis与社交网络吻合度很高,比如粉丝数,关注数,共同关注等,比如新浪微博,推特都在使用Redis
1.3.6、实时系统
比如垃圾邮件过滤,秒杀等系统就可以使用Redis实现
总之Redis的应用场景数不胜数,理解Redis的精髓熟练运用解决你项目中遇到的问题!
二、Redis安装和配置
2.1、Redis安装环境
Redis可以在windows下和Unix下安装,我们这里选择使用Linux下安装,也是推荐的一种方式
2.2、下载
我们进入到/usr/local目录下下载安装包,或者到官网下载之后上传到Linux上。下载地址:http://download.redis.io/releases/
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
复制
2.3、解压安装
2.3.1、解压
tar -zxvf redis-5.0.5.tar.gz
复制
2.3.2、安装
进入到redis解压目录运行make & make install进行编译安装
make & make install
复制
2.4、Redis核心文件目录介绍
2.4.1、src目录
Redis的核心目录是src目录,在Redis的安装目录下,Redis的相关启动关闭命令就在该目录下
redis-server------------>操作Redis服务器命令
redis-cli----------------->Redis命令行客户端
redis-benchmark----->Redis性能检测工具
redis-check-aof------->AOF文件修复工具
redis-check-rdb---->RDB文件检查工具
redis-sentinel---------->Sentinel服务器(2.8以后版本)
我们目前需要关心的是redis-server和redis-cli这两个命令
2.4.2、redis.conf文件
redis.conf配置文件在redis的安装目录下,这个是redis的核心配置文件,如果我们要修改配置可以读取该文件,默认读取redis安装目录下的这个配置文件,我们在启动Redis时也可以指定配置文件读取。
2.4.3、动点手脚
我们进入到src目录下之后发现有很多文件,我们需要使用的就是那么几个可执行命令,我们可以在redis安装目录下创建bin目录将可执行文件拷贝进来,方便使用。参考图如下,大家使用cp命令即可实现
2.5、redis启动和连接
2.5.1、默认启动
使用默认的配置启动redis,直接使用redis-server命令即可,使用非守护进程的方式启动,会占用当前操作窗口,我们可以之间按ctrl+c退出Redis
redis-server
复制
2.5.2、动态参数
我们可以使用动态参数方式连接redis,我们指定端口号为6380
redis-server --port 6380
复制
2.5.3、指定配置文件(推荐使用)
1、在redis安装目录下创建conf目录存储配置文件
mkdir conf
复制
2、将redis.conf配置文件中的内容去除注释和空格等输出到指定配置文件(redis-6379.conf)中
cat redis.conf | grep -v "#" | grep -v "^$" >> conf/redis-6379.conf
复制
3、修改redis-6379.conf文件,大家修改时注意注释的地方即可
#bind 127.0.0.1
protected-mode no
port 6379
daemonize yes
logfile "/var/redis-5.0.5/logs/redis.log"
dir "/var/redis-5.0.5/data"
复制
4、创建data和logs目录
mkdir -p /var/redis-5.0.5/data /var/redis-5.0.5/logs
复制
5、启动,redis-server后跟上配置文件路径即可
redis-server conf/redis-6379.conf
复制
6、查看redis进程
ps -ef | grep redis
复制
2.5.4、客户端连接
我们这里使用命令行客户端连接redis,使用redis-cli命令 -h写ip,-p写端口
redis-cli -h 127.0.0.1 -p 6379
复制
5.5.5、测试使用
ping命令如果返回PONG代表连接成功
set 设置String类型值,k1、为键,hello为值
get 根据键获取值,k1为键,hello为返回的值
2.6、Redis常用配置
Redis的配置有很多,这里我们是简单入门说一些常用的配置,其他的配置我们在指定的模块贴出,这些配置都是在我们上边说到的redis.conf文件中
2.6.1、daemonize
大概在136行,默认为no,是否将redis进程当做守护进程在后台运行,我们可以将其设置为yes
2.6.2、port
大概在92行,redis的默认端口为6379,如果需要单节点上启动多个redis实例,需要修改端口号
2.6.3、logfile
大概在171行,配置redis的日志文件,默认什么都没有,我们可以修改日志想要存储的路径等,查看redis运行的情况
2.6.4、dir
大概在263行,配置redis的持久化文件存储路径,默认是./也就是当前路径,也就是启动redis-server命令的路径,可以按需修改
2.6.5、bind
大概在69行,是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址。如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求,我这里直接将其注释掉
2.6.6、protected-mode
大概在88行,redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:
1、关闭protected-mode模式,此时外部网络可以直接访问
2、开启protected-mode保护模式,需配置bind ip或者设置访问密码
写在最后:
各位的支持和认可(评论和点赞)是我最大的动力,我们下篇再见!
本篇文章有任何错误希望不吝指出,不胜感激!
求知并无捷径,如果有,那就是放弃这个幼稚的想法,静下心来多读书、总结