Redis 学习笔记
目录Redis 基本数据类型操作redis怎么操作这些数据字符串 (String)哈希 (Hash)列表 (List)集合 (Set)有序集合 (Sorted Set)Redis 发布/订阅Python 操作 Redis1. 连接数据库2. 常用操作示例Redis 事务原生 Redis 事务命令乐观锁WatchPython 中操作事务使用 PipelineRedis 主从复制读写分离配置步骤Linux 虚拟机示例1. 修改主节点配置redis.conf2. 修改从节点配置redis.conf3. 验证主从状态4. 测试读写分离常见问题与排查“搞不上”的解决思路常用维护命令Redis 基本数据类型操作字符串(String)SET、GET、MSET、MGET哈希(Hash)HSET、HGET、HMSET已弃用建议用HSET列表(List)LPUSH、RPUSH、LPOP、RPOP集合(Set)SADD、SMEMBERS有序集合(Sorted Set)ZADD、ZRANGEredis怎么操作这些数据字符串 (String)这是最基础的类型可以存储文本、数字等。设置值SET key value127.0.0.1:6379 SET name Alice OK获取值GET key127.0.0.1:6379 GET name Alice批量设置MSET key value [key value ...]127.0.0.1:6379 MSET age 30 city New York OK批量获取MGET key [key ...]127.0.0.1:6379 MGET name age city 1) Alice 2) 30 3) New York数值增减如果存储的是整数可以用INCR递增或DECR递减。127.0.0.1:6379 SET counter 100 OK 127.0.0.1:6379 INCR counter (integer) 101哈希 (Hash)适合存储对象如用户信息、商品详情等。设置字段HSET key field value127.0.0.1:6379 HSET user:1001 name Bob (integer) 1获取字段HGET key field127.0.0.1:6379 HGET user:1001 name Bob批量设置HMSET key field value [field value ...]HMSET仍可用但官方更推荐使用HSET进行批量设置127.0.0.1:6379 HSET user:1001 age 25 email bobexample.com (integer) 2获取所有字段和值HGETALL key127.0.0.1:6379 HGETALL user:1001 1) name 2) Bob 3) age 4) 25 5) email 6) bobexample.com删除字段HDEL key field [field ...]127.0.0.1:6379 HDEL user:1001 age (integer) 1列表 (List)一个有序的字符串列表底层是双向链表非常适合实现消息队列、最新消息列表等场景。从左侧添加LPUSH key value [value ...]127.0.0.1:6379 LPUSH mylist world hello (integer) 2从右侧添加RPUSH key value [value ...]127.0.0.1:6379 RPUSH mylist redis (integer) 3查看列表LRANGE key start stop127.0.0.1:6379 LRANGE mylist 0 -1 # 查看全部元素 1) hello 2) world 3) redis从左侧弹出LPOP key127.0.0.1:6379 LPOP mylist hello从右侧弹出RPOP key127.0.0.1:6379 RPOP mylist redis集合 (Set)一个无序且元素唯一的集合常用于标签系统、共同好友等场景。添加元素SADD key member [member ...]127.0.0.1:6379 SADD fruits apple banana orange (integer) 3获取所有元素SMEMBERS key127.0.0.1:6379 SMEMBERS fruits 1) orange 2) banana 3) apple判断元素是否存在SISMEMBER key member127.0.0.1:6379 SISMEMBER fruits apple (integer) 1 # 存在移除元素SREM key member [member ...]127.0.0.1:6379 SREM fruits banana (integer) 1有序集合 (Sorted Set)和集合类似但每个元素都关联一个分数 (score)并以此进行排序。常用于排行榜、带有权重的任务队列等。添加元素ZADD key score member [score member ...]127.0.0.1:6379 ZADD leaderboard 100 player1 95 player2 120 player3 (integer) 3按分数升序获取ZRANGE key start stop [WITHSCORES]127.0.0.1:6379 ZRANGE leaderboard 0 -1 WITHSCORES 1) player2 2) 95 3) player1 4) 100 5) player3 6) 120按分数降序获取ZREVRANGE key start stop [WITHSCORES]127.0.0.1:6379 ZREVRANGE leaderboard 0 -1 WITHSCORES 1) player3 2) 120 3) player1 4) 100 5) player2 6) 95Redis 发布/订阅订阅SUBSCRIBE/PSUBSCRIBE发布PUBLISH取消订阅UNSUBSCRIBE/PUNSUBSCRIBEPython 操作 Redis1. 连接数据库import redis def init01(): r redis.Redis(host127.0.0.1, port6379, db0, decode_responsesTrue, password) print(r.ping()) # 检查连接 def init02(): pool redis.ConnectionPool(host127.0.0.1, port6379, db0, password, decode_responsesTrue) r redis.Redis(connection_poolpool) print(r.ping()) r.set(username, zhangsan) print(r.get(username)) # 连接池会在程序退出时自动释放也可手动断开 r.connection_pool.disconnect() if __name__ __main__: init01() init02()关于SET的扩展参数ex过期时间秒px过期时间毫秒nx只有当键不存在时才设置xx只有当键存在时才设置注意ex和px不能同时使用选择其一即可。2. 常用操作示例import redis pool redis.ConnectionPool(host127.0.0.1, port6379, db0, password, decode_responsesTrue) r redis.Redis(connection_poolpool) def string_demo(): r.set(name11, zhangsan) print(r.get(name11)) def mset_mget_demo(): r.mset({name: lisi, age: 18}) print(r.mget(name, age)) # 返回列表 print(r.mget([name, age])) # 同样效果 if __name__ __main__: string_demo() mset_mget_demo()Redis 事务原生 Redis 事务命令MULTI开启事务EXEC提交事务DISCARD取消事务回滚Redis 事务不支持回滚但可以通过乐观锁实现类似 CAS 的机制。乐观锁WatchWATCH命令用于监视一个或多个键如果在事务执行前这些键被其他客户端修改则事务执行失败。示例# 客户端A 127.0.0.1:6379 WATCH name OK 127.0.0.1:6379 MULTI OK 127.0.0.1:6379(TX) SET name liyue QUEUED 127.0.0.1:6379(TX) EXEC (nil) # 如果在WATCH之后name被其他客户端修改则返回nil # 客户端B在A执行EXEC之前执行 127.0.0.1:6379 SET name liyueking OKPython 中操作事务使用 PipelineRedis 的 Pipeline 默认支持事务通过transactionTrue底层封装了MULTI/EXEC。import redis def transaction_demo(): pool redis.ConnectionPool(host127.0.0.1, port6379, db0, password, decode_responsesTrue) r redis.Redis(connection_poolpool) try: pipe r.pipeline(transactionTrue) # 自动开启 MULTI pipe.set(name, zhangsan) pipe.hset(user, mapping{age: 18, sex: male}) # 推荐使用 hset pipe.sadd(letters, a, b, c) pipe.execute() # 提交事务 except Exception as e: pipe.reset() # 发生异常时取消事务 print(事务执行失败:, e) if __name__ __main__: transaction_demo()注意hmset在较新版本的 Redis 中已弃用推荐使用hset或hset配合mapping参数。Redis 主从复制读写分离主从复制实现数据冗余提高读性能同时是构建高可用集群的基础。配置步骤Linux 虚拟机示例假设主节点 IP 为192.168.1.100从节点 IP 为192.168.1.101。1. 修改主节点配置redis.confbind 0.0.0.0 # 允许所有IP连接生产环境建议限定 protected-mode no # 关闭保护模式若设置密码可开启 port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile /var/log/redis_6379.log requirepass yourpassword # 可选设置密码启动主节点redis-server /path/to/redis.conf2. 修改从节点配置redis.confbind 0.0.0.0 protected-mode no port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile /var/log/redis_6379.log replicaof 192.168.1.100 6379 # 指定主节点IP和端口 masterauth yourpassword # 如果主节点有密码需配置 requirepass yourpassword # 从节点也可设置密码可选启动从节点redis-server /path/to/redis.conf3. 验证主从状态连接主节点或从节点执行redis-cli -h 192.168.1.100 -p 6379 -a yourpassword info replication输出应显示role:master和连接的从节点数量。连接从节点执行相同命令应显示role:slave并显示master_host和master_port。4. 测试读写分离在主节点写入数据SET key value在从节点读取数据GET key应能获取在从节点尝试写入SET key2 value2应报错因为从节点只读常见问题与排查“搞不上”的解决思路现象可能原因解决方案从节点连接不上主节点防火墙未开放端口关闭防火墙或添加规则firewall-cmd --add-port6379/tcp --permanent主从复制一直处于connecting状态主节点bind设置了127.0.0.1改为0.0.0.0或具体IP认证失败密码不匹配或未设置masterauth检查主从密码配置一致从节点只读但数据未同步主节点有密码但从节点未配置masterauth配置正确的密码从节点无法同步日志显示SYNC failed磁盘空间不足或网络不稳定检查磁盘、网络可使用repl-diskless-sync等优化复制偏移量不一致网络延迟或主节点负载高检查带宽调整repl-backlog-size常用维护命令INFO replication查看复制状态SLAVEOF NO ONE将从节点提升为主节点故障转移时用CONFIG SET slave-read-only yes确保从节点只读