memcached和redis对比
memcached:
不支持持久化
纯set get性能好
支持数据类型单一
集群(依靠magent:不好用)
没有验证
存放session性能好
redis:
持久化(可将数据存储到硬盘或sql中)
纯set get性能比memcached差些
支持多种数据类型
集群
基础验证
存放购物车(登录前放cookie,登录后写入redis)
解决方案:缓存sql,redis死了,sql会忙死
程序上写两份
定时预写热门数据到热备redis
SSDB:以levelDB开发,用于非常大数据量存储,实现热数据内存,冷数据硬盘
Hbase:集群,支持更大数据量
redis安装
make PREFIX=/usr/local/redis:指定一个目录,不然会在当前目录下
cp utils/redis_init_script /etc/init.d/redis:启动脚本
cp redis.conf /etc/redis/redis.conf
vim redis.conf
daemonize yes #后台启动
pid
port
tcp-backlog 511 #/proc/sys/net/core/somaxconn小会用这个文件值,可以改这个文件为512,刚511生效
bind 10.0.0.11 #指定监听IP
启动脚本里$CLIEXEC -h 10.0.0.11 -a passwd,不然会报错
logfile "/.log" #指定日志
databases 16 #指定库个数,各库没有太好的隔离
dir /var/lib/redis_6379 #持久化储存文件的位置
requirepass 123 #设置密码
vm.overcommit_memory = 0:默认为0表示低内存时直接返回错误,建议为1不报错
echo never >/sys/kernel/mm/transparent_hugepage/enabled:禁用大内存页
redis命令
redis-cli -h ip -p 6379:连接
auth passwd:登录
数据类型:字符串
set name 123:设置key为name值为123,set会把key数据类型变为字符串
set可以把其它类型转换成字符串
get name:查看name这个key
keys *:查看所有key,!!生产不要用
exists name:判断name这个key是否存在,返回1为存在
del name:删除name这个key
type name:查看key的数据类型
mset:一次设置多个key
mget:一次获取多个key
INCR name:把name的值加1
INCRBY name 2:把name的值加n
DECR name::把name的值减1
DECRBY name 2:把name的值减n
ETRLEN name:获取name的长度
数据类型:hash
HSET car name bmw:设置hash-key名为car,值为name对应bmw
HSET car price 20:设置hash-key名为car,值为price对应20
HGETALL car:查看car的所有值
hget car name:查看key名car里name的值
hdel car name:删除car里name,没法直接删除car这个key
hlen car:查询car里有几个元素
hkeys car:显示car里的元素名
数据类型:list
lpush a 1:设置叫a的key,从左加个值加1
rpush a b:在叫a的key里,从右加个值加b
llen a:计算a里有几个值
lrange a 0 -1:显示a里的所有值
lpop a:从左删除一个值,值没了key就没了
数据类型:set集合
sadd a 1:设置集合
sadd a 2
sadd b 1
sadd a 3
smembers a:查看集合中的值
sismember a 5:判断a集合中有5的值么,返回1有,0没有
sdiff a b:查询a和b的差集
sinter a b:查询a和b的交集
sunion a b:查询a和b的并集
redis中文网站:www.redis.cn
百兆以上的key如果要删除可能redis会停顿,用脚本慢慢删除元素
redis持久化:最好主上不开,在从上开启持久化
RDB和AOF:生产时可同时使用,优先使用AOF恢复数据
RDB:备份,数据量大时恢复快
提起一个子进程会单独申请内存空间复制到内存空间再保存到硬盘临时文件,然后替换文件,vm.overcommit_memory = 1,可必免写入失败
redis通过系统调用fork(),可实现copy-on-write(写时复制,需文件系统支持)
缺点:数据量大可能备份时redis停顿和占用IO资源
配置文件:
save 900 1 #900秒有一个key改变就写入硬盘
save 300 10 #300秒有十个key改变就写入硬盘
save 60 10000 #60秒有一万个key改变就写入硬盘
dbfilename dump.rdb #定义rdb文件名,添加端口名
dir ./ #rdb存放位置,建议改个位置
rdbcompression yes #rdb文件压缩,默认打开
AOF:默认每秒把所有写操作追加到一个文件,要用时执行一编
会优化存储数据,不保存重复写操作,数据文件小
数据更完整
redis-check-aof –fix:aof修复命令
缺点:体积大于RDB,速度慢于RDB
配置文件:
appendonly no #默认关闭aof
appendfilename "appendonly.aof" #修改文件名
主从复制
slaveof 192.168.1.1 6379 #设置成一个从,指定masterIP和PORT
slave-read-only yes #从默认只读,做为主需要设置为no
masterauth passwd #主库密码
集群
客户端分片(程序开发)
优点:可控、简单
缺点:无法扩展、无法自动迁移
代理分片:
twemproxy:可代理redis和memcached,无法自动迁移、性能单台、没有后端服务器状态检查
redis cluster:
案例少
主从自动切换、迁移(迁移可能key会丢)
无中心
需要专用的客户端
codis:https://github.com/CodisLabs/codis,有些命令不支持
案例多、迁移工具方便迁移、
依赖zookeeper或etcd
codis-proxy:无状态(只代理,不存任何数据),php只能连接一台,可在上一层做4层代理
dashboard:codis-config的web端
codis-config:数据迁移,运行状态
codis-redis-group:基于rieds二次开发,可只有主,一主可多从
zookeeper:记录key对应存放在哪个codis-redis,可3个节点以上集群,监测codis-proxy状态
codis安装
安装依赖包和go环境
yum install =y gcc glibc gcc-c++ make git
wget go.tar.gz 下载go源码包
tar xf go.tzr.gz
mv go /usr/local/go
下载codis源码并编译
cd /usr/local/go/work
go get -u -d github.com/codislabs/codis
go get github.com/tool/godep
cd src/github.com/codislabs/codis
make
安装zookeeper集群(至少3台,建议5台)
yum install -y java
wget zookeeper.tar.zg
mkdir /data/zk1 /data/zk2 /data/zk3:创建zookeeper数据目录
echo 1 >/data/zk1/myid:对应创建3个ID,1、2、3
tar xf zookeeper.tar.gz
mv zookeeper /usr/llocal/zookeeper
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir:数据目录
dataLogDir:日志目录
clientPort:客户端连接端口
tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit:Zookeeper的Leader 接受客户端(Follower)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:表示 Leader 与 Follower 之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。
server.A=B:C:D:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
cp zoo.cfg zoo2.cfg
cp zoo.cfg zoo3.cfg:修改数据目录,端口,log
/usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg:启动3个实例
/usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zoo.cfg:查看状态Leader为主
/usr/local/zookeeper/bin/zkCli.sh -server 192.168.56.11:2181;连接实例,help查看帮助
codis配置文件
cd work/src/github.com/codislabs/codis
vim config.ini
zk=ip:port,ip:port,ip:port
product=name #项目名,会在zk里创建db_name
dashboard_addr=ip:port #设置代理连接端口
password=123 #设置代理连接密码
proxy_id=name_1 #每个proxy_id必须唯一
config.ini需要各提供多个给dashboard和codis-proxy使用
启动dashboard后台运行
nohup ./bin/codis-config dashboard --addr ip:port --http-log /var/log/codis-dashboard-http >/var/log/codis-dashboard &
日志报错:
dashboard already exists #原因非正常关闭
连接zp实例删除dashboard
rmr /zk/codis/db_name/dashboard
web访问Ip:port可查看状态
槽位初始化:./bin/codis-config slot init(1024个槽位)
配置redis
cp /源码目录/extern/redis/redis.conf /etc/redis
vim redis_6379.conf
maxmemory 1024m #必须最大内存
./bin/codis-server /etc/redis_6379.conf
添加codis-group
codis-config server add 1 ip:port master|slave
添加组ID为1的主或从(组ID必须为1以上)
可以在dashboard网页上删除添加
连接上redis info看一下主从是否正常
手动分配槽位
codis-config slot range-set 0 511 1 online
codis-config slot range-set 512 1024 2 online
设置group1槽位0-511,online设置在线状态
启动codis-proxy
nohup codis-proxy -c codis/config-node1.conf -L /var/log/codis-proxy1 --log-level=error --cpu=1 --addr=ip:port --http-addr=ip:port >/var/log/codis-proxy1 &
-c:指定配置文件
-L:指定log文件
--log:指定日志级别(默认info)
--addr:监听proxy的ip和port
--cpu:指定使用CPU
--http-addr:dashboard上监控proxy的ip和port
codis迁移
dashboard上迁移操作:Migrate Slot(s);老版本bug直接点OK会把槽位0迁移到0group,迁移不成功,永远无法完成
redis到codis迁移
使用codis里的redis-port工具迁移
codis-HA:自动切换主从
默认为手动切换主从(建议使用)
memcached:
不支持持久化
纯set get性能好
支持数据类型单一
集群(依靠magent:不好用)
没有验证
存放session性能好
redis:
持久化(可将数据存储到硬盘或sql中)
纯set get性能比memcached差些
支持多种数据类型
集群
基础验证
存放购物车(登录前放cookie,登录后写入redis)
解决方案:缓存sql,redis死了,sql会忙死
程序上写两份
定时预写热门数据到热备redis
SSDB:以levelDB开发,用于非常大数据量存储,实现热数据内存,冷数据硬盘
Hbase:集群,支持更大数据量
redis安装
make PREFIX=/usr/local/redis:指定一个目录,不然会在当前目录下
cp utils/redis_init_script /etc/init.d/redis:启动脚本
cp redis.conf /etc/redis/redis.conf
vim redis.conf
daemonize yes #后台启动
pid
port
tcp-backlog 511 #/proc/sys/net/core/somaxconn小会用这个文件值,可以改这个文件为512,刚511生效
bind 10.0.0.11 #指定监听IP
启动脚本里$CLIEXEC -h 10.0.0.11 -a passwd,不然会报错
logfile "/.log" #指定日志
databases 16 #指定库个数,各库没有太好的隔离
dir /var/lib/redis_6379 #持久化储存文件的位置
requirepass 123 #设置密码
vm.overcommit_memory = 0:默认为0表示低内存时直接返回错误,建议为1不报错
echo never >/sys/kernel/mm/transparent_hugepage/enabled:禁用大内存页
redis命令
redis-cli -h ip -p 6379:连接
auth passwd:登录
数据类型:字符串
set name 123:设置key为name值为123,set会把key数据类型变为字符串
set可以把其它类型转换成字符串
get name:查看name这个key
keys *:查看所有key,!!生产不要用
exists name:判断name这个key是否存在,返回1为存在
del name:删除name这个key
type name:查看key的数据类型
mset:一次设置多个key
mget:一次获取多个key
INCR name:把name的值加1
INCRBY name 2:把name的值加n
DECR name::把name的值减1
DECRBY name 2:把name的值减n
ETRLEN name:获取name的长度
数据类型:hash
HSET car name bmw:设置hash-key名为car,值为name对应bmw
HSET car price 20:设置hash-key名为car,值为price对应20
HGETALL car:查看car的所有值
hget car name:查看key名car里name的值
hdel car name:删除car里name,没法直接删除car这个key
hlen car:查询car里有几个元素
hkeys car:显示car里的元素名
数据类型:list
lpush a 1:设置叫a的key,从左加个值加1
rpush a b:在叫a的key里,从右加个值加b
llen a:计算a里有几个值
lrange a 0 -1:显示a里的所有值
lpop a:从左删除一个值,值没了key就没了
数据类型:set集合
sadd a 1:设置集合
sadd a 2
sadd b 1
sadd a 3
smembers a:查看集合中的值
sismember a 5:判断a集合中有5的值么,返回1有,0没有
sdiff a b:查询a和b的差集
sinter a b:查询a和b的交集
sunion a b:查询a和b的并集
redis中文网站:www.redis.cn
百兆以上的key如果要删除可能redis会停顿,用脚本慢慢删除元素
redis持久化:最好主上不开,在从上开启持久化
RDB和AOF:生产时可同时使用,优先使用AOF恢复数据
RDB:备份,数据量大时恢复快
提起一个子进程会单独申请内存空间复制到内存空间再保存到硬盘临时文件,然后替换文件,vm.overcommit_memory = 1,可必免写入失败
redis通过系统调用fork(),可实现copy-on-write(写时复制,需文件系统支持)
缺点:数据量大可能备份时redis停顿和占用IO资源
配置文件:
save 900 1 #900秒有一个key改变就写入硬盘
save 300 10 #300秒有十个key改变就写入硬盘
save 60 10000 #60秒有一万个key改变就写入硬盘
dbfilename dump.rdb #定义rdb文件名,添加端口名
dir ./ #rdb存放位置,建议改个位置
rdbcompression yes #rdb文件压缩,默认打开
AOF:默认每秒把所有写操作追加到一个文件,要用时执行一编
会优化存储数据,不保存重复写操作,数据文件小
数据更完整
redis-check-aof –fix:aof修复命令
缺点:体积大于RDB,速度慢于RDB
配置文件:
appendonly no #默认关闭aof
appendfilename "appendonly.aof" #修改文件名
主从复制
slaveof 192.168.1.1 6379 #设置成一个从,指定masterIP和PORT
slave-read-only yes #从默认只读,做为主需要设置为no
masterauth passwd #主库密码
集群
客户端分片(程序开发)
优点:可控、简单
缺点:无法扩展、无法自动迁移
代理分片:
twemproxy:可代理redis和memcached,无法自动迁移、性能单台、没有后端服务器状态检查
redis cluster:
案例少
主从自动切换、迁移(迁移可能key会丢)
无中心
需要专用的客户端
codis:https://github.com/CodisLabs/codis,有些命令不支持
案例多、迁移工具方便迁移、
依赖zookeeper或etcd
codis-proxy:无状态(只代理,不存任何数据),php只能连接一台,可在上一层做4层代理
dashboard:codis-config的web端
codis-config:数据迁移,运行状态
codis-redis-group:基于rieds二次开发,可只有主,一主可多从
zookeeper:记录key对应存放在哪个codis-redis,可3个节点以上集群,监测codis-proxy状态
codis安装
安装依赖包和go环境
yum install =y gcc glibc gcc-c++ make git
wget go.tar.gz 下载go源码包
tar xf go.tzr.gz
mv go /usr/local/go
下载codis源码并编译
cd /usr/local/go/work
go get -u -d github.com/codislabs/codis
go get github.com/tool/godep
cd src/github.com/codislabs/codis
make
安装zookeeper集群(至少3台,建议5台)
yum install -y java
wget zookeeper.tar.zg
mkdir /data/zk1 /data/zk2 /data/zk3:创建zookeeper数据目录
echo 1 >/data/zk1/myid:对应创建3个ID,1、2、3
tar xf zookeeper.tar.gz
mv zookeeper /usr/llocal/zookeeper
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir:数据目录
dataLogDir:日志目录
clientPort:客户端连接端口
tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit:Zookeeper的Leader 接受客户端(Follower)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:表示 Leader 与 Follower 之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。
server.A=B:C:D:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
cp zoo.cfg zoo2.cfg
cp zoo.cfg zoo3.cfg:修改数据目录,端口,log
/usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg:启动3个实例
/usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zoo.cfg:查看状态Leader为主
/usr/local/zookeeper/bin/zkCli.sh -server 192.168.56.11:2181;连接实例,help查看帮助
codis配置文件
cd work/src/github.com/codislabs/codis
vim config.ini
zk=ip:port,ip:port,ip:port
product=name #项目名,会在zk里创建db_name
dashboard_addr=ip:port #设置代理连接端口
password=123 #设置代理连接密码
proxy_id=name_1 #每个proxy_id必须唯一
config.ini需要各提供多个给dashboard和codis-proxy使用
启动dashboard后台运行
nohup ./bin/codis-config dashboard --addr ip:port --http-log /var/log/codis-dashboard-http >/var/log/codis-dashboard &
日志报错:
dashboard already exists #原因非正常关闭
连接zp实例删除dashboard
rmr /zk/codis/db_name/dashboard
web访问Ip:port可查看状态
槽位初始化:./bin/codis-config slot init(1024个槽位)
配置redis
cp /源码目录/extern/redis/redis.conf /etc/redis
vim redis_6379.conf
maxmemory 1024m #必须最大内存
./bin/codis-server /etc/redis_6379.conf
添加codis-group
codis-config server add 1 ip:port master|slave
添加组ID为1的主或从(组ID必须为1以上)
可以在dashboard网页上删除添加
连接上redis info看一下主从是否正常
手动分配槽位
codis-config slot range-set 0 511 1 online
codis-config slot range-set 512 1024 2 online
设置group1槽位0-511,online设置在线状态
启动codis-proxy
nohup codis-proxy -c codis/config-node1.conf -L /var/log/codis-proxy1 --log-level=error --cpu=1 --addr=ip:port --http-addr=ip:port >/var/log/codis-proxy1 &
-c:指定配置文件
-L:指定log文件
--log:指定日志级别(默认info)
--addr:监听proxy的ip和port
--cpu:指定使用CPU
--http-addr:dashboard上监控proxy的ip和port
codis迁移
dashboard上迁移操作:Migrate Slot(s);老版本bug直接点OK会把槽位0迁移到0group,迁移不成功,永远无法完成
redis到codis迁移
使用codis里的redis-port工具迁移
codis-HA:自动切换主从
默认为手动切换主从(建议使用)