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..未完待续...

原文地址:https://www.cnblogs.com/demon89/p/redis.html