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