Redis基础及进阶

1. redis安装

redis是内存型数据库

  • 数据默认写入到内存,如果断电,服务器宕机,redis进程挂掉,数据会丢失

  • selenium操作浏览器时,要注意浏览器资源释放,防止内存泄漏,崩溃

  • with open() 默认close关闭文件句柄

  • word 工具 ,没保存前,数据都放在内存里,保存后,持久化到磁盘上,永久存在

  • mysql是文件型数据库,默认持久化到磁盘上

  1. redis安装学习

    1.yum安装 ,最简单,配置yum源,yum仓库才可以
    2.源码编译安装, 指定安装路径,自定制第三方扩展模块功能(nginx http  web 80,  443 https, openssl功能扩展 )
    3.rpm软件包手动安装,很垃圾,手动解决依赖关系,不适用
    
  2. 编译安装redis,三部曲

    解决编译安装所需的依赖环境
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    
    1.下载源代码包
    	wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    
    2.解压缩
    	tar -zxvf redis-4.0.10.tar.gz
    	
    3. 释放makefile
    	./configure --prefix=/opt/redis/   #释放makefile,告诉gcc编译器,redis的安装路径 
    注:如果默认没有configure脚本,出现了makefile,直接make&&make install 安装即可
    
    4.编译且安装
    	make && make install  
    
  3. 编译完成后,即可使用redis

    启动redis服务端
    	redis-server  
    

    直接执行,即可启动服务端,但是:

    这样很不安全,容易被攻击!

    这样很不安全,容易被攻击!

    这样很不安全,容易被攻击!

  4. 指定配置文件,安全的启动redis服务端

    • 更改启动端口
    • 添加redis密码
    • 开启redis安全模式

    redis的默认配置文件是 redis.conf

    #过滤出配置文件的有益信息(去除空白行和注释行)
    grep -v "^#" redis.conf  |grep -v "^$"
    
    #将redis.conf文件内容输出到s21redis.conf文件中:
    grep -v "^#" redis.conf  |grep -v "^$" >s21redis.conf
    

    指定配置文件启动
    文件内容:

    bind 192.168.182.130  #绑定服务端地址 
    protected-mode yes	#安全模式 
    port 6800		#端口 
    requirepass  haohaio            	#密码                                                                       
    daemonize yes	#后台运行 
    pidfile /var/run/redis_6379.pid	#进程id文件
    loglevel notice		#日志等级
    logfile ""
    
    #指定文件启动:
    	redis-server s21redis.conf
    
    #其中:输入auth 输入密码 haohaio
    

    远程连接(×××.py 文件)

    import redis
    conn = redis.StrictRedis(host='192.168.73.180',port=6379,db=0,password='')
    conn.set('name1','alex2')
    

2. 数据类型

redis是一种高级的key:value存储系统,其中value支持五种数据类型

  • 字符串(strings)

  • 散列(hashes)

  • 列表(lists)

  • 集合(sets)

  • 有序集合(sorted sets)

  • 常用命令 :

    keys *         #查看所有key
    type key      #查看key类型
    expire key seconds    #过期时间
    ttl key     #查看key过期剩余时间        -2表示key已经不存在了
    persist     #取消key的过期时间   -1表示key存在,没有过期时间
    exists key     #判断key存在    存在返回1    否则0
    del keys     #删除key    可以删除多个
    dbsize         #计算key的数量
    flushdb  #清除redis所有key,慎用
    flushdb  #清除redis所有key,慎用
    flushdb  #清除redis所有key,慎用
    
  1. 字符串类型,通过set命令,设置字符串类型的key
    strings类型
    set 设置key
    get 获取key
    append 追加string
    mset 设置多个键值对
    mget 获取多个键值对
    del 删除key
    incr 递增+1
    decr 递减-1

  2. list类型,双向队列
    lpush 从列表左边插
    rpush 从列表右边插
    lrange 获取一定长度的元素 lrange key start stop
    ltrim 截取一定长度列表
    lpop 删除最左边一个元素
    rpop 删除最右边一个元素
    lpushx/rpushx key存在则添加值,不存在不处理

  3. set集合

    redis的集合,是一种无序的集合,集合中的元素没有先后顺序。

    集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子:

    sadd/srem 添加/删除 元素
    sismember 判断是否为set的一个元素
    smembers 返回集合所有的成员
    sdiff 返回一个集合和其他集合的差异
    sinter 返回几个集合的交集
    sunion 返回几个集合的并集

  4. 哈希数据结构

    hashes即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。

    hset 设置散列值
    hget 获取散列值
    hmset 设置多对散列值
    hmget 获取多对散列值
    hsetnx 如果散列已经存在,则不设置(防止覆盖key)
    hkeys 返回所有fileds
    hvals 返回所有values
    hlen 返回散列包含域(field)的数量
    hdel 删除散列指定的域(field)
    hexists 判断是否存在

3. 发布订阅

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

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

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

  • PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道,正则匹配

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

  • PUBSUB subcommand [argument [argument ...]]
    查看订阅与发布系统状态

4. redis持久化

------防止数据丢失,持久化到本地,以文件形式保存

持久化的方式 ,两种:aof模式 和 rdb模式

1.rdb

  1. 触发机制,

    1.手动执行save命令
    2.或者配置触发条件  save  200   10   #在200秒中内,超过10个修改类的操作
    
  2. 建立redis配置文件,开启rdb功能

    配置文件 s21_rdb.conf 内容如下 ,有关rdb的配置参数是 dbfilename dbmp.rdb ,一个是 save 900 1

    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379                       #定义持久化文件存储位置
    dbfilename  s21redis.rdb             #rdb持久化文件
    bind  127.0.0.1                      #redis绑定地址
    requirepass redhat          		 #
    save 900 1                  		 #
    save 300 10                  	 	 #
    save  60  10000               		 #
    save  20  2                          #在20秒内,超过2个修改类的操作
    

2.aof

--------将你的修改类的操作命令,追加到日志文件中

  • 修改aof配置文件,添加如下参数,核心功能参数是

    appendonly yes
    appendfsync always     #总是修改类的操作
                everysec   #每秒做一次持久化
                no         #依赖于系统自带的缓存大小机制
    
  • 创建aof配置文件s21aof.conf,内容如下:

    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename  dbmp.rdb
    requirepass redhat
    save 900 1
    save 300 10
    save 60  10000
    appendonly yes
    appendfsync everysec
    

3.rdb模式下的redis持久化,不重启切换为 aof模式

  • 配置

    环境准备
    1.准备一个有数据的rdb模式的redis数据库
    	准备rdb配置文件
    		daemonize yes
    		port 6379
    		logfile /data/6379/redis.log
    		dir /data/6379            		  #定义持久化文件存储位置
    		dbfilename  s21redis.rdb        		#rdb持久化文件
    		bind  127.0.0.1   		 #redis绑定地址
    		requirepass redhat          		  #
    		save 900 1                  		  #
    		save 300 10                  	 	#
    		save  60  10000               		 #
    		save  20  2  #在20秒内,超过2个修改类的操作
    
    	#详细看博客https://www.cnblogs.com/pyyu/p/10061526.html
    
    2.注意想要永久切换为aof,还得修改配置文件方可
    

5. 主从复制

  1. redis支持多实例的功能,一台机器上,可以运行多个单个的redis数据库

    环境准备,运行3个redis数据库,达到 1主 2从的配置

    主库  6379.conf 
    	port 6379
    	daemonize yes
    	pidfile /data/6379/redis.pid
    	loglevel notice
    	logfile "/data/6379/redis.log"
    	dbfilename dump.rdb
    	dir /data/6379
    
    从库 6380
    	port 6380
    	daemonize yes
    	pidfile /data/6380/redis.pid
    	loglevel notice
    	logfile "/data/6380/redis.log"
    	dbfilename dump.rdb
    	dir /data/6380
    	slaveof  127.0.0.1  6379 
    	
    从库 6381  
    	port 6381
    	daemonize yes
    	pidfile /data/6381/redis.pid
    	loglevel notice
    	logfile "/data/6381/redis.log"
    	dbfilename dump.rdb
    	dir /data/6381
    	slaveof  127.0.0.1  6379 
    
  2. 开启主从复制功能

    redis-cli info #查看数据库信息
    redis-cli info replication

    在6380 和6381数据库上 ,配置主从信息,通过参数形式修改配置,临时生效,注意要写入配置文件

    redis-cli -p 6380 slaveof 127.0.0.1 6379
    redis-cli -p 6381 slaveof 127.0.0.1 6379
    

    此时检查6379的复制信息,以及6380 6381的复制信息

    redis-cli -p 6380 info replication 
    redis-cli -p 6381 info replication  
    

    主从复制是 读写分离的,master可写, slave只读

  3. 模拟主从复制故障,手动切换master-slave身份

    1.杀死6379进程 ,干掉主库 
    
    2.手动切换 6381为新的主库,需要先关闭它的从库身份
    redis-cli -p 6381  slaveof no one 
    
    3.修改6380的新主库是 6381
    redis-cli -p 6380 slaveof  127.0.0.1 6381
    

6. redis哨兵

redis-sentinel功能

  1. 环境准备

    三个redis数据库实例 ,配置好 1主 2从的配置

    6379.conf
    	port 6379
    	daemonize yes
    	logfile "6379.log"
    	dbfilename "dump-6379.rdb"
    	dir "/var/redis/data/"
    
    6380.conf 
    	port 6380
    	daemonize yes
    	logfile "6380.log"
    	dbfilename "dump-6380.rdb"
    	dir "/var/redis/data/"
    	slaveof 127.0.0.1 6379
    
    6381.conf 
    	port 6381
    	daemonize yes
    	logfile "6381.log"
    	dbfilename "dump-6381.rdb"
    	dir "/var/redis/data/"
    	slaveof 127.0.0.1 6379
    

    三个redis哨兵进程,指定好,检测着谁
    也是准备三个配置文件,内容如下:

    vim sentinel-26379.conf  
    	port 26379  
    	dir /var/redis/data/
    	logfile "26379.log"
    
    	// 当前Sentinel节点监控 192.168.182.130:6379 这个主节点
    	// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
    	// mymaster是主节点的别名
    	sentinel monitor s21ms  0.0.0.0 6379 2
    
    	//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过20000毫秒20s且没有回复,则判定不可达
    	sentinel down-after-milliseconds s21ms  20000
    
    	//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
    	sentinel parallel-syncs s21ms 1
    
    	//故障转移超时时间为180000毫秒
    	sentinel failover-timeout s21ms 180000
    

    三个哨兵的配置文件,一模一样,仅仅是端口的区别
    三个哨兵的配置文件,一模一样,仅仅是端口的区别
    三个哨兵的配置文件,一模一样,仅仅是端口的区别

    命令行命令:

    sed "s/26379/26380/g" sentinel-26379.conf >sentinel-26380.conf
    # 配置sentinel-26380.conf  
    
    sed "s/26379/26381/g" sentinel-26379.conf >sentinel-26381.conf
    # 配置sentinel-26381.conf 
    
  2. 分别启动 三个redis数据库, 以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写
    分别启动 三个redis数据库, 以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写
    分别启动 三个redis数据库, 以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写

    配置文件在这里

    sentinel-26379.conf 
    port 26379  
    dir /var/redis/data/
    logfile "26379.log"
    sentinel monitor s21ms  127.0.0.1  6379 2
    sentinel down-after-milliseconds s21ms  20000
    sentinel parallel-syncs s21ms 1
    sentinel failover-timeout s21ms 180000
    #加一个后台运行
    daemonize yes  
    

    另两个配置文件仅仅是端口的不同:
    sentinel-26380.conf

    sentinel-26381.conf

  3. 启动哨兵

    redis-sentinel sentinel-26379.conf 
    redis-sentinel sentinel-26380.conf 
    redis-sentinel sentinel-26381.conf 
    
  4. 验证哨兵是否正常

    redis-cli -p 26379 info sentinel
    
    看到master0:name=s21ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
    表示没问题
    
  5. 干掉主库 ,检查主从切换状态

     kill -9 12749
     ps -ef|grep redis
     redis-cli -p 6380 info replication
     redis-cli -p 6381 info replication
     redis-cli -p 6380 info replication
     redis-cli -p 6381 info replication
    

7. redis-cluster搭建

  1. 环境准备

    准备好 6匹马,即6个redis节点

    redis-7000.conf :

    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb
    cluster-enabled yes                   #开启集群模式
    cluster-config-file nodes-7000.conf  #集群内部的配置文件
    cluster-require-full-coverage no  	
    #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
    

    6个配置文件,仅仅是端口的区别:
    redis-7001.conf
    redis-7002.conf
    redis-7003.conf
    redis-7004.conf
    redis-7005.conf

  2. 启动6个节点,6个马儿

    redis-server 7000.conf
    redis-server 7001.conf
    redis-server 7002.conf
    redis-server 7003.conf
    redis-server 7004.conf
    redis-server 7005.conf

  3. 分配redis slot 槽位

    • 手动写c语言 分配 (大神请自便,这里只介绍ruby)
    • 使用ruby大神 写的一个redis模块,自动分配
  4. 配置ruby脚本环境

    1.yum安装最简单 
    	yum install ruby  
    
    2.自动配置好 PATH环境变量
    	ruby和gem的环境变量
    
    3.下载ruby操作redis的模块
    	wget http://rubygems.org/downloads/redis-3.3.0.gem   
    	
    4.用ruby的包管理工具 gem 安装这个模块
    	gem install -l redis-3.3.0.gem
    
  5. 通过ruby一键分配redis-cluster集群的槽位,

    找到机器上的redis-trib.rb命令,用绝对命令创建

    开启集群,分配槽位

    #每个主节点,有一个从节点,代表--replicas 1
    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    
    #集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系
    
  6. 分配好集群后,可以向集群内写入数据了

    redis-cle -c  指定集群模式,登录数据库
    
  7. 登录redis写入数据,发现槽位分配,且重定向之后,集群搭建成功

posted @ 2019-10-23 10:52  残雪血夜  阅读(189)  评论(0)    收藏  举报