Redis概述Redis的作者SalvatoreSanfilippo在开发一个名为LLOOGG的网站时,需要实现一个高性能的队列功能。一开始,他是用MySQL来实现的,但是无论怎么优化,都没有办法用SQL语句来提升网站的性能。后来,我决定建立一个专用于LLOOGG的数据库。这就是Redis的前身。后来把Redis1.0的源码打开到GitHub上。redisgithubRedis是一个开源的,基于键值对(key-value)的NoSQL数据库,但是不同于很多键值对数据库,Redis中的值可以由字符串(string),哈希(hash),list(列表)、set(集合)、zset(有序集合)、bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等数据结构和算法。并且由于Redis将所有的数据都放在了内存中,所以其读写性能非常惊人。不仅如此,Redis还可以将内存中的数据以快照和日志的形式保存到硬盘中,这样在出现类似断点或者机器故障的时候,内存中的数据也不会丢失。此外,Redis还提供了key过期、发布订阅、事务、管道、Lua脚本等附加功能。redis官网目前国外的Github、stackoverflow、Twitter和国内的阿里巴巴、腾讯、新浪、美团、百度等都在使用Redis。无论你是开发人员还是运维人员,Redis都已经是你必须掌握的技能。Redis特点快速Redis数据存储在内存中,内存的IO性能远高于普通磁盘和固态硬盘。这是Redis性能高的主要原因,Redis是使用C语言开发的,C语言比其他语言更高效。同时采用单线程架构,避免了多线程可能产生的竞争问题。持久化Redis数据存储在内存中,机器断点后容易造成数据丢失。因此提供了一个持久化功能,可以异步更新数据并保存在磁盘上。多种数据结构Redis提供了string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等数据结构和算法。支持多种主流编程语言Java、Python、Go、Scala、Lua等主流编程语言功能丰富支持发布订阅、Lua脚本、事务和管??道等简单功能Redis单机版核心代码23000行,不依赖外部库,采用单线程模型。主从复制Redis提供了主从复制的功能,将服务器数据复制到从服务器,这也是实现高可用和分布式的基础。高可用分布式Redis在2.8版本之后提供了Redis-Sentinel来支持高可用。Redis3.0提供了Redis-Cluster来支持分布式。Redis缓存系统计数器典型应用场景(如微博转发评论数)简单消息队列系统排行榜社交网络实时系统Redis单机安装本次演示的环境基于CentOS7.8和Redis6。0.5、Redis官方Windows版不提供下载。在安装Redis之前,首先需要下载Redis6.0.5。使用wget命令下载redis6.0.5到/opt/soft目录下。[root@ittimelineopt]#mkdir/opt/soft[root@ittimelineopt]#wgethttp://download.redis.io/releases/redis-6.0.5.tar.gz--2020-07-0418:02:53--http://download.redis.io/releases/redis-6.0.5.tar.gz正在解析hostdownload.redis.io(download.redis.io)...45.60.125.1connectingdownload.redis.io(download.redis.io)|45.60.125.1|:80...已经连接。已发送HTTP请求,等待响应...200OK长度:2217666(2.1M)[application/octet-stream]Savingto:"redis-6.0.5.tar.gz"100%[==========================================================================================>]2,217,6664.58MB/s时间0.5s2020-07-0418:02:54(4.58MB/s)-Saved"redis-6.0.5.tar.gz"[2217666/2217666])下载完成后解压redis6.0.5[root@ittimelineopt]#tar-xzfredis-6.0.5.tar.gz[root@ittimelineopt]#ll|grepredisdrwxrwxr-x.7rootroot40966月918:19redis-6.0.5-rw-r--r--.1rootroot22176666月2723:51redis-6.0.5.tar.gz解压完成后创建软链接,便于管理和升级[root@ittimelineopt]#ln-sredis-6.0.5redis[root@ittimelineopt]#ll|grepredislrwxrwxrwx.1rootroot117月418:07redis->redis-6.0.5drwxrwxr-x.7rootroot40967月418:04redis-6.0.5-rw-r--r--.1rootroot2217666June2723:51redis-6.0.5.tar.gz然后进入redis目录,使用make&&makeinstall编译安装[root@ittimelineopt]#cdredis[root@ittimelineredis]#pwd/opt/redis[guanglei@ittimelineredis]$make&&makeinstall如果编译时出现如下错误信息,需要执行以下命令[root@ittimelineopt]#yuminstallcpp[root@ittimelineopt]#yuminstallbinutils[root@ittimelineopt]#yuminstallglibc[root@ittimelineopt]#yuminstallglibc-kernheaders[root@ittimelineopt]#yuminstallglibc-common[root@ittimelineopt]#yuminstallglibc-devel[root@ittimelineopt]#yuminstallgcc[root@ittimelineopt]#yuminstallmake[root@ittimelineopt]#yum-yinstallcentos-release-scl[root@ittimelineopt]#yum-yinstalldevtoolset-9-gccdevtoolset-9-gcc-c++devtoolset-9-binutils[root@ittimelineopt]#sclenabledevtoolset-9bash然后执行make&&makeinstall命令安装redis编译安装后在/opt/redis/src目录下生成几个常用的可执行文件[root@ittimelineredis]#cdsrc/[root@ittimelinesrc]#pwd/opt/redis/src[root@ittimelinesrc]#ll|grepredis*匹配二进制文件redis-benchmark匹配二进制文件redis-check-aof匹配二进制文件redis-check-rdb匹配二进制文件redis-cli匹配二进制文件redis-sentinel匹配二进制文件redis-serverredis-serverredisserverredis-cliredis客户端redis-benchmark(基准测试)redis-check-aof(aof持久化修复工具)redis-check-dump(RDB文件检查工具)redis-sentinel(Redis哨兵服务器)Redis中Redis的三种启动方式编译安装dis后,可以使用最小启动、动态参数启动、配置文件启动三种方式进行最简单的启动。只需在Linux终端任意路径输入redis-server命令即可启动Redis服务器。此时默认端口为6379。[root@ittimelinesrc]#redis-serverredis服务器成功启动redis启动验证方法ps-ef|grepredisnetstat-antpl|grepredisredis-cli-hip-pportping动态参数启动如果要使用动态参数启动,只需要输入redis-server后添加参数即可,例如redis-server--port6380执行该命令时,redis服务器会使用6380端口启动。redis-server--port6380当Redis服务启动成功后,可以使用命令ps-ef|grepredis-server|grep-vgrep命令查看redis-server的进程信息[root@ittimeline~]#ps-ef|grepredis-server|grep-vgreproot1748316967018:17pts/100:00:00redis-server*:6379root1774317696018:29pts/300:00:00redis-server*:6380也可以使用命令netstat-antpl|grepredis-server查看redis-server端口信息[root@ittimeline~]#netstat-antpl|grepredis-servertcp000.0.0.0:63790.0.0.0:*LISTEN17483/redis-servertcp000.0.0.0:63800.0.0.0:*LISTEN17743/redis-servertcp00127.0.0.1:6379127.0.0.1:36548ESTABLISHED17483/redis-servertcp600:::6379:::*LISTEN17483/redis-servertcp600:::6380:::*LISTEN17743/redis-server配置文件启动生产环境。推荐使用配置文件启动,因为有很多单机实例配置文件可以使用端口来区分。先在/opt/redis目录下创建config目录,然后将redis配置文件redis.conf复制到/opt/redis/config/目录下[root@ittimelineredis]#mkdirconfig[root@ittimelineredis]#cpredis.conf./config/redis.conf然后重命名/opt/redis/config的redis.conf文件,根据端口区分不同的配置[root@ittimelineconfig]#mvredis.confredis-6381.conf[root@ittimelineconfig]#lltotalusage84-rw-rw-r--.1rootroot82645July418:44redis-6381.conf然后使用命令简化(删除注释的描述)redis-6381.conf的内容,重定向到redis-6382.conffile[root@ittimelineconfig]#catredis-6381.conf|grep-v"#"|grep-v"^$">redis-6382.conf可以使用命令vim-dredis-6381.confredis-6382.conf比较两个文件的区别了解了以上命令的作用后,redis服务器的常用配置选项说明,redis.conf配置文件prov包含许多用于运行redis服务器的配置。这个阶段只需要注意以下配置即可。daemonize是否为守护进程,默认为no,建议设置为yesport启动端口,单机多实例必须配置,默认端口为6379logfileRedissystemlogdirRedis工作目录,日志文件,持久化文件存放路径redis-6382.config配置内容[root@ittimelineconfig]#catredis-6382.confdaemonizeyesport6382dir"/opt/redis/data"logfile"redis-6382.log"~需要在/opt下创建data目录/redis目录启动服务前[root@ittimelineconfig]#mkdir/opt/redis/data然后用指定的配置文件启动redis服务器,使用ps命令查看6382端口的redis-server进程是否启动[root@ittimelineconfig]#redis-serverredis-6382.conf[root@ittimelineconfig]#ps-ef|grepredis-server|grep6382root186451019:10?00:00:00redis-server*:6382服务启动后,可以使用cat命令查看redis-server的服务启动日志【root@ittimelineconfig]#cat/opt/redis/data/redis-6382.log18819:C04Jul202019:16:39.150#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo18819:C04Jul202019:16:39.150#Redisversion=6.0.5,0commits=0,000,0提交=000=18819,juststarted18819:C04Jul202019:16:39.150#Configurationloaded18820:M04Jul202019:16:39.152*Increasedmaximumnumberofopenfilesto10032(itwasoriginallysetto1024).18820:M04Jul202019:16:39.153*Runningmode=standalone,port=6382.18820:M04Jul202019:16:39.153#WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128.18820:M04Jul202019:16:39.153#Serverinitialized18820:M04Jul202019:16:39.153#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect.18820:M04Jul202019:16:39.153#WARNINGyouhaveTransparentHugePages(THP)supportenabledinyourkernel.ThiswillcreatelatencyandmemoryusageissueswithRedis.Tofixthisissuerunthecommand'echonever>/sys/kernel/mm/transparent_hugepage/enabled'asroot,andaddittoyour/etc/rc.localinordertoretainthesettingafterareboot.RedismustberestartedafterTHPisdisabled.18820:M04Jul202019:16:39.153*ReadytoacceptconnectionsRedis客户端连接使用redis-discli工具连接redis服务器,指定redis通过t的-p选项serverPort,通过-h指定服务器的host,127.0.0.1表示本机,也就是guest客户端和服务端在同一台服务器上[root@ittimeline~]#redis-cli-p6379-h127.0.0.1127.0.0.1:6379>客户端连接成功后可以使用set/get命令设置值和值,当输入set命令时,客户端会提示如何使用set命令。将name属性的值设置为tony127.0.0.1:6379>setnametonysetvalue后,可以使用get获取对应的属性值127.0.0.1:6379>getname"tony"当客户端输入ping时,服务端会返回庞127。0.0.1:6379>pingPONG如果客户端要退出,输入exit即可。exitexitconnectionredis-cli客户端连接服务器的默认端口是6379,默认ip是127.0.0.1,所以如果客户端和服务器在同一台机器上,直接进入redis-cli即可连接到redis服务器。
