目录
2.1.2 INCR、DECR、INCRBY、DECRBY操作
一、 redis 哨兵模式部署
redis 数据库是个内存数据库,它会存一些类似 c++ 的list、set、map 等数据结构,当然几乎每种语言都会有这些数据结构,这里主要简单介绍,如何插入某种结构的数据以及获取数据。
1、整体框架及环境
3个哨兵、1个主redis、2个备redis
3个哨兵的ip及端口如下:
10.130.41.59:23700
10.130.41.59:23701
10.130.41.59:23702
主redis和备redis的ip及端口如下:
主redis 10.130.41.59:7001
备redis1 10.130.41.59:7000
备redis2 10.130.41.59:7002
标准哨兵配置:
port 23700
bind 10.130.41.59
sentinel monitor songbw_master 10.130.41.59 7001 2
sentinel failover-timeout songbw_master 900000
剩余2个哨兵,只需要改变端口即可
主 redis 的标准配置
port 7001
bind 10.130.41.59
appendonly yes
dir "/home/songbw/redis_sentinel/7001"
slave-read-only yes
备 redis 的标准配置
port 7000
bind 10.130.41.59
appendonly yes
dir "/home/songbw/redis_sentinel/7000"
slave-read-only yes
slaveof 10.130.41.59 7001
另外一个备redis,也只需要修改对应的端口即可
注意:
a、配置中的ip 如果 填写成 127.0.0.1,程序可能连不上 redis
b、如果想后台运行,添加配置 daemonize yes
c、dir 配置应该是放redis数据存放的位置,如果目录不存在,或许也会启动失败
启动脚本 redis.sh
#!/bin/sh
WHO=`whoami`;
echo_w()
{
width=`expr 60 - $1`
f=`printf "%ds" $width`
printf "%$f\n" "$2"
}
checkRunning()
{
ret=`ps aux|grep -w $1|grep -v grep`;
echo $ret
if [ -z "$ret" ]; then
return 0;
else
return 1;
fi
}
if [ "$1" = "start" ];then
./server/redis-server server/redis7001.cfg
./server/redis-server server/redis7000.cfg
./server/redis-server server/redis7002.cfg
./sentinel/redis-sentinel sentinel/sentinel23700.cfg
./sentinel/redis-sentinel sentinel/sentinel23701.cfg
./sentinel/redis-sentinel sentinel/sentinel23702.cfg
len=`expr length "sentinel"`
for t in 1 2 3
do
echo -n "."
len=`expr $len + 1`
sleep 1
done
echo -n "."
ret=`checkRunning "sentinel"`;
if [ $? -ne 0 ];then
echo_w `expr $len + 1` "[[32m OK [0m]";
else
echo_w `expr $len + 1` "[[31mFAILED[0m]";
fi
fi
if [ "$1" = "stop" ];then
ps aux|grep -i redis|grep -v stop|grep -v grep|awk '{print $2}'|xargs -I {} kill -9 {}
fi
if [ "$1" = "check" ];then
len=`expr length "sentinel"`
ret=`checkRunning "sentinel"`;
if [ $? -ne 0 ];then
echo_w `expr $len + 1` "[[32m OK [0m]";
else
echo_w `expr $len + 1` "[[31mFAILED[0m]";
fi
fi
是我自己写的简单的启动脚本
./redis.sh check
检测redis是都正在运行,执行结果
[ OK ]
表明 redis 正在运行
./redis.sh stop
停止正在运行的 redis
./redis.sh start
启动 redis,执行结果
.... [ OK ]
这种哨兵模式的大致原理是:
三个哨兵,三个redis ,包括一个主的redis和2个备的redis,哨兵的作用是为了管理数据同步,同时在主的redis宕掉时,备的redis要顶上去等。
二、 redis 基础操作
2.1、string
2.1.1 SET、GET操作
设置键值 server:name 的值为 “fido”
通过GET操作,拿到键值 server:name的 vlaue值
2.1.2 INCR、DECR、INCRBY、DECRBY操作
INCR操作将键中存的值自增1
DECR操作将键中存的值自减1
INCR 和 DECR 就是增1或者减1,但如果想增加或者减少一个特定的值呢?
就用上面的命令,integer 就表示具体要增加或者减少的值
注意:
如果INCR、DECR、INCRBY、DECRBY所跟的键不存在,则会先将键中相应的值置为0,然后再进行自增或自减操作。关键是它们都是原子操作,不会引起数据的不一致性。
2.1.3 DEL、EXISTS
DEL是删除键及相关的值。
EXISTS 是查看某一个键是否存在,1存在,0不存在
2.1.4 EXPIRE、TTL操作
表示键 resourse:lock将会在120秒后被删除。
过了一会,使用命令:
,可能会得到值100,这表明resourse:lock的存活时间还有100秒。再过了好了一会你又使用命令,返回的值是-2,它表明键resourse:lock已经不存在了。而如果返回的值的值是-1,则表明键将永远不会过期,如下:
2.2、list
它所拥有的操作RPUSH,LPUSH,LLLEN,LRANGE,LPOP,RPOP,注意你可以立即开启一个list,只要这个键之前没有以其它的类型存在。
2.2.1 RPUSH
将一个新值放在列表的末尾
2.2.2 LPUSH
将一个新值放在列表的开始
2.2.3 LRANGE
返回list中特定范围的一个集合。它有两个参数,第一个参数是你想获得的第一个元素的索引,第二个参数是你想获得的最后一个元素的索引。如果是’-1’的话,就代表list末尾。
2.2.4 LLEEN
返回当前的list的长度
2.2.5 LPOP
移除list的第一个元素并且返回它
2.2.6 RPOP
移除list的最后一个元素并且返回它
用命令LLEN和LRANGE查看
说明LPOP和RPOP正是我们想表达的意思。
2.2.7 LINDEX
LINDEX 是找到索引位置的值并返回,LPUSH 是往表头插,那么mylist列表中,第一个是 Hello,第二个是 World,那么, LINDEX mylist -1 就是返回 mylist 列表中的最后一个元素,当然返回的是World
2.2.8 BLPOP
Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
这里的重点是,在弹出一个元素之后,列表中的数据就会少一个,如果列表中只有一个元素,弹出后,列表将为空,列表可能就不存在了
返回值:
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
格式如下:
redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT
具体例子:
redis 127.0.0.1:6379> BLPOP list1 100
其中 list1 是列表的 key , 100 是超时,也就是说,如果没有数据,就会等100s 返回,或者直到有数据返回
2.3、set
2.3.1 无序的set
set是个集合,显然它里面的元素是无序的,且每个元素只能出现一次,它的操作:SADD,SREM,SISMEMBER,SMEMBERS,SUNION
a、 SADD
添加给定的值到集合。
入第一列,是往key superpowers 中添加元素 flight
b、 SREM
从set中移除给定的值
c、 SISMEMBER
检测给定值是否在set中,返回1,说明在,0,不在
d、 SMEMBERS
返回set中所有的成员
e、 SUNION
合并2个或更多的set,并返回所有的元素
2.3.2 排序的set
由于set中的元素是不排序的,所以对于一些问题,它不能工作的很好,所以提出了sorted set,sorted set 和常规的set是很相似的,不同的是:对于sorted set ,每一个值会关联一个分数值,用来对sorted set 中的元素排序。
a、 ZADD
比如此例子第一行,
第二个字段是key值 hackers
第四个字段是具体的一个hacker ,名字是Alan Kay
第三个字段,是Alan Kay关联的一个分数值,表示其出生年月,是1940年
b、 ZRANGE
显然,集合中的元素已经排序过了,而我们取的是索引2到索引4的元素。
2.4、hashes
hashes是一个map,string字段和string值之间。它可以完美的表达出一个对象,因为一个对象,它就会有学号、性别、年龄等这些字段。
2.4.1 HSET
HSET是建立一个hashes
user:1000是一个key,然后将name “John Smith” 、 email “john. smith@example.com” 、 password “s3cret”存到了键user:1000里面,这不就是c++ 的map吗
2.4.2 HGETALL
HGETALL:得到hashes中所有的键值对
HMSET:一次性,把所有的键值对都放到hashes中
HGET:得到hashes中某一个字段对应的值
而且在hashes中,也有对数字的值进行原子性加减的操作:
HINCRBY:对hashes中,相应的值原子操作内加一个特定的值。并且和set中相应的操作一样,如果某个字段不存在,先将此字段的值设置为0,然后再进行加减操作。
HDEL:删除hashes中某一个字段值
显然,在hashes中,对于键user:1000,存入 visits 10,然后通过HINCRBY进行加操作,最后当我把 visits删掉后,再增加的话,值就变成了1。
2.5、redis配置
我们知道每一个redis实例都有一个配置文件redis.conf,不仅可以直接编辑redis.conf文件,还可以连上redis后,通过命令来配置,格式如下:
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
可以给字段CONFIG_SETTING_NAME设置值NEW_CONFIG_VALUE
例子如下:
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
还可以通过命令拿到配置的值,格式如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
可以得到字段CONFIG_SETTING_NAME的值
例子如下:
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
而命令CONFIG GET * 可以得到所有配置项的键值对
redis 127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
2.6、Redis发布订阅
一个redis实例在运行,然后很多客户端都可以去连接它,而Redis的发布订阅就是为了实现多个客户端之间的通信。
如一个客户端1订阅了redischat通道
客户端2在redischat通道上发布信息
返回值’3’代表有3个客户端订阅了redischat通道
然后客户端1就收到了这条消息
2.7、redis事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
A、事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
B、事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
由一个例子具体解释:
MULTI代表一个事务的开始,在这之后输入的命令都不会执行,而是放到一个队列里(例子中返回的是QUEUED),等EXEC执行之后,触发事务,这些命令会全部执行,而且它是一个原子操作。
2.8、redis连接
2.8.1 命令 AUTH
验证通过后,客户端才能正常与redis通信
2.8.2 命令 PING
返回值PONG,说明可以和redis服务端进行通信
2.9、redis 服务器
2.9.1 命令 INFO
INFO:得到所有关于服务器的统计数据和信息
仅仅是截取了一部分图
2.9.2 命令 CLIENT LIST
2.10、redis数据备份与恢复
数据备份:
a、
b、创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。
查看redis安装目录:
恢复数据:
只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
2.11、redis安全
可以给redis服务端设置密码,而密码是在配置文件redis.conf的requirepass字段中存放。
而我的redis服务端设置的密码是songbw_qn。
当然,前面讲过,我们也可以通过CONFIG SET命令来重新设置密码,一旦设置了密码,就需要通过AUTH password命令进行验证,才能正常连接到服务器。
2.12、redis性能测试
redis性能测试基本命令如下:
选项解释如下:
其中比较常用的是:
-h,-p,-n,-t,-q
图像仅截取了一部分
以上实例中主机为 127.0.0.1,端口号为 7001,请求数为 10000,因为没有用-t命令,所以显示所有命令的执行效率,没有用-q命令,所以显示所有的信息。
以上实例中主机为 127.0.0.1,端口号为 7001,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。