学习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学习的代码片段