Redis入门:5大数据类型全解析
引言在前面的文章中我们系统学习了 MySQL 关系型数据库。然而在高并发场景下MySQL 的磁盘 I/O 往往会成为性能瓶颈。这时就需要引入一种基于内存的数据库——Redis它可以将频繁访问的热点数据缓存到内存中读写速度可达每秒10万次以上。Redis 常与 MySQL 配合使用构成MySQL 持久化存储 Redis 缓存的经典架构。本文将详细讲解 Redis 的安装、五种基本数据类型及其完整操作命令。第一部分Redis 基础一、什么是 Redis属性说明全称REmote DIctionary Server开发语言C 语言存储介质内存掉电丢失需持久化默认端口6379架构模式CS 架构redis-server redis-cli数据库类型NoSQL非关系型键值对存储二、Redis vs MySQL对比项MySQLRedis数据库类型关系型SQL非关系型NoSQL存储介质磁盘内存数据格式表行列键值对 多种数据结构读写速度数千次/秒10万次/秒持久化天然持久化需额外配置RDB/AOF事务ACID 严格弱事务无回滚三、安装 Redis# 切换管理员权限sudo su# 安装 Redis客户端自动安装apt install redis-server# 查看服务状态service redis status# 查看端口监听netstat -natp | grep 6379# 连接客户端redis-cli# 测试连接127.0.0.1:6379 pingPONG四、基本全局命令# 切换数据库默认 16 个编号 0-15SELECT 0# 查看当前数据库键数量DBSIZE# 查看所有键KEYS *# 判断键是否存在EXISTS key# 查看键的类型TYPE key# 删除键DEL key# 清空当前数据库FLUSHDB# 清空所有数据库FLUSHALL# 设置过期时间秒EXPIRE key seconds# 查看剩余时间-1 永不过期-2 已过期TTL key第二部分五种基本数据类型一、字符串 StringString 是 Redis 最基础的类型二进制安全最大能存储512MB。可以存文本、数字、甚至序列化后的对象。1.1 基本读写# 设置值SET name disen# 获取值GET name# 输出disen# 多个键值对批量设置MSET key1 val1 key2 val2# 多个键值对批量获取MGET key1 key21.2 数值操作虽然存储为字符串但 Redis 能识别整数格式并进行原子运算# 自增 1SET count 10INCR countGET count # 11# 自减 1DECR count # 10# 指定步长增减INCRBY count 5 # 15DECRBY count 3 # 12应用场景文章浏览量统计、计数器、限流器。1.3 字符串操作# 追加字符串SET s helloAPPEND s worldGET s # hello world# 获取字符串长度STRLEN s # 11# 获取子串索引从 0 开始负值从末尾计GETRANGE s 0 4 # helloGETRANGE s 6 -1 # world# 替换子串SETRANGE s 6 RedisGET s # hello Redis二、列表 ListList 是双向链表支持两端操作可以模拟栈和队列。单个列表最多存储2³² - 1 个元素约 40 亿。2.1 插入与弹出# 从左侧插入 LPUSH mylist 1 # [1] LPUSH mylist 2 # [2, 1] LPUSH mylist 3 # [3, 2, 1] # 从右侧插入 RPUSH mylist 4 # [3, 2, 1, 4] # 从左侧弹出 LPOP mylist # 返回 3列表变为 [2, 1, 4] # 从右侧弹出 RPOP mylist # 返回 4列表变为 [2, 1]2.2 范围查询# 查看所有元素 LRANGE mylist 0 -1 # 返回全部 # 查看前两个 LRANGE mylist 0 1 # 查看倒数两个 LRANGE mylist -2 -12.3 进阶操作# 获取列表长度 LLEN mylist # 根据索引获取元素 LINDEX mylist 0 # 根据索引设置元素值 LSET mylist 0 newval # 删除指定数量的匹配元素count0从左0从右0删除全部 LREM mylist 2 val # 从左删除 2 个值为 val 的元素 # 元素转移将 m1 的右侧元素弹出插入到 m2 的左侧 RPOPLPUSH m1 m2三、集合 SetSet 是无序的、元素不重复的集合。底层用哈希表实现最多存储2³² - 1 个元素。3.1 基本操作# 添加元素返回 1 表示新增返回 0 表示重复 SADD myset xiaowang SADD myset xiaoli xiaoming # 批量添加 # 查看所有元素 SMEMBERS myset # 判断元素是否存在1存在0不存在 SISMEMBER myset xiaowang # 获取元素个数 SCARD myset # 删除元素 SREM myset xiaowang # 随机获取元素不删除 SRANDMEMBER myset 13.2 集合运算SADD setA 1 2 3 4 SADD setB 3 4 5 6 # 交集 SINTER setA setB # {3, 4} # 并集 SUNION setA setB # {1, 2, 3, 4, 5, 6} # 差集 SDIFF setA setB # {1, 2}应用场景抽奖系统SRANDMEMBER随机抽取中奖者共同关注取两个用户的粉丝集合交集好友推荐取差集发现你可能认识的人四、哈希 HashHash 可以理解为一个Map字段, 值特别适合存储对象。4.1 基本操作# 设置单个字段 HSET student:1 id 1001 HSET student:1 name 小白 HSET student:1 age 23 # 获取单个字段 HGET student:1 name # 小白 # 批量设置多个字段 HMSET student:2 id 1002 name 小黑 age 24 # 批量获取多个字段 HMGET student:2 id name # 获取所有字段和值 HGETALL student:1 # 获取所有字段名 HKEYS student:1 # 获取所有值 HVALS student:1 # 删除字段 HDEL student:1 ageHash vs String 存储对象对比方式优点缺点String 存 JSON简单修改一个字段需要整体序列化Hash 分字段可单独读写字段稍微复杂五、有序集合 ZSetZSet 在 Set 的基础上为每个元素关联一个score分数元素按 score自动排序。5.1 基本操作# 添加元素score 在前member 在后 ZADD rank 98 小王 ZADD rank 95 小李 87 小明 72 小红 # 批量添加 # 查看元素升序 ZRANGE rank 0 -1 # 全部按 score 升序 ZRANGE rank 0 -1 WITHSCORES # 带分数 # 查看元素降序 ZREVRANGE rank 0 -1 WITHSCORES # 按 score 范围查询 ZRANGEBYSCORE rank 80 100 # 获取元素 score ZSCORE rank 小王 # 获取元素排名升序从 0 开始 ZRANK rank 小王 # 获取元素个数 ZCARD rank # 删除元素 ZREM rank 小明应用场景排行榜游戏积分榜、销量榜、热搜榜带权重的任务队列优先级高的任务先执行延迟队列score 执行时间戳按时间顺序执行第三部分地理信息 GEORedis 3.2 支持地理位置存储底层使用ZSet 实现。# 添加城市经纬度经度纬度名称 GEOADD china:city 116.40 39.90 beijing GEOADD china:city 121.47 31.23 shanghai GEOADD china:city 108.94 34.26 xian GEOADD china:city 106.50 29.53 chongqing # 获取城市经纬度 GEOPOS china:city xian # 计算两城市直线距离单位km GEODIST china:city xian beijing km # 约 910 km # 查找指定城市周围 1000km 内的城市 GEORADIUSBYMEMBER china:city xian 1000 km应用场景网约车查找附近车辆、附近商家推荐、LBS 社交。第四部分Redis 进阶概念速览一、持久化方式原理优点缺点RDB定期快照全量数据恢复快文件小可能丢失最后一次快照后的数据AOF记录每条写操作日志数据更安全文件大恢复慢二、缓存三大问题问题现象解决方案缓存穿透查询不存在的数据请求穿透到 MySQL布隆过滤器、空值缓存缓存击穿热点 key 过期大量请求打到 MySQL互斥锁、永不过期缓存雪崩大量 key 同时过期过期时间加随机值、多级缓存三、主从复制第五部分数据类型对比总结类型特点适用场景String键值对二进制安全缓存对象、计数器、分布式锁List双向链表有序可重复消息队列、最新消息、栈Set无序、不重复、支持交并差抽奖、共同关注、标签HashMap 结构字段单独操作对象存储、购物车ZSet有序 Set按 score 排序排行榜、优先级队列、延迟队列GEO地理位置底层 ZSet附近的人、网约车总结一、Redis 核心命令速查类型增删改查StringSETDELSET/APPENDGETListLPUSH/RPUSHLPOP/RPOP/DELLSETLRANGESetSADDSREM/DEL—SMEMBERSHashHSETHDEL/DELHSETHGET/HGETALLZSetZADDZREM/DELZADD(更新score)ZRANGE/ZSCOREGEOGEOADDZREM—GEOPOS/GEODIST二、Redis 与 MySQL 配合使用三、一句话记忆Redis 是基于内存的 NoSQL 数据库默认端口 6379支持 String、List、Set、Hash、ZSet 五种基本类型和 GEO 地理位置类型常作为 MySQL 的缓存层使用读写速度可达 10 万次/秒以上。