1. Redis基本操作

1. 安装

  1. yum install redis

2. 使用

  1. String类型

    1. set KEY VALUE : 设置字符串类型
    2. mset KEY1 VALUE1 KEY2 VALUE2: 设置多个
    3. get KEY: 获取key
    4. incr KEY: 自增
  2. hash

    1. hset KEY FIELD VALUE: 设置
    2. hmset KEY FIELD1 VALUE1 KEY2 VALUE2 ...: 设置多个值
    3. hget KEY FIELD: 查看
    4. hgetall KEY: 查看所有
  3. List

    1. lpush KEY VALUE1 VALUE2...: 从集合左侧添加
    2. rpush KEY VALUE1 VALUE2...: 从集合右侧添加
    3. lrange KEY START STOP: 查看集合
    4. lpop KEY: 从集合左侧取出
    5. rpop KEY: 从集合右侧取出
  4. set

    1. sadd: 设置
    2. smembers: 查看值
    3. sismembers: 查看某个值是否在集合中
  5. zset

    1. zadd KEY SCORE MEMBER: 设置
    2. zscore KEY MENBER: 返回SCORE
    3. zrang KEY STRT STOP: 查看

    2. Redis事务

    1. 基础事务指令

  • multi开启事务
  • exec执行事务
    1. 127.0.0.1:6379> set a 1
    2. QUEUED
    3. 127.0.0.1:6379> set b 1
    4. QUEUED
    5. 127.0.0.1:6379> get 1
    6. QUEUED
    7. 127.0.0.1:6379> get a
    8. QUEUED
    9. 127.0.0.1:6379> EXEC
    10. 1) OK
    11. 2) OK
    12. 3) (nil)
    13. 4) "1"
    redis事务中出现错误也不会回滚

    2. Python连接Redis实现事务

    1. from redis import StrictRedis
    2. r = StrictRedis.from_url('redis://127.0.0.1:6379/0')
    3. pl = r.pipeline()
    4. pl.set('a', 100)
    5. pl.set('b', 200)
    6. pl.get('a')
    7. pl.get('b')
    8. ret = pl.execute()
    9. 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”

  1. <a name="l3L0m"></a>
  2. ### 3. Redis防护
  3. <a name="a8f3da77"></a>
  4. #### 1. 密码防护
  5. ```bash
  6. [root@localhost ~]# vim /usr/local/redis/redis.conf
  7. [root@localhost ~]# redis-server /usr/local/redis/redis.conf
  8. requirepass 123456
  9. #两种登录方式
  10. [root@localhost ~]# redis-cli
  11. 127.0.0.1:6379> auth 123456
  12. OK
  13. [root@localhost ~]# redis-cli -a 123456

2. 数据持久化

redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保持持久化;

  1. snapshoting(快照)—默认方式

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照储存,是默认的持久化方式; 这种方式是将内存中数据以快照的方式写入到二进制文件中, 默认的文件名为dumo.rdb; 这种持久化方式被称为snapshoting(快照);

结论: 在redis.conf文件中’ dir ./ ‘定义了数据库文件的存放位置,默认是当前目录; 所以每次启动redis服务所在的目录不同, 将会生成新的dump.rdb文件; 建议服务器搭建完成时先修改快照文件位置;

  1. #过了900s并且有一个key发生改变,就触发save动作;
  2. #过了300s并且有10个key发生改变,就触发save动作;
  3. #过来60s并且有10000个key发生改变,就触发save
  1. append-only file (aof)

使用AOF会让你的Redis更加耐久;你可以使用不同的持久化策略;每次写的时候备份,每秒备份,无备份; 使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失一秒的数据;

  1. vim /usr/local/redis/redis.conf
  2. appendonly yes #开启AFO
  3. # appendfsync always #有写操作,就写入磁盘;效率慢但是安全
  4. appendfsync everysec #默认.每秒写入磁盘一次
  5. # appendfsync no #不进行备份,最快,最不安全
  6. [root@master ~]# redis-cli -a 123456 -h 192.168.10.12 shutdown
  7. [root@master ~]# redis-server /usr/local/redis/redis.conf
  8. [root@master ~]# ls /usr/local/redis/data/
  9. appendonly.aof dump.rdb

3. redis哨兵

1. 配置

  1. # 修改sentinel.conf
  2. vim /etc/redis-sentinel.conf
  3. bind 127.0.0.1
  4. port 26379
  5. protected-mode no # 禁止保护模式
  6. # 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.10.1代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
  7. sentinel monitor mymaster 192.168.10.11 6379 2
  8. # sentinel auth-pass <master-name> <password> # mymaster是服务名称,123456是Redis服务器密码
  9. sentinel auth-pass mymaster 123456
  10. sentinel failover-timeout mymaster 180000 # 故障转移时间

2. python使用

  1. REDIS_SENTINELS = [
  2. ('127.0.0.1', '26380'),
  3. ('127.0.0.1', '26381'),
  4. ('127.0.0.1', '26382'),
  5. ]
  6. REDIS_SENTINEL_SERVICE_NAME = 'mymaster'
  7. from redis.sentinel import Sentinel
  8. _sentinel = Sentinel(REDIS_SENTINELS)
  9. redis_master = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
  10. redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)

4. redis cluster

1. 配置

  1. 下载安装redis-3.2.9

    1. cd /usr/local/src/
    2. wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    3. tar zxf redis-3.2.9.tar.gz -C /usr/local/
    4. mv /usr/local/redis-3.2.9 /usr/local/redis
    5. cd /usr/local/redis
    6. make && make PREFIX=/usr/local/redis install
    7. echo 'PATH=$PATH:/usr/local/redis/bin' >> ~/.bash_profile # 配置环境变量
    8. source ~/.bash_profile
  2. 修改配置文件

    1. mkdir -p /data/cluster
    2. cd /data/cluster
    3. mkdir 7000 7001 7002 7003 7004 7005
    4. cp /usr/local/redis/redis.conf 7000/redis-7000.conf
    5. vim 7000/redis-7000.conf
    6. ### 主要修改下面配置
    7. bind 192.168.10.11
    8. port 7000
    9. daemonize yes
    10. cluster-enabled yes
    11. cluster-config-file nodes-7000.conf
    12. cluster-node-timeout 15000
    13. pidfile /var/run/redis_7000.pid
    14. logfile /var/log/redis/redis-7000.log
    15. 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
    16. sed -i 's/7000/7001/g' 7001/redis-7001.conf
    17. sed -i 's/7000/7002/g' 7002/redis-7002.conf
    18. sed -i 's/7000/7003/g' 7003/redis-7003.conf
    19. sed -i 's/7000/7004/g' 7004/redis-7004.conf
    20. sed -i 's/7000/7005/g' 7005/redis-7005.conf
  3. 启动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

  1. 4. 检查集群
  2. ```bash
  3. redis-trib check 127.0.0.1:7000 # 检查redis-cluster
  4. redis-cli -h 127.0.0.1 -p 7000
  5. 127.0.0.1:7000> CLUSTER INFO
  6. cluster_state:ok
  7. cluster_slots_assigned:16384
  8. cluster_slots_ok:16384
  9. cluster_slots_pfail:0
  10. cluster_slots_fail:0
  11. cluster_known_nodes:6
  12. cluster_size:3
  13. cluster_current_epoch:6
  14. cluster_my_epoch:1
  15. cluster_stats_messages_sent:414
  16. cluster_stats_messages_received:414
  1. 启动脚本 ```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

  1. <a name="aNUnN"></a>
  2. #### 2. python使用
  3. ```python
  4. # redis 集群
  5. REDIS_CLUSTER = [
  6. {'host': '127.0.0.1', 'port': '7000'},
  7. {'host': '127.0.0.1', 'port': '7001'},
  8. {'host': '127.0.0.1', 'port': '7002'},
  9. ]
  10. import rediscluster
  11. redis_master = rediscluster.StrictRedisCluster(startup_nodes=REDIS_CLUSTER)
  12. # 可以将redis_cluster就当作普通的redis客户端使用
  13. redis_master.delete(key)