1. Redis基本操作
1. 安装
yum install redis
2. 使用
String类型
set KEY VALUE : 设置字符串类型
mset KEY1 VALUE1 KEY2 VALUE2: 设置多个
get KEY: 获取key值
incr KEY: 自增
hash
hset KEY FIELD VALUE: 设置
hmset KEY FIELD1 VALUE1 KEY2 VALUE2 ...: 设置多个值
hget KEY FIELD: 查看
hgetall KEY: 查看所有
List
lpush KEY VALUE1 VALUE2...: 从集合左侧添加
rpush KEY VALUE1 VALUE2...: 从集合右侧添加
lrange KEY START STOP: 查看集合
lpop KEY: 从集合左侧取出
rpop KEY: 从集合右侧取出
set
sadd: 设置
smembers: 查看值
sismembers: 查看某个值是否在集合中
zset
zadd KEY SCORE MEMBER: 设置
zscore KEY MENBER: 返回SCORE
zrang KEY STRT STOP: 查看
2. Redis事务
1. 基础事务指令
multi
开启事务exec
执行事务
redis事务中出现错误也不会回滚127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> set b 1
QUEUED
127.0.0.1:6379> get 1
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (nil)
4) "1"
2. Python连接Redis实现事务
from redis import StrictRedis
r = StrictRedis.from_url('redis://127.0.0.1:6379/0')
pl = r.pipeline()
pl.set('a', 100)
pl.set('b', 200)
pl.get('a')
pl.get('b')
ret = pl.execute()
print(ret) # [True, True, b'100', b'200']
3. watch监视
redis
事务执行时,watch
监视的KEY
若被修改过,则事务不执行 ```python 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR a QUEUED 127.0.0.1:6379> INCR a QUEUED
开启另一个终端修改a
127.0.0.1:6379> set a 10
回到当前终端,执行事务
127.0.0.1:6379> EXEC (nil) 127.0.0.1:6379> get a “10”
<a name="l3L0m"></a>
### 3. Redis防护
<a name="a8f3da77"></a>
#### 1. 密码防护
```bash
[root@localhost ~]# vim /usr/local/redis/redis.conf
[root@localhost ~]# redis-server /usr/local/redis/redis.conf
requirepass 123456
#两种登录方式
[root@localhost ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
或
[root@localhost ~]# redis-cli -a 123456
2. 数据持久化
redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保持持久化;
- snapshoting(快照)—默认方式
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照储存,是默认的持久化方式; 这种方式是将内存中数据以快照的方式写入到二进制文件中, 默认的文件名为dumo.rdb; 这种持久化方式被称为snapshoting(快照);
结论: 在redis.conf文件中’ dir ./ ‘定义了数据库文件的存放位置,默认是当前目录; 所以每次启动redis服务所在的目录不同, 将会生成新的dump.rdb文件; 建议服务器搭建完成时先修改快照文件位置;
#过了900s并且有一个key发生改变,就触发save动作;
#过了300s并且有10个key发生改变,就触发save动作;
#过来60s并且有10000个key发生改变,就触发save
- append-only file (aof)
使用AOF会让你的Redis更加耐久;你可以使用不同的持久化策略;每次写的时候备份,每秒备份,无备份; 使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失一秒的数据;
vim /usr/local/redis/redis.conf
appendonly yes #开启AFO
# appendfsync always #有写操作,就写入磁盘;效率慢但是安全
appendfsync everysec #默认.每秒写入磁盘一次
# appendfsync no #不进行备份,最快,最不安全
[root@master ~]# redis-cli -a 123456 -h 192.168.10.12 shutdown
[root@master ~]# redis-server /usr/local/redis/redis.conf
[root@master ~]# ls /usr/local/redis/data/
appendonly.aof dump.rdb
3. redis哨兵
1. 配置
# 修改sentinel.conf
vim /etc/redis-sentinel.conf
bind 127.0.0.1
port 26379
protected-mode no # 禁止保护模式
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.10.1代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.10.11 6379 2
# sentinel auth-pass <master-name> <password> # mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000 # 故障转移时间
2. python使用
REDIS_SENTINELS = [
('127.0.0.1', '26380'),
('127.0.0.1', '26381'),
('127.0.0.1', '26382'),
]
REDIS_SENTINEL_SERVICE_NAME = 'mymaster'
from redis.sentinel import Sentinel
_sentinel = Sentinel(REDIS_SENTINELS)
redis_master = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)
4. redis cluster
1. 配置
下载安装redis-3.2.9
cd /usr/local/src/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /usr/local/
mv /usr/local/redis-3.2.9 /usr/local/redis
cd /usr/local/redis
make && make PREFIX=/usr/local/redis install
echo 'PATH=$PATH:/usr/local/redis/bin' >> ~/.bash_profile # 配置环境变量
source ~/.bash_profile
修改配置文件
mkdir -p /data/cluster
cd /data/cluster
mkdir 7000 7001 7002 7003 7004 7005
cp /usr/local/redis/redis.conf 7000/redis-7000.conf
vim 7000/redis-7000.conf
### 主要修改下面配置
bind 192.168.10.11
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis-7000.log
echo 7001/redis-7001.conf 7002/redis-7002.conf 7003/redis-7003.conf 7004/redis-7004.conf 7005/redis-7005.conf | xargs -n 1 cp -v 7000/redis-7000.conf
sed -i 's/7000/7001/g' 7001/redis-7001.conf
sed -i 's/7000/7002/g' 7002/redis-7002.conf
sed -i 's/7000/7003/g' 7003/redis-7003.conf
sed -i 's/7000/7004/g' 7004/redis-7004.conf
sed -i 's/7000/7005/g' 7005/redis-7005.conf
启动redis cluster ```bash redis-server 7000/redis-7000.conf redis-server 7001/redis-7001.conf redis-server 7002/redis-7002.conf redis-server 7003/redis-7003.conf redis-server 7004/redis-7004.conf redis-server 7005/redis-7005.conf
yum install ruby rubygems -y wget https://rubygems.org/downloads/redis-3.2.2.gem gem install -l redis-3.2.2.gem cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/redis-trib redis-trib create —replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
4. 检查集群
```bash
redis-trib check 127.0.0.1:7000 # 检查redis-cluster
redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:414
cluster_stats_messages_received:414
- 启动脚本
```bash
redis-cluster 启动脚本
vim redis-cluster-start.sh!/bin/bash
/usr/local/redis/bin/redis-server /data/cluster/7000/redis-7000.conf /usr/local/redis/bin/redis-server /data/cluster/7001/redis-7001.conf /usr/local/redis/bin/redis-server /data/cluster/7002/redis-7002.conf /usr/local/redis/bin/redis-server /data/cluster/7003/redis-7003.conf /usr/local/redis/bin/redis-server /data/cluster/7004/redis-7004.conf /usr/local/redis/bin/redis-server /data/cluster/7005/redis-7005.conf
redis-cluser停止脚本
vim redis-cluster-stop.sh
!/bin/bash
redis_processes=$(ps aux |grep “/usr/local/redis/bin/redis-server”|head -n -1 | awk ‘{print $2}’) for redis_process in $redis_processes do kill -9 $redis_process done
添加权限
chmod +x redis-cluster*.sh
systemd服务管理脚本
vim /usr/lib/systemd/system/redis-cluster.service [Unit] Description=Redis Cluster Service After=network.target [Service] Type=forking ExecStart=/data/cluster/redis-cluster-start.sh ExecStop=/data/cluster/redis-cluster-stop.sh [Install] WantedBy=default.target Type=notify
<a name="aNUnN"></a>
#### 2. python使用
```python
# redis 集群
REDIS_CLUSTER = [
{'host': '127.0.0.1', 'port': '7000'},
{'host': '127.0.0.1', 'port': '7001'},
{'host': '127.0.0.1', 'port': '7002'},
]
import rediscluster
redis_master = rediscluster.StrictRedisCluster(startup_nodes=REDIS_CLUSTER)
# 可以将redis_cluster就当作普通的redis客户端使用
redis_master.delete(key)