redis安装
# mkdir -p /data/soft
# mkdir -p /data/redis_cluster/redis_6379
# cd soft/
# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}
# tar zxf redis-3.2.12.tar.gz -C /opt/redis_cluster/
# 创建软连接
# ln -s redis-3.2.12 redis
[root@666 utils]# ./install_server.sh
运行这个脚本生成官方配置文件
[root@666 conf]# pwd
/opt/redis_cluster/redis_6379/conf
[root@666 conf]# vim redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定主机地址
bind 192.168.200.30
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /opt/redis_cluster/redis_6379
密码
requirepass 123456
redis-cli -a 123456
启动redis
# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
# redis-cli
关闭
redis-cli -h 127.0.0.1 shutdown
192.168.200.30:6379> set k1 v1
OK
192.168.200.30:6379> keys *
1) "k1"
192.168.200.30:6379> get k1
"v1"
192.168.200.30:6379>
192.168.200.30:6379> MSET k1 v1 k2 v2 k3 v3 k4 v4 k5 v5
OK
192.168.200.30:6379> get k3
"v3"
192.168.200.30:6379> MGET k1 k2 k3 k4 k5
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
查看是否存在
192.168.200.30:6379> EXISTS k2
删除
192.168.200.30:6379> DEL k1
过期时间
EXPIRE K1 10
TTL k1
-1 永不过期
-2 没有这个key
数字
解除过期时间
PERSIST k2
列表
192.168.200.30:6379> RPUSH list1 1
(integer) 1
192.168.200.30:6379>
192.168.200.30:6379> type list1
list
192.168.200.30:6379> LPUSH list1 kang
(integer) 2
列表长度
192.168.200.30:6379> LLEN list1
(integer) 2
192.168.200.30:6379> LRANGE list1 0 -1
1) "kang"
2) "1"
192.168.200.30:6379> LRANGE list1 1 1
1) "1"
右删除
192.168.200.30:6379> RPOP list1
"1"
192.168.200.30:6379> LPUSH list1 1 2 3 4 5 6 7
(integer) 9
左删除
192.168.200.30:6379> LPOP list1
"7"
哈希
192.168.200.30:6379> HMSET student:cloud-computing name kang age 22 job it
OK
192.168.200.30:6379> HMGET student:cloud-computing name
1) "kang"
192.168.200.30:6379> HGETALL student:cloud-computing
1) "name"
2) "kang"
3) "age"
4) "22"
5) "job"
6) "it"
集合
192.168.200.30:6379> SADD set1 1 3 5 7 9
(integer) 5
192.168.200.30:6379> SADD set2 2 4 6 8 10
(integer) 5
192.168.200.30:6379> SMEMBERS set1
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
6) "13579"
# 以前面的为标准
192.168.200.30:6379> SDIFF set1 set2
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
6) "13579"
交集
192.168.200.30:6379> SINTER set1 set2
1) "2"
192.168.200.30:6379> sadd lxl pg1 baoqiang alexsbb lidao
(integer) 4
192.168.200.30:6379> sadd jn1 baoqiang qianghe hedao bingbing
(integer) 4
并集
192.168.200.30:6379> SUNION lxl jn1
1) "qianghe"
2) "lidao"
3) "bingbing"
4) "baoqiang"
5) "hedao"
6) "alexsbb"
7) "pg1"
Redis持久化
RDB AOF
192.168.200.30:6379> BGSAVE
Background saving started
192.168.200.30:6379>
192.168.200.30:6379>
192.168.200.30:6379> quit
[root@666 redis_6379]# ll
total 28
-rw-r--r--. 1 root root 25869 Oct 19 02:24 redis_6379.rdb
[root@666 redis_6379]#
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 900 1
save 300 10
save 60 10000
执行shutdown默认保存了一次
vi /opt/redis_cluster/redis_6379/conf/redis_6379.conf
#是否打开aof日志功能
appendonly yes
# 每一个都立即同步到aof
appendfsync always
#每秒写一次
appendfsync everysec
#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof
appendfsync no
appendfilename "appendonly.aof"
两个文件都存在,aof起作用
配置文件在线修改
CONFIG GET *
等等
SortedSet(有序集合)
应用场景:
排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,
这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,
每次只需要执行一条ZADD命令即可。
127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg
(integer) 6
127.0.0.1:6379> ZINCRBY topN 100000 smlt
"100000"
127.0.0.1:6379> ZINCRBY topN 10000 fskl
"10000"
127.0.0.1:6379> ZINCRBY topN 1000000 fshkl
"1000000"
127.0.0.1:6379> ZINCRBY topN 100 lzlsfs
"100"
127.0.0.1:6379> ZINCRBY topN 10 wdhbx
"10"
127.0.0.1:6379> ZINCRBY topN 100000000 wxg
"100000000"
127.0.0.1:6379> ZREVRANGE topN 0 2
1) "wxg"
2) "fshkl"
3) "smlt"
127.0.0.1:6379> ZREVRANGE topN 0 2 withscores
1) "wxg"
2) "100000000"
3) "fshkl"
4) "1000000"
5) "smlt"
6) "100000"
127.0.0.1:6379>
增
zadd myzset 2 "two" 3 "three" 添加两个分数分别是 2 和 3 的两个成员
删
zrem myzset one two 删除多个成员变量,返回删除的数量
改
zincrby myzset 2 one 将成员 one 的分数增加 2,并返回该成员更新后的分数
查
zrange myzset 0 -1 WITHSCORES 返回所有成员和分数,不加WITHSCORES,只返回成员
zrank myzset one 获取成员one在Sorted-Set中的位置索引值。0表示第一个位置
zcard myzset 获取 myzset 键中成员的数量
zcount myzset 1 2 获取分数满足表达式 1 <= score <= 2 的成员的数量
zscore myzset three 获取成员 three 的分数
zrangebyscore myzset 1 2 获取分数满足表达式 1 < score <= 2 的成员
#-inf 表示第一个成员,+inf最后一个成员
#limit限制关键字
#2 3 是索引号
zrangebyscore myzset -inf +inf limit 2 3 返回索引是2和3的成员
zremrangebyscore myzset 1 2 删除分数 1<= score <= 2 的成员,并返回实际删除的数量
zremrangebyrank myzset 0 1 删除位置索引满足表达式 0 <= rank <= 1 的成员
zrevrange myzset 0 -1 WITHSCORES 按位置索引从高到低,获取所有成员和分数
#原始成员:位置索引从小到大
one 0
two 1
#执行顺序:把索引反转
位置索引:从大到小
one 1
two 0
#输出结果: two
one
zrevrange myzset 1 3 获取位置索引,为1,2,3的成员
#相反的顺序:从高到低的顺序
zrevrangebyscore myzset 3 0 获取分数 3>=score>=0的成员并以相反的顺序输出
zrevrangebyscore myzset 4 0 limit 1 2 获取索引是1和2的成员,并反转位置索引
发布订阅
192.168.200.30:6379> PUBLISH fm5200 hello(integer) 1192.168.200.30:6379>
192.168.200.30:6379> SUBSCRIBE fm5200Reading messages... (press Ctrl-C to quit)
- "subscribe"
- "fm5200"
- (integer) 1
- "message"
- "fm5200"
- "hello"
redis事务
redis的事务是基于队列实现的。
mysql的事务是基于事务日志和锁机制实现的。
redis是乐观锁机制。
开启事务功能时(multi)
multi
command1
command2
command3
command4
exec
discard
4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。
exec
当执行exec时,对列中所有操作,要么全成功要么全失败
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a b
QUEUED
127.0.0.1:6379> set c d
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
9. redis乐观锁实现(模拟买票)
发布一张票
set ticket 1
窗口1:
watch ticket
multi
set ticket 0 1---->0
窗口2:
multi
set ticket 0
exec
窗口1:
exec
10、 服务器管理命令
Info
Client list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置统计
CONFIG GET/SET 动态修改
Dbsize
FLUSHALL 清空所有数据
select 1
FLUSHDB 清空当前库
MONITOR 监控实时指令
SHUTDOWN 关闭服务器
关闭数据库:
redis-cli -a root shutdown
redis主从
redis(Master-Replicaset) *
原理:
1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库
2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
3. 副本库接收后会应用RDB快照
4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
5. 到此,我们主复制集就正常工作了
6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的
主从数据一致性保证
min-slaves-to-write 1
min-slaves-max-lag 3
主库是否要开启持久化?
如果不开有可能,主库重启操作,造成所有主从数据丢失!
主从复制实现
1、环境:
准备两个或两个以上redis实例
mkdir /data/638{0..2}
配置文件示例:
cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123
EOF
cat >> /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF
cat >> /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF
启动:
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf
主节点:6380
从节点:6381、6382
2、开启主从:
6381/6382命令行:
redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
3、查询主从状态
redis-cli -p 6380 -a 123 info replication
redis-cli -p 6381 -a 123 info replication
redis-cli -p 6382 -a 123 info replication