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

Redis 的一些关键知识点及示例

Redis 是一个开源的内存数据结构存储系统,广泛用于缓存、消息队列、实时分析等场景。以下是 Redis 的一些关键知识点及示例:

1. 基本数据类型

Redis 支持多种数据类型,每种数据类型都有其特定的操作命令。

1.1 字符串 (String)

字符串是 Redis 中最基本的数据类型,可以存储任何类型的值。

# 设置键值对
SET key "value"# 获取键值
GET key# 示例
SET name "Alice"
GET name  # 返回 "Alice"

1.2 哈希 (Hash)

哈希是一个键值对集合,适合存储对象。

# 设置哈希字段
HSET user:1 name "Alice"
HSET user:1 age 30# 获取哈希字段
HGET user:1 name# 示例
HSET user:1 name "Alice"
HSET user:1 age 30
HGET user:1 name  # 返回 "Alice"
HGETALL user:1  # 返回所有字段和值

1.3 列表 (List)

列表是一个有序的字符串集合,可以从两端进行操作。

# 从左侧插入元素
LPUSH list1 "a"
LPUSH list1 "b"# 从右侧插入元素
RPUSH list1 "c"# 获取列表长度
LLEN list1# 弹出左侧第一个元素
LPOP list1# 获取列表中的所有元素
LRANGE list1 0 -1# 示例
LPUSH list1 "a"  # list1: ["a"]
LPUSH list1 "b"  # list1: ["b", "a"]
RPUSH list1 "c"  # list1: ["b", "a", "c"]
LLEN list1       # 返回 3
LPOP list1       # 返回 "b", list1: ["a", "c"]
LRANGE list1 0 -1 # 返回 ["a", "c"]

1.4 集合 (Set)

集合是一个无序的字符串集合,自动去重。

# 添加元素到集合
SADD set1 "a"
SADD set1 "b"
SADD set1 "a"  # 重复元素不会被添加# 获取集合中的所有元素
SMEMBERS set1# 检查元素是否在集合中
SISMEMBER set1 "a"# 示例
SADD set1 "a"  # set1: {"a"}
SADD set1 "b"  # set1: {"a", "b"}
SADD set1 "a"  # set1: {"a", "b"}
SMEMBERS set1  # 返回 {"a", "b"}
SISMEMBER set1 "a"  # 返回 1 (true)
SISMEMBER set1 "c"  # 返回 0 (false)

1.5 有序集合 (Sorted Set)

有序集合类似于集合,但每个元素都会关联一个分数,元素按分数排序。

# 添加元素到有序集合
ZADD zset1 1 "a"  # zset1: {"a": 1}
ZADD zset1 2 "b"  # zset1: {"a": 1, "b": 2}# 获取有序集合中的所有元素
ZRANGE zset1 0 -1   # 返回 ["a", "b"]# 获取有序集合中元素的分数
ZSCORE zset1 "a"  # 返回 1

2. 发布/订阅 (Pub/Sub)

Redis 支持发布/订阅消息模式,适用于实时消息传递。

# 订阅频道
SUBSCRIBE channel1# 发布消息到频道
PUBLISH channel1 "Hello, World!"# 示例
# 终端1:
SUBSCRIBE channel1  # 订阅 channel1# 终端2:
PUBLISH channel1 "Hello, World!"  # 订阅者会收到消息 "Hello, World!"

3. 事务 (Transaction)

事务允许一次执行多个命令,保证原子性。

# 开始事务
MULTI# 添加命令到事务队列
SET key1 "value1"
SET key2 "value2"# 执行事务
EXEC# 示例
MULTI
SET key1 "value1"
SET key2 "value2"
EXEC  # 两个 SET 命令会被原子性地执行

4. 脚本 (Scripting)

Redis 支持使用 Lua 脚本执行复杂操作。

# 执行 Lua 脚本
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 key "value"  # 等同于 SET key "value"

5. 持久化 (Persistence)

Redis 提供两种持久化方式:RDB 快照和 AOF 日志。

5.1 RDB (Redis Database)

RDB 是一种快照方式,将数据在某个时间点保存到磁盘。

# 手动触发 RDB 快照
SAVE  # 同步保存数据到磁盘# 异步触发 RDB 快照
BGSAVE   # 异步保存数据到磁盘

5.2 AOF (Append Only File)

AOF 记录每个写操作日志,重启时重放日志以恢复数据。

# 启用 AOF
CONFIG SET appendonly yes# 手动重写 AOF 文件 以减少体积
BGREWRITEAOF

6. 主从复制 (Replication)

Redis 支持主从复制,实现数据的高可用和读写分离。

# 配置从节点
SLAVEOF master_host master_port# 示例
SLAVEOF 127.0.0.1 6379  # 将当前节点配置为 127.0.0.1:6379 的从节点

7. 哨兵 (Sentinel)

哨兵用于监控 Redis 实例,实现自动故障转移。

# 启动哨兵
redis-sentinel /path/to/sentinel.conf# 示例
# sentinel.conf 配置文件中定义了主节点和监控参数
sentinel monitor mymaster 127.0.0.1 6379 2  # 监控主节点 mymaster

8. 集群 (Cluster)

Redis 集群允许在多个节点间分布数据,实现高可用和可扩展性。

# 创建集群
redis-cli --cluster create host1:port1 host2:port2 host3:port3 --cluster-replicas 1# 示例
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

9. 常用配置

Redis 提供多种配置选项,可以通过配置文件或命令行进行设置。

# 查看当前配置
CONFIG GET *# 设置最大内存为 256MB
CONFIG SET maxmemory 256mb

10. 安全性

Redis 提供密码保护和访问控制列表 (ACL) 来增强安全性。

# 设置密码
CONFIG SET requirepass "yourpassword"# 使用密码连接
redis-cli -a "yourpassword"

11. 性能优化

通过合理配置和使用,可以提升 Redis 的性能。

11.1 内存优化

使用合适的数据类型
合理设置最大内存和内存淘汰策略

Copy
# 设置最大内存
CONFIG SET maxmemory 256mb# 设置内存淘汰策略为 LRU
CONFIG SET maxmemory-policy allkeys-lru 

11.2 网络优化

使用更高效的网络协议
合理配置客户端连接数

# 设置最大客户端连接数
CONFIG SET maxclients 10000

11.3 持久化优化

根据业务需求选择合适的持久化方式
调整 RDB 和 AOF 的配置参数

# 设置 RDB 快照频率
CONFIG SET save "900 1 300 10 60 10000"# 设置 AOF 同步频率为每秒一次
CONFIG SET appendfsync everysec

12. 常见问题

12.1 内存不足

# 检查内存使用情况
INFO memory# 清理不必要的数据
DEL old_key  

12.2 性能瓶颈

分析慢查询日志
优化数据结构和访问模式
考虑使用集群或分片

# 设置慢查询日志阈值为 10 毫秒
CONFIG SET slowlog-log-slower-than 10000# 查看慢查询日志
SLOWLOG GET

12.3 数据丢失

检查持久化配置
确保主从复制和哨兵配置正确
定期备份数据

# 查看 RDB 配置
CONFIG GET save# 查看 AOF 配置
CONFIG GET appendonly# 手动触发备份
BGSAVE

13. 高级特性

13.1 Bitmaps

Bitmaps 是一种特殊的数据结构,用于处理位操作。

# 设置某个位的值
SETBIT bitmap1 7 1# 获取某个位的值
GETBIT bitmap1 7# 统计位图中值为1的位数
BITCOUNT bitmap1# 示例
SETBIT bitmap1 7 1  # 将 bitmap1 的第8位设置为1
GETBIT bitmap1 7  # 获取 bitmap1 的第8位的值,返回1
BITCOUNT bitmap1  # 统计 bitmap1 中值为1的位数,返回1

13.2 HyperLogLog

HyperLogLog 是一种用于基数估计算法的数据结构,适用于大规模数据去重统计。

# 添加元素到 HyperLogLog
PFADD hll1 "a" "b" "c"   # 添加元素到 hll1# 获取基数估计值
PFCOUNT hll1# 合并多个 HyperLogLog
PFMERGE hll2 hll1

13.3 Geospatial

Redis 提供地理空间数据的存储和操作功能。

# 添加地理空间数据
GEOADD locations 13.361389 38.115556 "Palermo"  # 添加地理位置 Palermo
GEOADD locations 15.087269 37.502669 "Catania"  # 添加地理位置 Catania# 获取地理空间数据的距离
GEODIST locations "Palermo" "Catania" km   # 获取 Palermo 和 Catania 之间的距离,返回166.2742 km# 获取指定范围内的地理空间数据
GEORADIUS locations 15 37 200 km # 获取指定范围内的地理位置

14. 实用工具

14.1 Redis CLI

Redis CLI 是 Redis 提供的命令行工具,用于与 Redis 服务器交互。

# 连接到 Redis 服务器
redis-cli -h host -p port# 执行 Redis 命令
redis-cli SET key "value"# 示例
redis-cli -h 127.0.0.1 -p 6379  # 连接到本地 Redis 服务器
redis-cli SET key "value"  # 设置键值对

14.2 Redis Sentinel

Redis Sentinel 是用于监控 Redis 实例和实现高可用性的工具。

# 启动 Redis Sentinel
redis-sentinel /path/to/sentinel.conf

14.3 Redis Cluster
Redis Cluster 是用于实现 Redis 分布式存储的工具。

# 创建 Redis 集群
redis-cli --cluster create host1:port1 host2:port2 host3:port3 --cluster-replicas 1# 示例
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1  # 创建 Redis 集群

15. Redis 客户端

除了 Redis CLI,Redis 还支持多种编程语言的客户端库,常见的有:
Python: redis-py
Java: Jedis
Node.js: node_redis
Go: go-redis

15.1 Python 示例

import redis# 连接到 Redis 服务器
r = redis.Redis(host='localhost', port=6379, db=0)# 设置键值对
r.set('key', 'value')# 获取键值对
value = r.get('key')
print(value)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】
  • 基于Python定向爬虫技术对微博数据可视化设计与实现
  • gitblit 环境搭建,服务器迁移记录
  • 嵌入式单片机产品微波炉拆解分享
  • 信息学奥赛初赛天天练-24-二叉树、N叉树遍历技巧与前缀表达式、中缀表达式、后缀表达式应用实战演练
  • 【xilinx】使用vivado编译中methodology的相关介绍
  • 原来你长这个样子啊,Java字节码文件
  • 基于栅格占据概率和距离场的机器人覆盖轨迹模拟
  • Linux安装MySQL教程【带图文命令巨详细】
  • springcloudalibaba项目注册nacos,在nacos上修改配置项不生效问题
  • Zabbix6.0自定义监控项
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • win10文件夹.git或者文件被隐藏的开启姿势
  • Halcon 双相机标定与拼图(一)
  • 内存管理--3.用幻灯片讲解C++手动内存管理
  • JS 中的深拷贝与浅拷贝
  • 【Linux系统编程】快速查找errno错误码信息
  • android图片蒙层
  • CentOS6 编译安装 redis-3.2.3
  • egg(89)--egg之redis的发布和订阅
  • HTTP中GET与POST的区别 99%的错误认识
  • Javascript弹出层-初探
  • Promise面试题2实现异步串行执行
  • React Transition Group -- Transition 组件
  • React 快速上手 - 07 前端路由 react-router
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Xmanager 远程桌面 CentOS 7
  • 复习Javascript专题(四):js中的深浅拷贝
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 小程序测试方案初探
  • 一个JAVA程序员成长之路分享
  • Java数据解析之JSON
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014# day.1 T2 联合权值
  • $L^p$ 调和函数恒为零
  • ( 10 )MySQL中的外键
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Note)C++中的继承方式
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (理论篇)httpmoudle和httphandler一览
  • (四)鸿鹄云架构一服务注册中心
  • (原)本想说脏话,奈何已放下
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CLR基本术语
  • .NET NPOI导出Excel详解
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • @Autowired自动装配
  • @ComponentScan比较
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [Android]常见的数据传递方式