zoukankan      html  css  js  c++  java
  • Redis的部署及使用

    Redis

    Memcached与Redis的对比

    Memcached:

    优点:
    	1. 纯set get性能好
    	2. 开发都会用,易用简单
    	4. 可用于存放session
    缺点:
    	1. 不支持持久化
    	2. 支持类型单一
    	3. 没有验证
    	4. 依靠magent
    

    Redis:

    优点:
    	1. 持久化
    	2. 支持集群
    	3. 有基础验证
    	4. 支持多种数据类型
    	5. 可用于购物车
    缺点:
    	1. 性能不如memcached
    

    解决方案:1.写两份 2.预刷新(写个脚本,把常用的数据放到redis里卖)

    redis官网:https://redis.io/

    安装部署redis

    系统要求:
    	linux:CentOS7
    	memory:2G+
    	ip address:192.168.1.5
    	zookeeper:3.4.10
    	redis:redis-3.2.9
    	java version:1.8.0_131
    	
    
    下载redis的源码安装包
    # cd /usr/local/src && wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz
    
    解压redis的源码安装包
    # tar -zxvf redis-3.2.9.tar.gz
    
    切换到redis的源码安装目录
    # cd redis-3.2.9/
    
    安装redis
    # make PREFIX=/usr/local/redis-3.2.9 install
    
    最佳实现方式,创建redis的软连接
    # ln -sv /usr/local/redis-3.2.9/ /usr/local/redis
    
    复制redis的启动脚本到init.d下作为开机自启动脚本使用
    # cp /usr/local/src/redis-3.2.9/utils/redis_init_script /etc/init.d/redis
    
    修改redis的启动脚本
    # vim /etc/init.d/redis
    
    修改内容如下,修改EXEC、CLIEXEC的启动路径
    EXEC=/usr/local/redis/bin/redis-server
    CLIEXEC=/usr/local/redis/bin/redis-cli
    
    添加执行权限
    # chmod +x /etc/init.d/redis
    
    创建redis脚本中指定的redis.conf配置文件的路径
    # mkdir /etc/redis
    
    复制redis.conf到脚本指定的路径下
    # cp /usr/local/src/redis-3.2.9/redis.conf /etc/redis/6379.conf
    
    修改网络最大支持链接数为512(默认为128)
    # echo 512 > /proc/sys/net/core/somaxconn
    
    创建redis所需目录
    # mkdir -p /var/lib/redis_6379
    
    编辑redis.conf配置文件
    # vim /etc/redis/6379.conf
    
    修改配置文件中的配置为以下配置
    daemonize yes
    logfile "/var/log/redis_6379.log"
    dbfilename dump_6379.rdb
    dir /var/lib/redis_6379
    requirepass demon
    
    
    注意:
    	daemonize:  支持后台运行
    	logfile:	指定redis的log日志存放
    	requirepass:指定用户密码,避免root用户启动redis提权,密码自己设置
    
    启动redis服务
    # /etc/init.d/redis start
    
    看一眼redis的日志,根据警告可以自行调试
    # tail /var/log/redis_6379.log
    
    调试redis日志中的警告信息
    # sysctl vm.overcommit_memory=1
    # echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
    删除redis的pid文件,重启redis
    # rm -rf /var/run/redis_6379.pid
    # /etc/init.d/redis stop
    # /etc/init.d/redis start
    
    启用redis的client测试redis
    # /usr/local/redis/bin/redis-cli -a demon
    
    
    输入info即可查看redis的相关信息
    127.0.0.1:6379> info
    # Server
    redis_version:3.2.9
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:6fc178b1c807c960
    redis_mode:standalone
    os:Linux 3.10.0-327.el7.x86_64 x86_64
    ..............
    

    Redis基础数据类型

    redis中文教程
    http://doc.redisfans.com/index.html
    

    Redis的基本增删改查

    另外一种客户端链接redis验证的方法
    # /usr/local/redis/bin/redis-cli
    

    String实现键值段

    127.0.0.1:6379> auth demon
    OK
    
    设置一个key名称为name,键值为demon的数据
    127.0.0.1:6379> set name demon
    OK
    
    获取key为name的数据
    127.0.0.1:6379> get name
    "demon"
    
    获取redis中所有的键名称(生产中不建议使用)
    127.0.0.1:6379> keys *
    1) "name"
    
    判断redis中的键是否存在(返回1即存在,0为不存在)
    127.0.0.1:6379> exists name
    (integer) 1
    
    修改name键的数据
    127.0.0.1:6379> set name demon_gdy
    OK
    127.0.0.1:6379> get name
    "demon_gdy"
    
    查看数据类型
    type name
    
    删除一个已存在的键
    127.0.0.1:6379> del name
    (integer) 1
    

    Hash实现键值段

    类似于python中的字典嵌套字典的方式(hash)
    
    127.0.0.1:6379> hset car name BMW
    (integer) 1
    127.0.0.1:6379> hset car price 10RMB
    (integer) 1
    
    注意:
    	car是一个键,对应了两个值,分别又是一队键值段,price作为另外一个car中的key,对应了10RMB的值,name同样也是这样,类似于python中的
    	{'car':{'name':'BMW','price':'10RMB'}}
    
    查看car键中的键
    127.0.0.1:6379> hkeys car
    1) "name"
    2) "price"
    
    查看car键中有几个元素
    127.0.0.1:6379> hlen car
    (integer) 2
    
    
    获取数据car键中的数据
    127.0.0.1:6379> hget car name
    "BMW"
    127.0.0.1:6379> hget car price
    "10RMB"
    
    删除car中的key为price对应的值
    127.0.0.1:6379> hdel car price
    (integer) 1
    
    删除car中的所有key,包括car..	
    del car
    

    List实现键值段

    从开头开始添加键值(从左到右)
    127.0.0.1:6379> lpush numbers 1
    (integer) 1
    127.0.0.1:6379> lpush numbers 2
    (integer) 2
    
    从后往前添加键值(从右到左)
    127.0.0.1:6379> rpush numbers 9
    (integer) 3
    127.0.0.1:6379> rpush numbers 10	
    (integer) 4
    
    查看numbers key的长度
    127.0.0.1:6379> llen numbers
    (integer) 4
    
    查看numbers中指定范围的数据
    127.0.0.1:6379> lrange numbers 0 4
    1) "2"
    2) "1"
    3) "9"
    4) "10"
    
    查看列表中对应位置的数据(和python中的list一样,元素的索引从0开始)
    127.0.0.1:6379> lindex numbers 2
    "9
    
    在列表中指定的数据前或后插入数据
    127.0.0.1:6379> linsert numbers before 9 8
    (integer) 5
    
    127.0.0.1:6379> linsert numbers after 10 11
    (integer) 6
    
    	注意:
    	before|after 后面跟的是list中已存在的元素,最后一个是要插入的数据
    
    127.0.0.1:6379> lrange numbers 0 6
    1) "2"
    2) "1"
    3) "8"
    4) "9"
    5) "10"
    6) "11"
    
    numbers中从后删除一个数据
    127.0.0.1:6379> rpop numbers 
    "11"
    
    numbers中从开头删除一个数据
    127.0.0.1:6379> lpop numbers
    "2"
    

    Set实现键值段
    创建一个country的集合,在里面添加如下值
    127.0.0.1:6379> sadd country china
    (integer) 1
    127.0.0.1:6379> sadd country america
    (integer) 1
    127.0.0.1:6379> sadd country canada
    (integer) 1

    创建一个diff_country的集合,在里面添加如下值
    127.0.0.1:6379> sadd diff_country china
    (integer) 1
    127.0.0.1:6379> sadd diff_country japan
    (integer) 1
    127.0.0.1:6379> sadd diff_country england
    (integer) 1
    127.0.0.1:6379> sadd diff_country canada
    (integer) 1
    
    查看country的类型
    127.0.0.1:6379> type country
    set
    
    获取集合中的元素
    127.0.0.1:6379> SMEMBERS country
    1) "america"
    2) "canada"
    3) "china"
    
    127.0.0.1:6379> SMEMBERS diff_country
    1) "japan"
    2) "canada"
    3) "china"
    4) "england"
    
    查看一个元素是否在集合中(返回1为真,0为假)
    127.0.0.1:6379> SISMEMBER country china
    (integer) 1
    
    127.0.0.1:6379> SISMEMBER country chinaaaa
    (integer) 0
    
    集合中做差集(country中有diff_country中没有的元素)
    127.0.0.1:6379> sdiff country diff_country
    1) "america"
    
    集合中做交集(country与diff_country中共有的元素)
    127.0.0.1:6379> SINTER country diff_country
    1) "canada"
    2) "china"
    
    集合中的并集
    127.0.0.1:6379> SUNION country diff_country
    1) "canada"
    2) "china"
    3) "england"
    4) "america"
    5) "japan"
    

    Redis持久化

    Redis 提供了多种不同级别的持久化方式:

    • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
    • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
    • Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
    • 你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

    建议调优参考文档:http://doc.redisfans.com/topic/persistence.html

    redis主从复制,配置一个从服务器非常简单, 只要在配置文件中增加以下的这一行就可以了:
    slaveof 192.168.1.1 6379
    

    Redis集群实现方式

    架构图

    解决方案实例
    https://github.com/CodisLabs/codis
    

    部署Codis

    Codis使用安装文档
    https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md
    
    安装Go运行环境
    # yum install -y gcc glibc gcc-c++ make git
    # cd /usr/local/src
    
    下载golang的源码包
    # wget -c https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
    
    解压golang源码包
    # tar -zxvf go1.8.3.linux-amd64.tar.gz
    
    移动解压目录到/usr/local下
    # mv go /usr/local/
    
    创建GOPATH环境
    # mkdir /usr/local/go/work
    # echo "export GOROOT=/usr/local/go" >> /etc/profile.d/golang.sh
    # echo "export GOPATH=/usr/local/go/work" >> /etc/profile.d/golang.sh
    # echo "PATH=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin" >> /etc/profile.d/golang.sh
    
    重新加载配置文件
    # source /etc/profile.d/etc/profile.d/golang.sh
    
    监测go环境
    # go version
    go version go1.8.3 linux/amd64
    
    下载go所需要的工具包
    # go get -u -d github.com/CodisLabs/codis
    # go get github.com/tools/godep
    
    切换到go的目录下
    # cd $GOPATH/src/github.com/CodisLabs/codis
    
    编译测试codis的安装环境
    # make && make gotest
    
    启动codis-dashboard
    # ./admin/codis-dashboard-admin.sh start
    
    查看日志
    # tail -100 ./log/codis-dashboard.log.2017-06-18
    
    启动codis-proxy
    # ./admin/codis-proxy-admin.sh start
    
    启动codis-server
    # ./admin/codis-server-admin.sh start
    
    启动codis-fe
    # ./admin/codis-fe-admin.sh start
    

    部署zookeeper

    参考文档
    https://www.unixhot.com/article/32
    
    下载zookeeper的源码包
    # cd /usr/local/src && wget -c http://apache.claz.org/zookeeper/stable/zookeeper-3.4.10.tar.gz
    
    解压zookeeper的源码包
    # tar -zxvf zookeeper-3.4.10.tar.gz
    
    移动zookeeper的目录到/usr/local下
    # mv zookeeper-3.4.10 /usr/local/
    
    最佳实现方式软连接
    # ln -sv /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper
    
    重命名配置文件
    # cd /usr/local/zookeeper/conf/
    # cp zoo_sample.cfg zoo.cfg
    
    编辑zookeeper的配置文件
    # vim zoo.cfg
    
    修改配置如下,在文件的尾部添加后四行内容
    dataDir=/data/zk1
    clientPort=2181
    server.1=192.168.1.5:3181:4181
    server.2=192.168.1.5:3182:4182
    server.3=192.168.1.5:3183:4183
    
    复制三份配置文件
    # cp zoo.cfg zk1.cfg
    # cp zoo.cfg zk2.cfg
    # cp zoo.cfg zk3.cfg
    
    修改配置文件中的配置
    # sed -i 's/zk1/zk2/g' zk2.cfg
    # sed -i 's/2181/2182/g' zk2.cfg
    # sed -i 's/zk1/zk3/g' zk3.cfg
    # sed -i 's/2181/2183/g' zk3.cfg
    
    
    zookeeper伪集群实现	
    	
    创建三个目录用来存放zookeeper数据
    # mkdir -p /data/{zk1,zk2,zk3}
    
    写入伪数据
    # echo "1" >/data/zk1/myid
    # echo "2" >/data/zk2/myid
    # echo "3" >/data/zk3/myid
    
    启动zookeeper
    # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk1.cfg
    # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk2.cfg
    # /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk3.cfg
    
    查看Zookeeper角色
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/conf/zk1.cfg
    Mode: follower
    
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk2.cfg
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/conf/zk2.cfg
    Mode: leader
    
    # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/conf/zk3.cfg
    Mode: follower
    
    	注意:
    		如果查看角色中出现报错,尝试更改端口号,修改zk*.cfg的配置文件,然后修改端口在尝试重启服务
    		
    
    连接Zookeeper
    # /usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.5:2183
    

    zookeeper的最新稳定版有些变化,还在调试ing..未完待续...

  • 相关阅读:
    从多渠道打包与友盟统计有这一篇就够了
    多渠道打包
    studio构建错误Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:5-79 dupli
    ADB命令与monkey
    正则表达式和文本挖掘(Text Mining)
    一步一步教你使用Git
    Android常见开源解决方案
    Android Intent到底能做些什么
    支付宝集成
    Theano 学习三 conv2d
  • 原文地址:https://www.cnblogs.com/demon89/p/redis.html
Copyright © 2011-2022 走看看