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: 返回SCOREzrang KEY STRT STOP: 查看
2. Redis事务
1. 基础事务指令
multi开启事务exec执行事务
redis事务中出现错误也不会回滚127.0.0.1:6379> set a 1QUEUED127.0.0.1:6379> set b 1QUEUED127.0.0.1:6379> get 1QUEUED127.0.0.1:6379> get aQUEUED127.0.0.1:6379> EXEC1) OK2) OK3) (nil)4) "1"
2. Python连接Redis实现事务
from redis import StrictRedisr = 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.confrequirepass 123456#两种登录方式[root@localhost ~]# redis-cli127.0.0.1:6379> auth 123456OK或[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.confappendonly 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.confvim /etc/redis-sentinel.confbind 127.0.0.1port 26379protected-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 123456sentinel 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.gztar zxf redis-3.2.9.tar.gz -C /usr/local/mv /usr/local/redis-3.2.9 /usr/local/rediscd /usr/local/redismake && make PREFIX=/usr/local/redis installecho 'PATH=$PATH:/usr/local/redis/bin' >> ~/.bash_profile # 配置环境变量source ~/.bash_profile
修改配置文件
mkdir -p /data/clustercd /data/clustermkdir 7000 7001 7002 7003 7004 7005cp /usr/local/redis/redis.conf 7000/redis-7000.confvim 7000/redis-7000.conf### 主要修改下面配置bind 192.168.10.11port 7000daemonize yescluster-enabled yescluster-config-file nodes-7000.confcluster-node-timeout 15000pidfile /var/run/redis_7000.pidlogfile /var/log/redis/redis-7000.logecho 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.confsed -i 's/7000/7001/g' 7001/redis-7001.confsed -i 's/7000/7002/g' 7002/redis-7002.confsed -i 's/7000/7003/g' 7003/redis-7003.confsed -i 's/7000/7004/g' 7004/redis-7004.confsed -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. 检查集群```bashredis-trib check 127.0.0.1:7000 # 检查redis-clusterredis-cli -h 127.0.0.1 -p 7000127.0.0.1:7000> CLUSTER INFOcluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_sent:414cluster_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 redisclusterredis_master = rediscluster.StrictRedisCluster(startup_nodes=REDIS_CLUSTER)# 可以将redis_cluster就当作普通的redis客户端使用redis_master.delete(key)
