Redis介绍,安装使用及集群介绍
1.Redis概述
2.Redis安装、配置(主从复制)
3.Redis集群
4.Redis Java开发
>>>>>>>>>>>>>>>>>>>>>>>>>>>一.Redis 概述
1.本质:Redis全称Remote Dictionary Server,是类似于Memcache的Key-Value内存数据库;
2.特点:
(1)它是一个高性能Key-Value存储系统,具有极高的读写性能,每秒可以处理超过10万次读写操作,超过 100K+/秒的读写频率
注:Redis的读写性能在100,000 ops/s左右,时延一般为10~70微妙左右;而HBase的单机读写性能一般不会超过1,000ops/s,时延则在1~5毫秒之间
(2)和Memcached相比,它支持更丰富的数据结构,包括string(字符串)、list(链表)、set(集合)、zset(sorted set--有序集合)和hash(哈希类型)
(3)Redis提供了数据持久化机制,可以定期异步把数据flush到硬盘,在某些场景下,你完全可以把它当做非关系型数据库来使用;
(4)支持消息的发布/订阅,从而让你在构建高性能消息队列系统时多了另一种选择。
(5)同样作为内存型数据库,(1) 对物理内存存储要求很高 (2)处理的数据量要远小于HBase与MongoDB (3) 目标是做高效的分布式缓存。数据一般不实时落地。也不适合做存储和分析(4)当然和数据库的功能相差甚远3.应用场景:
(1) Redis很适合用来做缓存,做加强版的Memached
(2) 在一些“读写分离”的场景下作为“读库”来用,常用的比如,用来存放Hadoop或Spark的分析结果。
(3) 因为支持对list的丰富操作,可以通过使用List做FIFO双向列表,实现轻量级的高性能消息队列服务器
(4) 用它的Set做高性能的tag系统
>>>>>>>>>>>>>>>>>>>>>>>>>>>二.Redis安装、配置(主从复制)
Redis 单机
参考:吴水成老师的<<Redis的安装与使用.pdf>> 附件
实践:结合自身的实践
1.环境配置
(1)机器配置:主机名(edu-redis)
(2)IP:192.168.1.122
(3)系统: CentOS 6.6
(4)Redis版本 : redis-3.0.6.tar.gz (考虑到 Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,而且很快就出正式版)
(5)安装目录:/usr/local/redis
(6)用户: root
2.Redis安装
#配置主机名
hostname "edu-redis-01" #设置主机名为 edu-redis-01
vi /etc/sysconfig/network #编辑配置文件
HOSTNAME=edu-redis-01
vi /etc/hosts #编辑配置文件
127.0.0.1 edu-redis-01 localhost
:wq! #保存退出
#编译和安装所需的包
yum install gcc tcl
#下载安装redis-3.0.6
cd /usr/local/src
wget http://download.redis.io/releases/redis-3.0.6.tar.gz;
tar -zxvf redis-3.0.6.tar.gz;
mv redis-3.0.6 redis3.0
cd redis3.0
以下一系列操作:按照<<Redis的安装与使用.pdf>>即可
#一些文件介绍
(1)redis-benchmark 性能测试工具
(2)redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复)
(3)redis-check-dump 快照文件检测工具,效果类上
(4)redis-cli 客户端
(5)redis-server 服务端
3.Redis配置
vi /usr/servers/redis-2.8.19/redis.conf
1.基本设置
#端口设置,默认6379
port 6379
#日志文件,默认/dev/null
logfile ""
2.Redis内存 设置
内存大小对应关系
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#设置Redis占用100mb的大小
maxmemory 100mb
#如果内存满了就需要按照如相应算法进行删除过期的/最老的
#volatile-lru 根据LRU算法移除设置了过期的key
#allkeys-lru 根据LRU算法移除任何key(包含那些未设置过期时间的key)
#volatile-random/allkeys->random 使用随机算法而不是LRU进行删除
#volatile-ttl 根据Time-To-Live移除即将过期的key
#noeviction 永不过期,而是报错
maxmemory-policy volatile-lru
#Redis并不是真正的LRU/TTL,而是基于采样进行移除的,即如采样10个数据移除其中最老的/即将过期的
maxmemory-samples 10
Memcached是真正的LRU,此处要根据实际情况设置缓存策略
如缓存用户数据时可能带上了过期时间,此时采用volatile-lru即可;
假设我们的数据未设置过期时间,此时可以考虑使用allkeys-lru/allkeys->random;
假设我们的数据不允许从内存删除那就使用noeviction。
内存大小尽量在系统内存的60%~80%之间,因为如客户端、主从时复制时都需要缓存区的,这些也是耗费系统内存的。
Redis本身是单线程的,因此我们可以设置每个实例在6-8GB之间,通过启动更多的实例提高吞吐量。如128GB的我们可以开启8GB * 10个实例,充分利用多核CPU。
4.Redis主从 设置
>>结合学习:13-redis主从复制.wmv
实际项目时,为了提高吞吐量,我们使用主从策略
(1)主从备份:可以通过主从机制,在叶子节点开启持久化方式防止数据丢失,也可在主机宕机时切换
(2)读写分离:数据写到主Redis,读的时候从从Redis上读,这样可以通过挂载更多的从来提高吞吐量
(3)任务分离:分单备份和计算这些操作
Redis集群的几种形式
(1)一主多从 (2)多台承接主从,第二种的好处是,master宕机后可直接切到slave1
主从通信过程
# vi /usr/servers/redis-2.8.19/redis.conf
#在配置文件中挂载主从,不推荐这种方式,我们实际应用时Redis可能是会宕机的
slaveof masterIP masterPort
#从是否只读,默认yes
slave-read-only yes
#当从失去与主的连接或者复制正在进行时,从是响应客户端(可能返回过期的数据)还是返回“SYNC with master in progress”错误,默认yes响应客户端
slave-serve-stale-data yes
#从库按照默认10s的周期向主库发送PING测试连通性
repl-ping-slave-period 10
#设置复制超时时间(SYNC期间批量I/O传输、PING的超时时间),确保此值大于repl-ping-slave-period
#repl-timeout 60
#当从断开与主的连接时的复制缓存区,仅当第一个从断开时创建一个,缓存区越大从断开的时间可以持续越长
# repl-backlog-size 1mb
#当从与主断开持续多久时清空复制缓存区,此时从就需要全量复制了,如果设置为0将永不清空
# repl-backlog-ttl 3600
#slave客户端缓存区,如果缓存区超过256mb将直接断开与从的连接,如果持续60秒超过64mb也会断开与从的连接
client-output-buffer-limit slave 256mb 64mb 60
此处需要根据实际情况设置client-output-buffer-limit slave和 repl-backlog-size;比如如果网络环境不好,从与主经常断开,而每次设置的数据都特别大而且速度特别快(大量设置html片段)那么就需要加大repl-backlog-size。
>>>>>单机:主从示例(针对性的设置多台机器,IP不同)
cd /usr/servers/redis-2.8.19
cp redis.conf redis_6660.conf
cp redis.conf redis_6661.conf
vi redis_6660.conf
vi redis_6661.conf
将端口分别改为port 6660和port 6661,然后启动
nohup /usr/servers/redis-2.8.19/src/redis-server /usr/servers/redis-2.8.19/redis_6660.conf &
nohup /usr/servers/redis-2.8.19/src/redis-server /usr/servers/redis-2.8.19/redis_6661.conf &
查看是否启动
ps aux | grep redis
进入从客户端,挂主
/usr/servers/redis-2.8.19/src/redis-cli -p 6661
127.0.0.1:6661> slaveof 127.0.0.1 6660
OK
127.0.0.1:6661> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6660
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:57
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
进入主
/usr/servers/redis-2.8.19/src/redis-cli -p 6660
127.0.0.1:6660> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6661,state=online,offset=85,lag=1
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84
127.0.0.1:6660> set i 1
OK
进入从
/usr/servers/redis-2.8.19/src/redis-cli -p 6661
127.0.0.1:6661> get i
"1"
此时可以看到主从挂载成功,可以进行主从复制了。使用slaveof no one断开主从。
5.Redis持久化
>>结合学习:redis入门到精通视频之11-rdb快照持久化.wmv/12-aof日志持久化.wmv
Redis虽然不适合做持久化存储,但是为了防止数据丢失有时需要进行持久化存储
做法:可以挂载一个从(叶子节点)只进行持久化存储工作,这样假设其他服务器挂了,我们可以通过这个节点进行数据恢复。
Redis持久化有RDB快照模式和AOF追加模式,根据自己需求进行选择。
4.1 RDB持久化
#格式save seconds changes 即N秒变更N次则保存,从如下默认配置可以看到丢失数据的周期很长,通过save “” 配置可以完全禁用此持久化
save 900 1
save 300 10
save 60 10000
#RDB是否进行压缩,压缩耗CPU但是可以减少存储大小
rdbcompression yes
#RDB保存的位置,默认当前位置
dir ./
#RDB保存的数据库名称
dbfilename dump.rdb
#不使用AOF模式,即RDB模式
appendonly no
可以通过set一个数据,然后很快的kill掉redis进程然后再启动会发现数据丢失了。
4.2 AOF持久化
AOF(append only file)即文件追加模式,即把每一个用户操作的命令保存下来,这样就会存在好多重复的命令导致恢复时间过长,那么可以通过相应的配置定期进行AOF重写来减少重复。
#开启AOF
appendonly yes
#AOF保存的位置,默认当前位置
dir ./
#AOF保存的数据库名称
appendfilename appendonly.aof
#持久化策略,默认每秒fsync一次,也可以选择always即每次操作都进行持久化,或者no表示不进行持久化而是借助操作系统的同步将缓存区数据写到磁盘
appendfsync everysec
#AOF重写策略(同时满足如下两个策略进行重写)
#当AOF文件大小占到初始文件大小的多少百分比时进行重写
auto-aof-rewrite-percentage 100
#触发重写的最小文件大小
auto-aof-rewrite-min-size 64mb
#为减少磁盘操作,暂缓重写阶段的磁盘同步
no-appendfsync-on-rewrite no
此处的appendfsync everysec 可以认为是RDB和AOF的一个折中方案。
#当bgsave出错时停止写(MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.),遇到该错误可以暂时改为no,当写成功后再改回yes
stop-writes-on-bgsave-error yes
更多Redis持久化请参考http://redis.readthedocs.org/en/latest/topic/persistence.html。
在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
aof重写是指什么? (set a=1 set a=2 set a=3…最后a=100 à set a =100)
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.以解决 aof日志过大的问题.
问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
========需要补充进去==========
11-12.Redis持久化配置
Redis的持久化有2种方式
1. 快照: 将内存以
2. 日志
rdb的工作原理:
每隔N分钟或N次写操作后,从内存dump数据形成rdb文件,压缩放在备份目录
注:红色部分可通过参数来配置
Rdb快照的配置选项
Vi /etc/local/redis/...conf
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径
Aof 的配置
工作原理:见ppt
appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快,
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
15.aof恢复与rdb服务器间迁移
5.Redis动态调整配置
获取maxmemory(10mb)
127.0.0.1:6660> config get maxmemory
1) "maxmemory"
2) "10485760"
设置新的maxmemory(20mb)
127.0.0.1:6660> config set maxmemory 20971520
OK
但是此时重启redis后该配置会丢失,可以执行如下命令重写配置文件
127.0.0.1:6660> config rewrite
OK
注意:此时所以配置包括主从配置都会重写。
6.设置密码
在配置文件设置password
操作如下:
# vi ../conf/6379.conf
搜索passwd,设置:requirepass 123456
[root@edu-redis-01 bin]# redis-cli
127.0.0.1:6379> get name
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get name
"z"
127.0.0.1:6379>
对于从服务器也需要设置密码才能同步和查看到
masterauth 123456
7.redis 运维常用命令
7.1基本命令
#显示服务器时间 , 时间戳(秒), 微秒数
redis 127.0.0.1:6380> time
1) "1375270361"
2) "504511"
#当前数据库的key的数量
redis 127.0.0.1:6380> dbsize
(integer) 2
#选择数据库
redis 127.0.0.1:6380> select 2
OK
redis 127.0.0.1:6380[2]> dbsize
(integer) 0
redis 127.0.0.1:6380[2]>
#后台进程重写AOF
BGREWRITEAOF
# 后台保存rdb快照
BGSAVE
#保存rdb快照
SAVE
#上次保存时间
LASTSAVE
#把当前实例设为master的slave
Slaveof master-Host port
#清空所有库所有键
Flushall
#清空当前库所有键
Flushdb
#关闭服务器
Showdown [save/nosave]
注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
Slowlog 显示慢查询
注:多慢才叫慢: 由slowlog-log-slower-than 10000 ,来指定,(单位是微秒)
服务器储存多少条慢查询的记录?
答: 由 slowlog-max-len 128 ,来做限制
Info [Replication/CPU/Memory..]
查看redis服务器的信息
Config get 配置项
Config set 配置项 值 (特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)
Redis运维时需要注意的参数
1: 内存
# Memory
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.
2: 主从复制
# Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
# Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4: fork耗时
#Status
latest_fork_usec:936 上次导出rdb快照,持久化花费微秒
注意: 如果某实例有10G内容,导出需要2分钟,
每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.
5: 慢日志
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 获取慢日志
运行时更改master-slave
修改一台slave(设为A)为new master
1) 命令该服务不做其他redis服务的slave
命令: slaveof no one
2) 修改其readonly为yes
其他的slave再指向new master A
1) 命令该服务为new master A的slave
命令格式 slaveof IP port
8.监控工具 sentinel
Sentinel不断与master通信,获取master的slave信息.
监听master与slave的状态
如果某slave失效,直接通知master去除该slave.
如果master失效,,是按照slave优先级(可配置),选取1个slave做 new master
,把其他slave--> new master
疑问: sentinel与master通信,如果某次因为master IO操作频繁,导致超时,
此时,认为master失效,很武断.
解决: sentnel允许多个实例看守1个master, 当N台(N可设置)sentinel都认为master失效,才正式失效.
Sentinel选项配置
port 26379 # 端口
sentinel monitor mymaster 127.0.0.1 63792 ,
给主机起的名字(不重即可),
当2个sentinel实例都认为master失效时,正式失效
sentinel down-after-milliseconds mymaster 30000 多少毫秒后连接不到master认为断开
sentinel can-failover mymaster yes #是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./
sentinel parallel-syncs mymaster 1 , 一次性修改几个slave指向新的new master.
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在重新配置new master,new slave过程,可以触发的脚本
9.Redis 中的事务
Redis支持简单的事务
Redis与 mysql事务的对比
Mysql
Redis
开启
start transaction
muitl
语句
普通sql
普通命令
失败
rollback 回滚
discard 取消
成功
commit
exec
注: rollback与discard 的区别
如果已经成功执行了2条语句, 第3条语句出错.
Rollback后,前2条的语句影响消失.
Discard只是结束本次事务,前2条语句造成的影响仍然还在
注:
在mutil后面的语句中, 语句出错可能有2种情况
1: 语法就有问题,
这种,exec时,报错, 所有语句得不到执行
2: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象
Exec之后,会执行正确的语句,并跳过有不适当的语句.
(如果zadd操作list这种事怎么避免? 这一点,由程序员负责)
思考:
我正在买票
Ticket -1 , money -100
而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.
我该如何观察这种情景,并不再提交
悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,
--有没有人更改ticket的值就可以了 [乐观锁]
Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.
具体的命令---- watch命令
例:
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"
watch key1 key2 ... keyN
作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消
unwatch
作用: 取消所有watch监听
10.redis消息发布与订阅
使用办法:
订阅端: Subscribe 频道名称
发布端: publish 频道名称 发布内容
客户端例子:
redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"
服务端例子:
redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1
监听多个发布
Psubscribe new* : 监听所有的new开头的发布
以下在2.8版本以后才支持
Pubsub ..
11.冷数据写入MySQL
案例:微博,主动显示部分,当你下拉时去库内获取数据;
例如:微博超过1000条时,redis存最新的1000条,其余的存在MYSQL里
要点:
1. 把最新的20条微博放到一个有序集合内,供粉丝获取
2. 把最新的1000条微博放到一个链表内,自己获取,把1000后的旧微博,放到mysql内
思路:1000条存在global:store
1. 1只要获取最新20条即可
$r = connredis();
/****/
$r->hmset('post:postid:'.$postid,array('userid'=>$user['userid'],'username'=>$user['username'],
'time'=>$user['time'],'content'=>$user['content'])); -- 一次性设置key对象多个属性值
//把自己发的微博维护一个有序集合里,只需要20个,供粉丝取用
$r->zadd('starpost:userid:'.$user['userid'],$postid,$postid) -- 设置有序集合
if($r->zcard('starpost:userid:'.$user['userid'])>20){ --返回元素个数
$r->zremrangebyrank('starpost:userid'.$user['userid'],0,0); -->按排名删除最旧的那个
}
2. 2的方案如下:
$r->lpush('mypost:userid:'.$user['userid'],$postid); --在链表内从左边放入微博id
if($r->llen('mypost:userid:'.$user['userid'])>1000){ --计算链表的长度,若大于1000
$r->rpoplpush('mypost:userid'.$user['userid'],'global:store');--从前者右边取出,放入到后者的左边
}
查看globle:store所有: lrange global:store 0 -1
查看globle:store最右边: lrange global:store -1 -1
定时任务从global:store内取1000条
新建表:
$sql = 'insert into post(postid,userid,username,time,content) values';
$i=0;
while($r->llent('globle:store')&&$i++<1000){ -- 判断链表的长度
$postid = $r->rpop('globle:store'); -- 删除最右边的参数,并返回
$post = $r->hmget('post:postid:'.$postid,arr('userid','username','time','content')); -- 获取多个参数
$sql = --作者在这里是拼接,一次插入多条
}
if($i=0){}
连接数据库,把就微博写入数据库
设置定时任务执行
12.高速写入测试
微博:通过定时脚本,告诉写入
1、做压力测试的工具:ab
2、性能的监控工具:nmon
查看下linux主机上的ulimit -n 的数据,没有改动过的是1024,最好要改的大一点。这个是linux下最大线程数,如果过小的话无法进行大并量的测试。
ab经行压力测试时的脚本我用的形式为:
1.(get方式)./ab -n 1000 -c 1000 -k http://localhost/hello.php
2.(post方式./ab -n 2500 -c 2500 -k -p postfile http://localhost/hello.php
[1]参数n为请求的次数
[2]c为一次请求的并发次数
[3]-k为keep_alive,一般出现链接被重置的错误时最好带上-k的参数。
还有好多参数,可以在ab--help中看下(这个是超级秘籍)。
crontab -e 设置定时任务
1. 每一分钟执行一次
2. 执行对象:cron2mysql.php
压测脚本:..
测试结果如下:
Time taken for tests: 32.690 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Non-2xx responses: 20000
Total transferred: 13520000 bytes
Total POSTed: 5340000
HTML transferred: 9300000 bytes
Requests per second: 611.80 [#/sec] (mean)
Time per request: 81.726 [ms] (mean)
Time per request: 1.635 [ms] (mean, across all concurrent requests)
Transfer rate: 403.88 [Kbytes/sec] received
159.52 kb/s sent
563.41 kb/s total
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.9 0 19
Processing: 14 82 8.4 81 153
Waiting: 4 82 8.4 80 153
Total: 20 82 8.2 81 153
Percentage of the requests served within a certain time (ms)
50% 81
66% 84
75% 86
80% 88
90% 93
95% 96
98% 100
99% 103
100% 153 (longest request)
测试结果:
50个并发, 20000次请求, 虚拟下,未做特殊优化,每次请求redis写操作6次.
总的请求大概120000次:
30+秒左右完成.
平均每秒发布700(600)条微博, 4000(3600)次redis写入.
Redis配置文件
daemonize yes # redis是否以后台进程运行
Requirepass 密码 # 配置redis连接的密码
注:配置密码后,客户端连上服务器,需要先执行授权命令
# auth 密码
===========================================
13.php-redis扩展编译(通过PHP实现redis)
1: 到pecl.php.net 搜索redis
2: 下载stable版(稳定版)扩展
3: 解压,
4: 执行/php/path/bin/phpize (作用是检测PHP的内核版本,并为扩展生成相应的编译配置)
5: configure --with-php-config=/php/path/bin/php-config
6: make && make install
引入编译出的redis.so插件
1: 编辑php.ini
2: 添加
redis插件的使用
// get instance
$redis = new Redis();
// connect to redis server
$redis->open('localhost',6380);
$redis->set('user:userid:9:username','wangwu');
var_dump($redis->get('user:userid:9:username'));
14.Lua与Redis
>>>>>>>>>>>>>>>>>>三.Redis集群
redis集群的诸多方案:具体的内容需要看这篇文章的介绍 http://www.sohu.com/a/79200151_354963
由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用。Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB、200GB的规模,但是单实例模式限制了Redis没法满足业务的需求(例如新浪微博就曾经用Redis存储了超过1TB的数据)。
Redis的开发者Antirez早在博客上就提出在Redis 3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版。各大企业在3.0版本还没发布前为了解决Redis的存储瓶颈,纷纷推出了各自的Redis集群方案。这些方案的核心思想是把数据分片(sharding)存储在多个Redis实例中,每一片就是一个Redis实例
1.客户端分片
2.Twemproxy :Twemproxy-缓存代理分片机制
3.Codis
4.Redis-sentinel哨兵模式集群
5.Redis 3.0 cluster 集群: Redis 3.0 cluster 集群
>>>>>>>>>>>>>>>>>>>>四.开发
<<Redis集群的高可用测试(含Jedis客户端的使用).pdf>>
1. 单机版 参考 工程
D:\workFile\sofeInstall\rediSpace
edu-common-parent.rar
edu-demo-redis-cluster.rar
Spring_Redis(RedisTemplate).rar
2.哨兵集群
参考: http://blog.csdn.net/donggang1992/article/details/51064962
但是这个有Bug,当RedisCache内配置死的对象挂掉时就不能用了。
参考:account-mine(redis哨兵集群).rar
分析:
applicationContext.xml
applicationContext-mybatis.xml spring-redis.xml(被注释掉了)
accountDao.xml <cache eviction="LRU" type="com.bypay.account.common.redis.RedisCache" />
RedisCache
问题: 配置文件方式的未实现
3.cluster集群
暂未实现
4.twemproxy
4.1 jedis通过twemproxy使用1111端口无法访问
原因在于:twemproxy配置文件nutcracker.yml,监听的IP写的不对,可能写的是127.0.0.1,应该是你访问的实际地址,比如192.168.1.106
4.2 如上必须写上监听端口的地址:若本地写的192.168.1.122,则必须如下方式写:redis-cli -p 1111 不行,必须redis-cli -h 192.168.1.122 -p 1111则不行
关于:"redis需要读写分离吗"的讨论
读写分离是对于有磁盘IO阻塞 的数据库才有的概念。 nosql不应该有这种概念。比如,redis你读的话,会瞬间从内存检索出你要的数据并通过网络IO发给你而你写的话也会瞬间检索到该写的内存区域并写进去。所以不存在读写分离这种需求。
要谈分离,也仅仅是并发量大之后的集群压力分离,把读写压力分摊到集群的单元节点上。而不是把[读][写]拆开。