学习Redis

Posted 五光十色

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Redis相关的知识,希望对你有一定的参考价值。

一、安装部署

1、常规安装

1、安装
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
# tar xf redis-3.0.7.tar.gz
# cd redis-3.0.7
# make PREFIX=/usr/local/redis install
# cp redis_init_script /etc/init.d/redis
# chmod +x /etc/init.d/redis

2、修改配置文件
1) 修改启动脚本 # vim
/etc/init.d/redis EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli cp /usr/local/redis-3.0.7/redis.conf /etc/redis/6379.conf 2) 修改配置文件
# vim
/etc/redis/6379.conf daemonize yes 3、启动服务 # /etc/init.d/redis start

2、salt-master批量安装

1、复制文件到salt目录
# cp redis-3.0.7.tar.gz   salt/redis/files/
# cp 6379.conf            salt/redis/files/
# cp /etc/init.d/redis    salt/redis/files/

2、编辑脚本文件
# vim  redis.sls
  redis-install:
    file.managed:                                       #调用file模块的managed方法
      - name: /usr/local/src/redis-3.0.7.tar.gz         #客户端的文件路径
      - source: salt://redis/files/redis-3.0.7.tar.gz   #服务器的文件路径
      - user: root
      - group: root
      - mode: 755
      
    cmd.run:                                            #执行远程命令,使用cmd的run方法
      - name: cd /usr/local/src/ && tar xf redis-3.0.7.tar.gz && cd redis-3.0.7 && make PREFIX=/usr/local/redis install- unless: test -d /usr/local/redis                #若目录存在,不执行name模块
      - require:                                        #依赖
        - file: redis-install                           #编译前要依赖redis-install模块执行成功
  
  redis-config:
    file.managed:
      - name: /etc/redis/6379.conf                      #客户端的配置文件路径
      - source: salt://redis/files/6379.conf            #服务器的配置文件路径
      - user: root
      - group: root
      - mode: 644
  
  redis-service:                                        #服务管理模块
    file.managed:
      - name: /etc/init.d/redis                         #客户端的启动脚本路径
      - source: salt://redis/files/redis                #服务器的启动脚本路径
      - user: root
      - group: root
      - mode: 755 
  
    cmd.run:
      - name: chkconfig --add redis && chkconfig redis on
      - unless: chkconfig --list | grep redis           #若redis已存在开机启动列表,不执行name模块
  
    service.running:                                    #服务启动模块
      - name: redis
      - enable: True
      - watch:                                          #监控的文件
        - file: redis-config 
      - require:                                        #服务启动依赖下面的模块(redis-install模块下cmd)
        - cmd: redis-install
        - cmd: redis-service

3、执行
# salt "node6.a.com" state.sls  init.redis

二、redis数据类型格式

1、字符串(string)
6379> set k1 zhang3                                 #设置key和值,set都是字符串格式
6379> get k1                                        #查看key的值
6379> keys *                                        #显示所有的key
6379> keys k?                                       #匹配k开头的key
6379> exists k2                                     #判断key是否存在(0:不存在,非0:存在,key的数量)
6379> del k2                                        #删除指定的key(0:不存在,非0:存在,key的数量)
6379> type k1                                       #获取key的类型
6379> info                                          #服务器的状态
6379> select 1                                      #切换数据库(默认有16个,0-15)
6379> flushall                                      #清空所有数据
6379> append k1 ,wang5                              #追加(字符串后面追加)
6379> incr n1                                       #自增1(若key不存在就创建,并设置值为1)
6379> decr n1                                       #自减1(自增或自减必须是数字)
6379> incrby n1 5                                   #自增指定的值(整数)
6379> decrby n1 5                                   #自减指定的值
6379> incrbyfloat n2 0.1                            #自增指定的值(浮点数)
6379> mset k1 zhang3 k2 wang5                       #批量创建key
6379> mget k1 k2                                    #批量获取key
6379> strlen k1                                     #获取key字符串的长度

2、哈希(hash)
6379> hset ha1 name tom                             #设置哈希表(ha1:哈希表,name:key1)
6379> hget ha1 name                                 #查看哈希表key的值
6379> hgetall ha1                                   #查看哈希表key的所有值
6379> hmset ha1 name tom age 11                     #批量创建哈希表
6379> hmget ha1 name age                            #批量查看哈希表key的值  
6379> hmgetall ha1                                  #批量查看哈希表key的所有值
6379> hdel ha1 name                                 #删除指定的key

3、列表(list)
6379> lpush list1 a                                 #从左添加
6379> rpush list1 b                                 #从右添加  
6379> llen list1                                    #查看列表的长度
6379> lpop list1                                    #从左删除
6379> rpop list1                                    #从右删除
6379> lindex list1 -1                               #查看最后一个元素
6379> lrange list1 3                                #查看指定的元素
6379> ltrim list1 0 3                               #只保留指定的元素

4、集合(set)
6379> sadd set1 a b c                               #创建无序集合
6379> smembers set1                                 #查看集合所有的值 
6379> sismember set1 b                              #判断值是否在集合中(1:存在,0:不存在)
6379> sdiff set1 set2                               #集合的差集(以set1位参考,去重复)
6379> sdiff set2 set1                               #集合的差集(以set2位参考)
6379> sinter set1 set2                              #集合的交集(共同的值)
6379> sunion set1 set2                              #集合的并集(set1 + set2,去重的值)
6379> zadd nginx 1 a 2 b 3 c                        #创建有序集合
6379> zscore nginx a                                #查看指定的分数值
6379> zrange nginx 0 3                              #查看指定范围的值(0:下标)

5、其他
Keyspace
db0:keys=2,expires=0,avg_ttl=0          (db0:数据库1,keys:key数量,expires:过期数量,avg_ttl:ttl数量)

三、 redis 消息队列

1、订阅
6379> SUBSCRIBE test

2、发布消息
6379> PUBLISH test hello

3、接受消息(订阅端)
6379> SUBSCRIBE test
  3) "hello"

四、持久化

1、rdb(快照)
1) 介绍
rdb: 指定的时间内把内存的数据快照到文件,宕机时,会丢失部分数据
2) 配置
# vim redis.conf
  save 900 1                                            #900秒内有1个key,触发快照
  save 300 10                                           #300秒内有10个key,触发快照
  save 60 10000                                         #60秒内有10000个key,触发快照
  rdbcompression yes                                    #是否压缩
  rdbchecksum yes                                       #是否CRC64校验
  dbfilename dump.rdb                                   #快照文件的名
  dir  /usr/local/redis                                 #文件的路径

2、aof(命令日志)
1) 介绍
aof: 将所有执行过的命令保存在文件,类似mysql的binlog,宕机时,会丢失1秒数据
2) 配置
# vim redis.conf
  appendonly yes                                        #是否开启AOF模式
  appendfilename "appendonly.aof"                       #aof文件名(路径:dir选项指定)

3、其他
SAVE: 阻塞保存
BGSAVE: 在后台保存,不阻塞  
KILL -9: 会丢失上次保存后,到现在的数据  

五、Redis主从

1、主从同步原理
主收到从的sync命令,在后台执行bgsave,将rdb文件发给从,从收到后,先清空数据,再将rdb载入到内存

2、配置主从(从库操作)
1) 永久生效
# vim 6379.conf
  SLAVEOF 192.168.1.11 6379

2) 临时生效
6379> SLAVEOF 192.168.1.11 6379                         #主的ip和端口

3、查看主从信息
6379> info 
备注: 主从复制后,从库是只读模式,无法写数据

六、Redis集群

1、简介
① 客户端分片: 优势比较灵活,不存在单点故障,缺点添加节点,需要重新配置,数据要手动同步
② 代理分片: 由代理取数据,可为proxy配置算法,如Twemproxy
③ Redis Cluster:要3.0版本以上,无中心,会数据丢失
④ Coodis:豌豆荚的开源方案

2、配置集群
1) 环境规划
主节点     db01: 192.168.1.11:7001    db02: 192.168.1.11:7002    db03: 192.168.1.11:7003
从节点     db02: 192.168.1.11:7004    db03: 192.168.1.11:7005    db01: 192.168.1.11:7006
2) 创建目录和配置文件
# mkdir `seq 7001 7008`
# vim redis_7001.conf 
  bind 10.0.0.51
  port 7001
  daemonize yes
  pidfile "/opt/redis/7001/redis_7001.pid"
  logfile "/opt/redis/7001/redis_7001.log"
  dbfilename "redis_7001.rdb"
  dir "/data/redis/7001/"
  appendonly yes
  appendfilename "redis.aof"
  appendfsync everysec
  cluster-enabled yes                                   #开启集群模式
  cluster-config-file nodes_7001.conf                   #集群node配置文件(动态更新)
  cluster-node-timeout 15000                            #集群的超时时间
3) 启动集群
# redis-server /opt/redis/7001/redis_7001.conf
# for i in `seq 7002 7008`;do redis-server /opt/redis/$i/redis_$i.conf;done

3、使用工具部署集群
1) 安装ruby环境
# yum install ruby rubygems 
# gem install redis
2) 工具参数介绍
# redis-trib create                                     #创建集群
# redis-trib reshard                                    #重新分片
# redis-trib add-node                                   #添加节点
# redis-trib del-node                                   #删除节点
# redis-trib check                                      #检测节点
3) 创建集群(前主后从)
# redis-trib create --replicas 1 192.168.1.11:7001 192.168.1.11:7002 192.168.1.11:7003 \\
                                 192.168.1.11:7004 192.168.1.11:7005 192.168.1.11:7006
4) 测试集群
# redis-cli -h 192.168.1.11 -c -p 7001
7001> set k1 tom                                        #插入的数据,轮询写到集群
7001> cluster nodes                                     #查看节点信息
7001> cluster info                                      #查看集群信息
5) 添加新节点
# redis-trib add-node 192.168.1.11:7007 192.168.1.11:7001 #添加新节点(前新节点后集群节点)
# redis-trib reshard 192.168.1.11:7007                  #添加后要重新分片(分片后,自动是主节点,4个主)
6) 添加新节点,并设置主从
# redis-trib add-node 192.168.1.11:7008 192.168.1.11:7001 #添加新节点
# redis-cli -h 192.168.1.11 -p 7008                     #登录到节点
7008> CLUSTER replicate 19a5bb65                        #指定主的id号
7008> CLUSTER nodes                                     #查看节点信息

七、Redis的管理工具

1、phpredisadmin工具

1、介绍
web界面,git地址: https://github.com/ErikDubbelboer/phpRedisAdmin

2、安装部署
1) 环境依赖
# yum install httpd php php-redis 
2) 下载并安装
# cd /var/www/html/
# git clone https://github.com/erikdubbelboer/phpRedisAdmin.git
# mv phpRedisAdmin admin
# cd admin
# git clone https://github.com/nrk/predis.git vendor    #依赖包

3、修改配置文件
# cd admin/includes/
# cp config.sample.inc.php config.inc.php 
# vim config.inc.php 
  $config = array(
    \'servers\' => array(
      array(
        \'name\'   => \'local server\',
        \'host\'   => \'192.168.1.11\',                     #redis的ip
        \'port\'   => 6379,
        \'filter\' => \'*\',
  
        // Optional Redis authentication.
        //\'auth\' => \'redispasswordhere\'                 #redis的密码
      ),  
# vim /var/www/html/admin/includes/common.inc.php 
  #mb_internal_encoding(\'utf-8\');                       #注释此行

4、启动http服务
# /etc/init.d/httpd  start

5、访问
http://192.168.1.11/admin:

6、配置多个redis
# vim config.inc.php
  $config = array(
    \'servers\' => array(
      array(
        \'name\'   => \'7001\',
        \'host\'   => \'192.168.1.11\',                     #redis的ip
        \'port\'   => 7001,
        \'filter\' => \'*\',
        \'auth\' => \'123456\'                              #redis的密码
      ),  
      array(
        \'name\'   => \'7002\',
        \'host\'   => \'192.168.1.11\',                     
        \'port\'   => 7002,
        \'filter\' => \'*\',
        \'auth\' => \'123456\'                              
      ),  

2、rdbtools管理工具

 

1、介绍
Python编写的,git地址: https://github.com/sripathikrishnan/redis-rdb-tools

2、安装部署
# yum install python-pip
# pip install rdbtools
# cd /opt/7001/
# rdb -c memory dump_7001.rdb  >  memory.csv

3、saltstack管理redis

模块名称: redismod
官方文档: https://docs.saltstack.com/en/latest/ref/modules/all/index.html  

4、codis管理redis

1、介绍
豌豆荚产品,快速分布式缓存,git地址: https://github.com/CodisLabs/codis

2、Codis的组成部分
① Codis Proxy(codis-proxy): 负责代理转发客户端的请求,前端可用haproxy做负载均衡,无状态,部署多个实例
② Codis Dashboard(codis-config): web集群管理工具,支持codis-proxy、codis-server的添加、删除、数据迁移
③ Codis Redis (codis-server): 基于redis-3.2.8开发,支持redis 主从,基于redis-sentinel实现主从自动切换
④ ZooKeeper/Etcd: 存放数据路由表,节点的元信息,接受API命令传送给各个codis-proxy
⑤ Codis Admin: 集群管理的命令行工具
⑥ Codis FE: 集群管理界面
⑦ Storage: 集群状态提供外部存储

3、安装go语言环境
1) yum安装
# yum install golang         
# mkdir /opt/gopath                                     #保存go环境的路径
# vim /etc/profile
  export GOPATH=/opt/gopath
# source  /etc/profile
# go version
2) 源码包安装
# wget https://storage.googleapis.com/golang/go1.15.6.linux-amd64.tar.gz
# tar -xzf go1.15.6.linux-amd64.tar.gz -C /usr/local
# vim /etc/profile
  export PATH=$PATH:/usr/local/go/bin
# source /etc/profile
# go version
    
4、安装部署zookeeper
1) 安装Java环境
# wget http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm
# rpm -ivh jdk-8u73-linux-x64.rpm
# java -version
2) 安装zookeeper
# wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
# tar xf zookeeper-3.4.6.tar.gz 
# mv zookeeper-3.4.6 /usr/local/zookeeper  
3) 修改配置文件
# cd /usr/local/zookeeper/conf/   
# cp zoo_sample.cfg  /opt/zoo.cfg
# mkdir /opt/{zk1,zk2,zk3}   
# echo 1 > /opt/zk1/myid                                #创建id
# echo 2 > /opt/zk2/myid                                #每个服务器的ID是不同的
# echo 3 > /opt/zk3/myid          
# vim zoo.cfg                                         
  dataDir=/opt/zk1                                      #保存数据目录
  clientPort=2181                                       #客户端连接的端口
  server.1 = 192.168.1.11:2887:3887 
 server.2 = 192.168.1.11:2888:3888
  server.3 = 192.168.1.11:2889:3889
# cp zoo.cfg /opt/zk1/zk1.cfg
# cp zoo.cfg /opt/zk2/zk2.cfg
# cp zoo.cfg /opt/zk3/zk3.cfg
# vim opt/zk2/zk2.cfg 
  dataDir=/opt/zk2                                      #每个服务对应不同的目录
  clientPort=2182
# vim opt/zk2/zk2.cfg
  dataDir=/opt/zk3    
  clientPort=2183
4) 配置文件解析
# vim zoo.cfg
  tickTime=2000                                         #心跳时间(毫秒)
  initLimit=10                                          #初始通信时限(初始连接时最多心跳数10*2000)
  syncLimit=5                                           #同步通信时限(通讯间最多心跳数5*2000=10秒)
  dataDir=/opt/zk1                                      #数据保存目录
  dataLogDir=var/log/zookeeper                          #日志目录
  clientPort=2181                                       #客户端连接的端口
  server.1 = 192.168.1.11:2887:3887                     #集群id、ip、端口
  server.2 = 192.168.1.11:2888:3888                     #server.1(1是id)
  server.3 = 192.168.1.11:2889:3889                     #2889:集群间通讯端口,3889:选举端口
  maxClientCnxns=60                                     #客户端的连接数(默认60)
  minSessionTimeout=30                                  #最小的会话超时时间(默认2*2000)
  maxSessionTimeout=120                                 #最大的会话超时时间(默认20*2000)
  autopurge.snapRetainCount=3                           #保存3个快照,3个日志文件
  autopurge.purgeInterval=1                             #1小时自动清理一次
5) 启动服务
# /usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk1/zk1.cfg 
# /usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk2/zk2.cfg 
# /usr/local/zookeeper/bin/zkServer.sh  start  /opt/zk3/zk3.cfg 
6) 查看节点状态
# /usr/local/zookeeper/bin/zkServer.sh  status /opt/zk1/zk1.cfg
# /usr/local/zookeeper/bin/zkServer.sh  status /opt/zk2/zk2.cfg 
# /usr/local/zookeeper/bin/zkServer.sh  status /opt/zk3/zk3.cfg 
  Mode: leader                                          #这个是主,其他2个是从
7) 连接到节点
/usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.11:2181
[zk: 192.168.1.11:2181(CONNECTED) 0] ls /               #查看数据

5、安装codis
1) 安装
# go get -u -d  github.com/CodisLabs/codis/tree/release2.0 
# cd /opt/gopath/src/github.com/CodisLabs/codis/
# make && make gotest
# ls bin/
  codis-config  codis-proxy  codis-server
2) 命令解析
# codis-config  -h 
  -c                                                    #配置文件地址
  -L                                                    #日志文件地址
  --log-level=                                          #日志级别(debug<info默认<warn<error<fatal)     
  server                                                #redis 服务器组管理
  slot                                                  #slot管理
  dashboard                                             #启动dashboard服务
  action                                                #事件管理(只有删除历史事件的日志)
  proxy                                                 #proxy管理
# codis-proxy  -h
  -c                                                    #配置文件地址
  -L                                                    #日志文件地址
  --log-level=                                          #输出日志级别
  --cpu=                                                #proxy占用cpu核数(默认1,建议核数1/2到2/3
  --addr=                                               #proxy的redis server监听的地址(ip或域名:port)
  --http-addr=                                          #proxy的调试信息启动的http server(http://192.168.1.11/debug/vars)
# codis-server  -h
  codis-server [/path/to/redis.conf] [options]          #指定redis配置文件,选项
  -v                                                    #显示版本
  -h                                                    #获取帮助
示例
# codis-server  /etc/redis/6379.conf
# codis-server  --port 7777
# codis-server  --port 7777 --slaveof 127.0.0.1 8888
# codis-server  /etc/myredis.conf --loglevel verbose

6、部署dashboard
1) 修改配置文件
# vim config.ini
  coordinator=zookeeper                                 #zookeeper或etcd
  zk=192.168.1.11:2181,192.168.1.11:2182,192.168.1.11:2183   
  product=mycodis                                       #项目名称
  dashboard_addr=192.168.1.11:8090                      #代理的端口(代理连接dashboard)
  password=123456                                       #redis的密码(代理使用的)
  backend_ping_period=5
  session_max_timeout=1800
  session_max_bufsize=131072
  session_max_pipeline=1024
  zk_session_timeout=30000
  proxy_id=proxy_1                                      #代理的id(id号唯一)                          
2) 启动dashboard
方法1
# codis-config  dashboard &                             #不加-c时,默认读取当前目录下的config.ini 
方法2
# nohup codis-config dashboard --addr 192.168.1.11:8090 \\
  --http-log /var/log/codis-dashboard-http > /var/log/codis-dashboard & 
3) 启动报错处理
#  tail /var/log/codis-dashboard                        #查看日志
报错: create zk node failed                             #删除dashboard路径
[zk: ] rmr  /zk/codis/db_mycodis/dashboard)
4) 浏览访问
http://192.168.1.11:18087

7、初始化槽位
1) 初始化槽位
# codis-config slot init -f                             #在zookeeper创建slot信息(-f 强制创建)
2) web界面查看槽位

8、通过codis-server启动redis
1) 创建redis数据目录
# mkdir -p /opt/redis/638{1..4}
2) 编辑配置文件
# vim redis_6381.conf
  bind 192.168.1.11
  port 6381
  daemonize yes
  pidfile /opt/redis/6381/redis_6381.pid
  logfile /opt/redis/6381/redis_6381.log
  dbfilename dump_6381.rdb
  java SpringRetry学习的代码片段

python 机器学习有用的代码片段

学习笔记:python3,代码片段(2017)

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

如何利用redis来进行分布式集群系统的限流设计

jedis连接redis