Bootstrap

redis-连接及配置

如何登录/运行

Xshell连接到服务器后

redis-server /etc/redis.conf 运行。配置文件的路径是安装时默认的。

redis-cli   进行登录连接,用于操作redis-server,需要redis-server先运行才行

Redis网络配置(服务端)

(我的redis,确实是安装在笔记本里面的)

登录:用户root

linux的ip地址查看:桌面-右键-打开终端-输入:ip addr 或者 ifconfig(interface configuration)

虚拟机的配置

VMWare的地址:192.168.200.130


无法链接到外网,ping www.baidu.com 不通

虚拟机的连接配置:虚拟机名称-右键-设置-网络配置器-网络连接-自定义:VMnet8(NAT模式)

Windows查看命令: ipconfig

台式机(客户端)的VMnet8地址查看,cmd-ipconfig-Ipv4:192.168.80.1

修改虚拟机的ip地址:vi /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO="static"  (之前是#dhcp)

原有虚拟机的ip地址IPADD=192.135.112.128 改为了 192.168.80.135

注意2点:

1、第三段ip都是80,在同一个区域里面

2、第四段ip大于128,因为VMWare-编辑-虚拟网络编辑器-DHCP设置...-起始IP地址:192.168.80.128,结束IP地址192.168.80.254。看出这个区间段。

网关GATEWAY=192.168.112.2 改为了192.168.80.2

注意2点:

1、网关地址怎么来的:VMWare-编辑-虚拟网络编辑器-名称:选到Vmnet8-NAT设置-网关IP里面

2、发现跟台式机是在同一个网段192.168.80,第四段台式机192.168.80.1,

        服务端192.168.80.2。

重启网络服务                或者  重启系统生效:
service network restart   /         reboot

神奇的事情发生啦,虚拟机可以连接外网啦,ping www.baidu.com有反应了,网页也能登录啦。

番外篇:笔记本当服务器的设置

笔记本的ip: 192.168.3.10
可以ping通外网,比如百度

修改(Linux)ip,编辑 vi /etc/sysconfig/network-scripts/ifcfg-ens33(STEIN)
然而我的笔记本没有ens33这个网卡,只有wlpls0这个网卡,估计后面这个表示的是无线网卡
#之前有的,要修改的

#指定IP地址
IPADDR=192.168.3.10
#网关?具体在哪看?
GATEWAY=192.168.3.2
#域名解析器
DNS1=8.8.8.8

设置主机名(Linux)
1.为了方便记忆,可以给linux系统设置主机名,也可以根据需要修改主机名
2.指令hostname:查看主机名
3.修改文件在 /etc/hostname 指定
4.修改后,重启生效

Windows下设置主机名
在C:\Windows\System32\drivers\etc\hosts文件指定即可
案例:192.168.3.6 stein

linux
在/etc/hosts文件指定
案例:192.168.3.10 notebook

安装包位置:

放到了 /opt目录下 ,然后执行解压tar -zxvf,再执行的make,以及make install

Redis后台启动&使用

1.拷贝一份redis.conf到其他目录,比如/etc目录,注意执行保证能够定位到redis.conf
      (拷贝)  cp   (从) redis.conf    (到)  /etc/redis.conf
2.修改 /etc/redis.con后台启动设置daemonize no改成yes,并保存退出。(以守护进程方式启动)

3.Redis启动,注意保证能定位redis-server指令
   /usr/local/bin/redis-server /etc/redis.conf  (最前面一段也可以使用相对路径启动)
  前面是要启动的程序,后面是指以该文件作为启动配置

4.查看进程是否启动成功:
    ps -aux | grep redis  或者 netstat -anp | more  来查看

5.用客户端访问:redis-cli     ;退出quit(只是退出,而没有关闭redis-server服务)

6.指定端口方式:redis-cli -p 6379(当端口改变的时候,就必须写端口号了,否则启动不了)

7.Redis关闭(会关闭redis-server服务)
1)单实例关闭:redis-cli shutdown
2)多实例关闭,指定端口关闭:redis-cli -p 6379 shutdown
3)也可以进入redis再关闭

8.配置文件
requirepass foobared 这个是密码
        配置密码后,在运行redis-cli后使用auth foobared登陆密码
把bind 127.0.0.1 ::1注销掉。否则只允许本地连接,Jedis连接不上 
port 6379 ,通常不改变

redis的文件构成

redis-benchmark:性能测试工具,可以在自己机器运行,看看自己机器性能如何
redis-check--aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口
 

Redis配置

配置文档

https://www.cnblogs.com/nhdlb/p/14048083.html#label0配置文件详解 https://www.cnblogs.com/nhdlb/p/14048083.html#label0

常规配置

设置密码
daemonize
loglevel
logfile
设定库的数量


Units单位

#INCLUDES#

#NETWORK# 网络相关配置

bind
        1.在配置文件里面输入/bind进行查找,输入n(ext)查找下一个。要找75行这个,别找错成61行的了。(设置行数使用命令“:set number”)


        2.默认情况bind=127.0.0.1只能接受本机的访问请求
        3.如果服务器是需要远程访问的,需要将其注释掉(加上#表示允许远程连接)
        4.启动redis,查看当前允许连接的情况(输入查看:ps -aux | grep redis)


        5.允许远程连接。(看到redis-server后面是 *:6379)
        (还有防火墙,还有保护模式也会影响。下一条说明)


protected-mode 保护模式

1.如图

2.默认是保护模式
3.如果服务器是需要远程访问的,需要将yes设置为no,这样才能远程连接

填坑了:笔记本之前连不上,就是pretected 没改成no !他竟然就这样通了 T_T

shutdown 关闭redis

redis-server /etc/redis.config 重新按该配置启动


port 端口

默认端口6379,为了安全性考虑,可以改成其他的。但是启动时就要按端口模式启动。


timeout 超时

一个空闲的客户端维持多少秒会关闭,timeout 0表示关闭该功能,即永不超时

如果发生超时,redis-cli会与redis-server断开连接


tcp-keepalive 300(默认值)

1、tcp-keepalive是对访问客户端的一种心跳检测,每隔n秒检测一次,单位为秒
2、如果设置为0,则不会进行Keepalive检测,建议设置成60
3、说明:为什么需要心跳检测机制
1)TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;
2)长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断开,
这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个
连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且有可能导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。所以服务器端要做到快速感知失败,减少无效链接操作,这就有了TCP的Keepalive(保活探测)机制

#GENERAL通用#

daemonize yes
设置为后台启动/守护进程;no 在前台显式运行
 

pidfile   /var/run/redis_6379.pid 
这个路径表示,存放pid文件的位置。每个实例会产生一个不同的pid文件,记录redis的进程号
 

loglevel notice(默认)
1、redis日志分为4个级别,默认的设置为notice,开发测试阶段可以用debug(日志内容较多,不
建议生产环境使用),生产模式一般选用notice
2、redis日志分为4个级别说明
1)debug:会打印出很多信息,适用于开发和测试阶段;
2)verbose(冗长的):包含很多不太有用的信息,但比debug要清爽一些;
3)notice:适用于生产模式:
4)warning:警告信息;


logfile ""
1、logfile""就是说,默认为控制台打印,并没有日志文件生成
2、可以为redis.conf的logfile指定配置项
3、提示:如果提示日志文件redis.log不存在,创建一个该文件即可:logfile /var/log/redis/redis.log


databases 16
设定库的数量,默认为16个,编号从0~15

#SECURITY安全#

设置密码

1.redis.conf中设置密码(永久设置)

        #requirepass foobared  (此时为无密码状态。取消#号设置密码)
        永久设置,需要在配置文件中进行设置

        可以正常使用redis-cli进行链接,但是操作时就会提示输入密码
        auth [username] foobared 进行验证。[username]是可选的,默认情况下可以不写。

        使用acl whoami 来查看当前用户,显示"default"
        acl list 查看用户列表

2.命令行设置密码(临时设置)
        1.案例。 config set requirepass foobared
        
        2.在命令中设置密码,是临时的,重启redis服务器,密码就还原了
        3.永久设置,需要在配置文件中进行设置(前面已经讲过了)

#LIMITS限制#

maxclients 10000
1、设置redis同时可以与多少个客户端进行连接。
2、默认情况下为10000个客户端。
3、如果达到了此限制,redis会拒绝新的连接请求,并且向这些连接请求方发出"max number of clients reached"

内存设置


1. maxmemory <bytes>

       1、在默认情况下,对32位实例会限制在3GB,因为32位的机器最大只支持4GB的内存,而
系统本身就需要一定的内存资源来支持运行,所以32位机器限制最大3GB的可用内存是非常合
理的,这样可以避免因为内存不足而导致Redis实例崩溃
        2、在默认情况下,对于64位实例是没有限制
        3、当用户开启了redis.conf配置文件的maxmemory选项,那么Redis将限制选项的值不
能小于1MB

        对maxmemory设置的建议
        1、Redis的maxmemory设置取决于使用情况,有些网站只需要32MB,有些可能需要12GB.
        2、maxmemory只能根据具体的生产环境来调试,不要预设一个定值,从小到大测试,基本标准是不干扰正常程序的运行。
        3、Redis的最大使用内存跟搭配方式有关,如果只是用Redis做纯缓存,64-128M对一般小型网站就足够了
        4、如果使用Redis做数据库的话,设置到物理内存的1/2到3/4左右都可以

2. maxmemory-policy noeviction(默认) 达到最大内存时采取的策略

        policy一览
1)volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
2)allkeys-lru:在所有集合key中,使用LRU算法移除key
3)volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
4)allkeys-random:在所有集合key中,移除随机的key
5)volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
6)noeviction:不进行移除。针对写操作,只是返回错误信息


3. maxmemory-samples 5(默认值)选取用于比较的样本数量

1、设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个
2、一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小

小结

连接注意事项:

1.如果Redis配置了密码,则需要进行身份校验
2.因为需要连接edis端口,比如6379,就需要配置防火墙,放开端口
3.注意修改bind,支持远程连接
4.pretected no,保护模式改成no

发布和订阅

发布和订阅是什么

一句话:Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
Redis客户端可以订阅任意数量的频道


如何理解发布和订阅模式

        任务队列

1、顾名思义,就是"传递消息的队列"
2、与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务队列中读入任务信息并执行


        如何理解

-可以这么简单的理解:
        1)Subscriber:收音机,可以收到多个频道,并以队列方式显示
        2)Publisher:电台,可以往不同的FM频道中发消息
        3)Channe:不同频率的FM频道
-从Pub/Sub的机制来看,它更像是一个广播系统,多个订阅者(Subscriber)可以订阅多个频道(Channel),多个发布者(Publisher)可以往多个频道(Channel)中发布消息。


发布订阅模式分类

        一个发布者,多个订阅者
        多个发布者,一个订阅者
        多个发布者,多个订阅者


命令行实现发布和订阅

        发布订阅操作

1、PUBLISH channel msg
将信息message发送到指定的频道channel

2、SUBSCRIBE channel [channel ...]
订阅频道,可以同时订阅多个频道

3、UNSUBSCRIBE [channel ...]
取消订阅指定的频道,如果不指定频道,则会取消订阅所有频道

4.PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道,每个模式以*作为匹配符,比如
it*匹配所有以it开头的频道(it.news、it.blog、it.tweets等等),
news.*匹配所有以news.开头的频道(news.it、news.global.today等等),诸如此类

5.PUNSUBSCRIBE [pattern [pattern ...]]
退订指定的规则,如果没有参数则会退订所有规则

        快速入门

细节:
1、发布的消息没有持久化
2、订阅的客户端,只能收到订阅后发布的消息

Jedis

        API文档

在线文档:
https://www.mklab.cn/onlineapi/jedis/
 

        Jedis工作示意图

-Java程序操作Redis的工具
-示意图(第三个老鼠是go语言)

       Jedis操作Redis数据

引入Jedis

<dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

测试连接的代码

public class Jedis_ {
    //链接Redis
    @Test
    public void con(){
        Jedis jedis = new Jedis("192.168.80.135", 6379);
        //如果Redis配置了密码,则需要身份校验
        jedis.auth("foobared");
        String res = jedis.ping();
        System.out.println("连接成功 返回结果="+res);
        jedis.close();//关闭当前连接。并没有关闭Redis
    }
}

发现连接不上。猜测是防火墙端口没有打开的原因。

打开防火墙端口

1、查看防火墙端口是否打开:firewall-cmd --list-all

看到里面的ports,后面什么都没有,就是表明什么都没有打开

2、添加6379端口:firewall-cmd --add-port=6379/tcp --permanent

添加成功会显示success,但是再去查看防火墙打开的端口,发现还是没有。是因为需要重启防火墙才会生效。

3、重启防火墙:firewall-cmd --reload

4、再次查看:firewall-cmd --list-all

可以看到添加上去了。

再次测试Jedis连接代码

运行成功。

如果还是有连接不上的情况。使用:netstat -anp | more 查看网络情况

语法说明:查看系统网络情况 netstat

  • 基本语法
netstat [选项]
  • 选项说明
    -an 按一定顺序排列输出
    -p 显示哪个进程在调用

看到只允许本地登录:127.0.0.1:6379。

需要去改配置文件的bind,将其注销#bind

修改后,再次查看网络情况:netstat -anp | more

应该是这样显示的:0.0.0.0:6379。没有限制仅本地登录

连接不上的原因,可能是Linux端的防火墙端口没有打开,也有可能是因为redis.conf设置里面的bind需要注释,否则就限定只能本机登录访问。


测试地址:localhost:8080/redisTest/t1

;