当前位置: 首页 > news >正文

Redis基础教程

Redis简介

什么是Redis

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。

Redis的特点

  • 高性能:基于内存存储,读写速度极快
  • 数据结构丰富:支持多种数据类型
  • 持久化:支持RDB和AOF两种持久化方式
  • 高可用:支持主从复制、哨兵模式、集群模式
  • 原子性操作:所有操作都是原子性的
  • 发布订阅:支持消息发布订阅模式

Redis应用场景

  • 缓存:提高数据访问速度
  • 会话存储:存储用户会话信息
  • 计数器:网站访问量、点赞数等
  • 排行榜:游戏排行、热门文章等
  • 消息队列:异步处理任务
  • 实时系统:在线用户列表、聊天室等

Redis配置

基本配置文件
# /etc/redis/redis.conf  # 绑定地址  
bind 127.0.0.1  # 端口  
port 6379  # 后台运行  
daemonize yes  # 进程ID文件  
pidfile /var/run/redis_6379.pid  # 日志级别  
loglevel notice  # 日志文件  
logfile /var/log/redis_6379.log  # 数据库数量  
databases 16  # 密码设置  
requirepass your_password  # 最大内存  
maxmemory 2gb  # 内存淘汰策略  
maxmemory-policy allkeys-lru
启动Redis服务
# 启动Redis服务器  
redis-server /etc/redis/redis.conf  # 使用systemctl(如果配置了服务)  
sudo systemctl start redis  
sudo systemctl enable redis  
sudo systemctl status redis  # 连接Redis客户端  
redis-cli  
redis-cli -h 127.0.0.1 -p 6379 -a your_password

Redis数据类型

字符串(String)

# 设置和获取  
SET name "Redis教程"  
GET name # 设置过期时间  
SETEX session:user1 3600 "用户数据"  # 仅在键不存在时设置  
SETNX lock:resource1 1  # 数值操作  
SET counter 0  
INCR counter          # 递增1  
INCRBY counter 5      # 递增5  
DECR counter          # 递减1  
DECRBY counter 3      # 递减3  # 字符串操作  
SET message "Hello"  
APPEND message " World"    # 追加字符串  
STRLEN message            # 获取长度  
GETRANGE message 0 4      # 获取子字符串

哈希(Hash)

# 设置和获取哈希字段  
HSET user:1001 name "张三" 
HGET user:1001 name  
HGETALL user:1001  # 批量操作  
HMSET user:1002 name "李四" age 30 city "北京"  
HMGET user:1002 name age city  # 判断字段是否存在  
HEXISTS user:1001 name  # 删除字段  
HDEL user:1001 email  # 获取所有字段名或值  
HKEYS user:1001  
HVALS user:1001  # 数值操作  
HINCRBY user:1001 age 1

列表(List)

# 左右插入  
LPUSH tasks "任务1""任务2"  
RPUSH tasks "任务3""任务4"  # 左右弹出  
LPOP tasks  
RPOP tasks  # 获取列表内容  
LRANGE tasks 0 -1     # 获取所有元素  
LRANGE tasks 0 2      # 获取前3个元素  # 获取列表长度  
LLEN tasks  # 根据索引获取元素  
LINDEX tasks 0  # 修改指定索引的元素  
LSET tasks 0 "新任务"  # 删除元素  
LREM tasks 1 "任务1"# 删除1个"任务1"  # 阻塞弹出(常用于消息队列)  
BLPOP tasks 10        # 阻塞10秒等待元素

集合(Set)

# 添加成员  
SADD fruits "苹果" "香蕉" "橙子"  
SADD colors "红色" "绿色" "蓝色"  # 获取所有成员  
SMEMBERS fruits  # 判断成员是否存在  
SISMEMBER fruits "苹果"  # 删除成员  
SREM fruits "橙子"  # 随机获取成员  
SRANDMEMBER fruits 2  # 弹出成员  
SPOP fruits  # 集合运算  
SADD set1 1 2 3 4  
SADD set2 3 4 5 6  SINTER set1 set2      # 交集  
SUNION set1 set2      # 并集  
SDIFF set1 set2       # 差集  # 将运算结果存储到新集合  
SINTERSTORE result set1 set2

有序集合(Sorted Set)

# 添加成员(带分数)  
ZADD scores 85 "张三" 92 "李四" 78 "王五"  # 根据排名获取成员  
ZRANGE scores 0 -1           # 按分数升序  
ZRANGE scores 0 -1 WITHSCORES  
ZREVRANGE scores 0 -1        # 按分数降序  # 根据分数范围获取成员  
ZRANGEBYSCORE scores 80 90  
ZRANGEBYSCORE scores (80 90  # 不包含80  # 获取成员分数  
ZSCORE scores "张三"  # 获取成员排名  
ZRANK scores "张三"          # 升序排名  
ZREVRANK scores "张三"       # 降序排名  # 增加成员分数  
ZINCRBY scores 5 "王五"  # 删除成员  
ZREM scores "李四"  # 统计分数范围内的成员数量  
ZCOUNT scores 80 90  # 获取集合大小  
ZCARD scores

Redis基本命令

键操作命令

# 查看所有键  
KEYS *  
KEYS user:*           # 模式匹配  # 检查键是否存在  
EXISTS mykey  # 删除键  
DEL mykey  
DEL key1 key2 key3  # 设置过期时间  
EXPIRE mykey 3600     # 3600秒后过期  
EXPIREAT mykey 1609459200  # 指定时间戳过期  
TTL mykey             # 查看剩余生存时间  
PERSIST mykey         # 移除过期时间  # 重命名键  
RENAME oldkey newkey  
RENAMENX oldkey newkey  # 仅在新键不存在时重命名  # 获取键的类型  
TYPE mykey  # 随机获取一个键  
RANDOMKEY  # 扫描键(推荐用于生产环境)  
SCAN 0 MATCH user:* COUNT 10

数据库操作

# 选择数据库(默认16个数据库,编号0-15)  
SELECT 0  
SELECT 1  # 清空当前数据库  
FLUSHDB  # 清空所有数据库  
FLUSHALL  # 移动键到其他数据库  
MOVE mykey 1  # 获取数据库大小  
DBSIZE  # 获取最后保存时间  
LASTSAVE

事务命令

# 开启事务  
MULTI  # 添加命令到事务队列  
SET key1 value1  
SET key2 value2  
INCR counter  # 执行事务  
EXEC  # 取消事务  
DISCARD  # 监视键(乐观锁)  
WATCH mykey  
MULTI  
SET mykey newvalue  
EXEC

脚本命令

# 执行Lua脚本  
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey myvalue  # 加载脚本并返回SHA1值  
SCRIPT LOAD "return redis.call('GET', KEYS[1])"  # 通过SHA1执行脚本  
EVALSHA sha1_hash 1 mykey  # 清除脚本缓存  
SCRIPT FLUSH  # 检查脚本是否存在  
SCRIPT EXISTS sha1_hash

Redis高级功能

发布订阅模式

# 订阅频道  
SUBSCRIBE news sports  # 订阅模式  
PSUBSCRIBE news:*  # 发布消息  
PUBLISH news "今日新闻内容"  
PUBLISH sports "体育赛事报道"  # 查看订阅信息  
PUBSUB CHANNELS      # 查看所有频道  
PUBSUB NUMSUB news   # 查看频道订阅数  
PUBSUB NUMPAT        # 查看模式订阅数  # 退订  
UNSUBSCRIBE news  
PUNSUBSCRIBE news:*

Redis Streams(Redis 5.0+)

# 添加消息到流  
XADD mystream * name "张三" age 25  
XADD mystream * name "李四" age 30  # 读取流消息  
XREAD COUNT 2 STREAMS mystream 0  # 创建消费者组  
XGROUP CREATE mystream mygroup 0  # 消费者读取消息  
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >  # 确认消息处理  
XACK mystream mygroup message_id  # 查看流信息  
XINFO STREAM mystream  
XLEN mystream         # 流长度

HyperLogLog(基数统计)

# 添加元素  
PFADD unique_visitors user1 user2 user3  # 获取基数估算值  
PFCOUNT unique_visitors  # 合并多个HyperLogLog  
PFMERGE merged_visitors visitors1 visitors2

地理位置(Geo)

# 添加地理位置  
GEOADD cities 116.28 39.55 beijing 121.29 31.14 shanghai  # 获取位置坐标  
GEOPOS cities beijing  # 计算距离  
GEODIST cities beijing shanghai km  # 根据坐标查找附近位置  
GEORADIUS cities 116 39 100 km WITHDIST WITHCOORD  # 根据成员查找附近位置  
GEORADIUSBYMEMBER cities beijing 500 km

位图(Bitmap)

# 设置位  
SETBIT user_online 1001 1    # 用户1001在线  
SETBIT user_online 1002 0    # 用户1002离线  # 获取位  
GETBIT user_online 1001  # 统计设置为1的位数  
BITCOUNT user_online  # 查找第一个设置为1或0的位  
BITPOS user_online 1  
BITPOS user_online 0  # 位运算  
BITOP AND result key1 key2   # 与运算  
BITOP OR result key1 key2    # 或运算  
BITOP XOR result key1 key2   # 异或运算  
BITOP NOT result key1        # 非运算

Redis持久化

RDB持久化

RDB是Redis的默认持久化方式,通过创建数据快照来保存数据。

RDB配置
# redis.conf配置  
save 900 1      # 900秒内至少1个键改变时保存  
save 300 10     # 300秒内至少10个键改变时保存  
save 60 10000   # 60秒内至少10000个键改变时保存  # RDB文件名和路径  
dbfilename dump.rdb  
dir /var/lib/redis/  # 压缩RDB文件  
rdbcompression yes  # RDB文件校验  
rdbchecksum yes
RDB命令
# 手动创建快照  
SAVE          # 同步保存(阻塞)  
BGSAVE        # 异步保存(后台进行)  # 获取最后保存时间  
LASTSAVE  # 检查后台保存是否在进行  
INFO persistence

AOF持久化

AOF通过记录每个写操作来保存数据,提供更好的数据安全性。

AOF配置
# 启用AOF  
appendonly yes  # AOF文件名  
appendfilename "appendonly.aof"  # 同步策略  
appendfsync everysec    # 每秒同步一次(推荐)  
# appendfsync always    # 每次写操作都同步  
# appendfsync no        # 由操作系统决定  # AOF重写  
auto-aof-rewrite-percentage 100  
auto-aof-rewrite-min-size 64mb  # AOF重写时是否继续同步  
no-appendfsync-on-rewrite no
AOF命令
# 手动重写AOF文件  
BGREWRITEAOF  # 查看AOF状态  
INFO persistence

混合持久化(Redis 4.0+)

# 启用混合持久化  
aof-use-rdb-preamble yes

持久化策略选择

只使用RDB的场景
  • 数据可以容忍一定程度的丢失
  • 需要定期备份
  • 对性能要求较高
只使用AOF的场景
  • 数据安全性要求很高
  • 可以容忍较大的文件大小
  • 需要详细的操作记录
同时使用RDB和AOF
  • 需要最高的数据安全性
  • 可以容忍额外的存储和性能开销

Redis集群与高可用

主从复制

配置主从复制
# 从服务器配置(redis.conf)  
replicaof 192.168.1.100 6379    # 主服务器IP和端口  
masterauth password              # 主服务器密码  # 或者通过命令设置  
REPLICAOF 192.168.1.100 6379
主从复制监控
# 查看复制信息  
INFO replication  # 在主服务器查看从服务器状态  
INFO replication  # 从服务器查看同步状态  
INFO replication

Redis Sentinel(哨兵模式)

Sentinel配置
# sentinel.conf  
port 26379  
sentinel monitor mymaster 192.168.1.100 6379 2  
sentinel auth-pass mymaster password  
sentinel down-after-milliseconds mymaster 5000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 10000
启动Sentinel
# 启动Sentinel  
redis-sentinel /path/to/sentinel.conf  # 或者  
redis-server /path/to/sentinel.conf --sentinel
Sentinel命令
# 连接Sentinel  
redis-cli -p 26379  # 查看监控的主服务器  
SENTINEL masters  # 查看从服务器  
SENTINEL slaves mymaster  # 查看其他Sentinel  
SENTINEL sentinels mymaster  # 手动故障转移  
SENTINEL failover mymaster

Redis Cluster(集群模式)

集群配置
# redis.conf(每个节点)
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
创建集群
# 启动多个Redis实例(至少6个,3主3从)  
redis-server redis-7000.conf  
redis-server redis-7001.conf  
redis-server redis-7002.conf  
redis-server redis-7003.conf  
redis-server redis-7004.conf  
redis-server redis-7005.conf  # 创建集群  
redis-cli --cluster create \  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 \  --cluster-replicas 1
集群管理命令
# 连接集群  
redis-cli -c -p 7000  # 查看集群信息  
CLUSTER INFO  
CLUSTER NODES  # 添加节点  
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000  # 删除节点  
redis-cli --cluster del-node 127.0.0.1:7000 node_id  # 重新分配槽位  
redis-cli --cluster reshard 127.0.0.1:7000  # 检查集群状态  
redis-cli --cluster check 127.0.0.1:7000

Redis性能优化

内存优化

内存使用分析
# 查看内存使用情况  
INFO memory  # 查看键的内存使用  
MEMORY USAGE keyname  # 分析内存使用模式  
redis-cli --bigkeys  
redis-cli --memkeys
内存优化配置
# 最大内存限制  
maxmemory 2gb  # 内存淘汰策略  
maxmemory-policy allkeys-lru  # 可选的淘汰策略:  
# noeviction:不淘汰,内存满时返回错误  
# allkeys-lru:在所有键中使用LRU淘汰  
# volatile-lru:在设置了过期时间的键中使用LRU淘汰  
# allkeys-random:随机淘汰所有键  
# volatile-random:随机淘汰设置了过期时间的键  
# volatile-ttl:淘汰即将过期的键  # 内存采样精度  
maxmemory-samples 5
网络优化
# TCP keepalive  
tcp-keepalive 300  # 客户端连接超时  
timeout 0  # 客户端输出缓冲区限制  
client-output-buffer-limit normal 0 0 0  
client-output-buffer-limit replica 256mb 64mb 60  
client-output-buffer-limit pubsub 32mb 8mb 60  # 最大客户端连接数  
maxclients 10000
性能监控
# 实时监控命令  
MONITOR  # 查看慢查询日志  
SLOWLOG GET 10  
SLOWLOG LEN  
SLOWLOG RESET  # 慢查询配置  
slowlog-log-slower-than 10000    # 微秒  
slowlog-max-len 128  # 查看连接的客户端  
CLIENT LIST  
CLIENT KILL ip:port  # 延迟监控  
redis-cli --latency  
redis-cli --latency-history  
redis-cli --latency-dist

数据结构优化

字符串优化
# 使用整数而不是字符串(如果可能)  
SET counter 123    # 而不是 SET counter "123"  # 压缩长字符串  
# 在应用层使用压缩算法
哈希优化
# 哈希表配置  
hash-max-ziplist-entries 512  
hash-max-ziplist-value 64  # 小哈希表会使用压缩列表存储
列表优化
# 列表配置  
list-max-ziplist-size -2    # 每个节点最大8KB  
list-compress-depth 0       # 压缩深度
集合优化
# 集合配置  
set-max-intset-entries 512  # 小整数集合会使用整数集合存储
有序集合优化
# 有序集合配置  
zset-max-ziplist-entries 128  
zset-max-ziplist-value 64

http://www.dtcms.com/a/361571.html

相关文章:

  • 构建线上门户的核心三要素:域名、DNS与IP 全面解析
  • 移动开发如何给不同手机屏幕做适配
  • RK3588部署yolov8目标检测
  • Rust序列化与反序列化-Serde 开发指南:从入门到实战
  • php + docker + idea debug
  • Elasticsearch面试精讲 Day 4:集群发现与节点角色
  • Ubuntu 22.04 装机黑屏(Nvidia显卡) 安装
  • 如何在 vscode 上用 git 将项目 push 到远程仓库 and 常用Git 命令
  • ubuntu 创建系统服务 开机自启
  • 毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行
  • 【Node.js教程】Express框架入门:从搭建到动态渲染商品列表
  • 数据结构基础--最小生成树
  • MiniCPM-V 4.5实战,实现图片、视频、多图的推理
  • Python 爬虫实战:爬取 B 站视频的完整教程
  • 【RK3576】【Android14】PMIC电源管理
  • 【学Python自动化】 6.1 Python 模块系统学习笔记 (与 Rust 对照)
  • 数据结构:单链表的应用(力扣算法题)第三章
  • Windows 电脑安装dify
  • Go初级之六:接口(Interface)
  • VBA开发者的福音:让代码效率暴涨300%的终极数据结构选择指南
  • git使用详解和实战示例
  • 【学习笔记】从“两个细则”到“四遥”
  • docker安装redis,进入命令窗口基操练习命令
  • KubeBlocks for Milvus 揭秘
  • 学习 Android (十八) 学习 OpenCV (三)
  • 向量数据库概述:Faiss、Milvus、Qdrant、Chroma、Weaviate
  • AI 时代的用户体验设计:设计师会被替代,还是更值钱?
  • TCP连接状态详解/同时打开Simultaneous Open
  • 动态滑动窗口还搞不清?一文搞定动态滑动窗口 | 基础算法
  • 如何将多个Excel报表合并为一个汇总文件?