ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Redis 7 核心数据结构、常用命令与实战场景全解析

Redis 7 核心数据结构、常用命令与实战场景全解析 一、Redis 数据结构总览Redis 7 提供了丰富的数据结构核心版包括 String、Hash、List、Set、ZSet 五种基础类型扩展版则包括 Bitmap、HyperLogLog、Geo、Stream 等高级类型。掌握这些数据结构及其适用场景是高效使用 Redis 的关键。在 Redis 命令行中输入help可以查看所有命令的帮助信息这是学习和记忆 Redis 命令的“永远的神”。二、String 字符串类型1. 常用命令String 是最基础的数据结构支持单值存储、批量操作、原子加减等能力。命令说明SET key value存入字符串键值对MSET key value [key value ...]批量存储字符串键值对SETNX key value存入一个不存在的字符串键值对GET key获取一个字符串键值MGET key [key ...]批量获取字符串键值DEL key [key ...]删除一个键EXPIRE key seconds设置键的过期时间秒INCR key将 key 中储存的数字值加 1DECR key将 key 中储存的数字值减 1INCRBY key increment将 key 所储存的值加上 incrementDECRBY key decrement将 key 所储存的值减去 decrement2. 实战场景单值缓存使用 SET 和 APPEND 实现单值缓存例如缓存用户 Token、验证码等。SET key value APPEND key value对象缓存可以将对象序列化为 JSON 字符串存储也可以拆分为多个字段批量存储。SET user:1 {name:roy,balance:1888} MSET user:1:name roy user:1:balance 1888 MGET user:1:name user:1:balance分布式锁利用 SETNX 实现分布式锁配合 EXPIRE 防止死锁。SETNX product:10001 true # 返回 1 代表获取锁成功 SETNX product:10001 true # 返回 0 代表获取锁失败 # 执行业务操作 DEL product:10001 # 执行完业务释放锁 SET product:10001 true ex 10 nx # 防止程序意外终止导致死锁三、Hash 哈希类型1. 常用命令Hash 适合存储对象以 field-value 形式组织数据比 String 更节省空间。命令说明HSET key field value存储一个哈希表 key 的键值HSETNX key field value存储一个不存在的哈希表 key 的键值HMSET key field value [field value ...]在一个哈希表 key 中存储多个键值对HGET key field获取哈希表 key 对应的 field 键值HMGET key field [field ...]批量获取哈希表 key 中多个 field 键值HDEL key field [field ...]删除哈希表 key 中的 field 键值HLEN key返回哈希表 key 中 field 的数量HGETALL key返回哈希表 key 中所有的键值HINCRBY key field increment为哈希表 key 中 field 键的值加上增量 increment2. 实战场景对象缓存Hash 天然适合存储对象属性避免序列化和反序列化开销。HSET user:1 name roy balance 1888 HMGET user:1 name balance电商购物车以用户 id 为 key商品 id 为 field商品数量为 value。# 添加商品 HSET cart:1001 10088 1 # 增加数量 HINCRBY cart:1001 10088 1 # 商品总数 HLEN cart:1001 # 删除商品 HDEL cart:1001 10088 # 获取购物车所有商品 HGETALL cart:10013. 优缺点分析优点同类数据归类整合存储方便数据管理。相比 String 操作消耗内存与 CPU 更小。相比 String 存储更节省空间。缺点过期功能不能使用在 field 上只能用在 key 上。Redis 集群架构下不适合大规模使用。四、List 列表类型1. 常用命令List 是双向链表结构支持双端操作适合实现队列、栈等数据结构。命令说明LPUSH key value [value ...]将一个或多个值插入到 key 列表的表头最左边RPUSH key value [value ...]将一个或多个值插入到 key 列表的表尾最右边LPOP key移除并返回 key 列表的头元素RPOP key移除并返回 key 列表的尾元素LRANGE key start stop返回列表 key 中指定区间内的元素BLPOP key [key ...] timeout从表头弹出一个元素若列表为空则阻塞等待 timeout 秒timeout0 表示一直阻塞BRPOP key [key ...] timeout从表尾弹出一个元素若列表为空则阻塞等待 timeout 秒2. 实战场景List 可以组合出多种常用数据结构Stack栈 LPUSH LPOPQueue队列 LPUSH RPOPBlocking MQ阻塞队列 LPUSH BRPOP常见应用场景包括视频列表、签到列表、排队机、简化版的消息队列MQ。3. 注意事项一个 List 的容量是 2 的 32 次方减 1 个元素约 40 多亿但要注意大 key 问题。List 底层是双向链表双端操作性能很高但通过索引直接操作中间节点性能较低。五、Set 集合类型1. 常用命令Set 是无序集合元素唯一支持集合运算适合去重和关系运算场景。命令说明SADD key member [member ...]往集合 key 中存入元素元素存在则忽略SREM key member [member ...]从集合 key 中删除元素SMEMBERS key获取集合 key 中所有元素SCARD key获取集合 key 的元素个数SISMEMBER key member判断 member 元素是否存在于集合 key 中SRANDMEMBER key [count]从集合 key 中选出 count 个元素元素不从 key 中删除SPOP key [count]从集合 key 中选出 count 个元素元素从 key 中删除2. 集合运算命令命令说明SINTER key [key ...]交集运算SINTERSTORE destination key [key ...]将交集结果存入新集合SUNION key [key ...]并集运算SUNIONSTORE destination key [key ...]将并集结果存入新集合SDIFF key [key ...]差集运算SDIFFSTORE destination key [key ...]将差集结果存入新集合3. 实战场景微信抽奖小程序# 点击参与抽奖加入集合 SADD key {userID} # 查看参与抽奖所有用户 SMEMBERS key # 抽取 count 名中奖者 SRANDMEMBER key [count] / SPOP key [count]微信微博点赞、收藏、标签# 点赞 SADD like:{消息ID} {用户ID} # 取消点赞 SREM like:{消息ID} {用户ID} # 检查用户是否点过赞 SISMEMBER like:{消息ID} {用户ID} # 获取点赞的用户列表 SMEMBERS like:{消息ID} # 获取点赞用户数 SCARD like:{消息ID}集合运算应用SINTER set1 set2 set3 # 共同关注的人 SUNION set1 set2 set3 # 朋友圈的人 SDIFF set1 set2 set3 # 推荐好友六、ZSet 有序集合类型1. 常用命令ZSet 在 Set 的基础上增加了 score 分值元素按分值排序适合排行榜等场景。命令说明ZADD key score member [[score member]...]往有序集合 key 中加入带分值元素ZREM key member [member ...]从有序集合 key 中删除元素ZSCORE key member返回元素 member 的分值ZINCRBY key increment member为元素 member 的分值加上 incrementZCARD key返回有序集合 key 中元素个数ZRANGE key start stop [WITHSCORES]正序获取指定下标区间的元素ZREVRANGE key start stop [WITHSCORES]倒序获取指定下标区间的元素2. 集合运算命令命令说明ZUNIONSTORE destkey numkeys key [key ...]并集计算ZINTERSTORE destkey numkeys key [key ...]交集计算3. 实战场景排行榜# 点击新闻分值加 1 ZINCRBY hotNews:20190819 1 守护香港 # 展示当日排行前十 ZREVRANGE hotNews:20190819 0 9 WITHSCORES # 七日搜索榜单计算 ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814 ... hotNews:20190819 # 展示七日排行前十 ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES七、Bitmap 位图类型1. 常用命令Bitmap 基于 String 类型按位存储适合签到、在线状态等场景。命令说明SETBIT key offset value将 offset 位置设置成 valuevalue 只能是 0 或 1GETBIT key offset返回 offset 位置的值BITCOUNT key [start end [BYTE|BIT]]返回二进制数组中 1 的个数BITPOS key bit [start [end [BYTE|BIT]]]返回第一个值为 bit 的 offset 位置BITOP AND|OR|XOR|NOT destkey key [key ...]对多个 bitmap 做二进制的与或非计算2. 实战场景每日签到# 1 号用户第 100 天完成签到 SETBIT dailycheck:1 100 1 # 统计 1 号用户的签到次数 BITCOUNT dailycheck:1 # 统计 1 号用户第一天签到的时间 BITPOS dailycheck:1优点快速、高效、节省空间。八、HyperLogLog 类型1. 作用介绍HyperLogLog 用于统计一个集合中不重复元素的个数典型应用场景是根据用户访问记录统计网站的 UV独立访客数。2. 常用命令命令说明PFADD key element [element ...]添加元素PFCOUNT key统计不同的独立访客PFMERGE destkey [sourcekey ...]将多个 HyperLogLog 数据整合成一条记录3. 实战示例# 添加用户访问记录 PFADD visitlog 192.168.65.111 192.168.65.112 192.168.65.111 # 统计不同的独立访客 PFCOUNT visitlog九、Geo 地理位置类型1. 常用命令Geo 用于存储地理位置信息支持距离计算和附近地点查询。命令说明GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]添加一个或多个地点GEOPOS key [member [member ...]]返回地址的经纬度GEODIST key member1 member2 [M|KM|FT|MI]计算两个地点之间的距离GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key]查询某个经纬度地址附近的地点GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]查询某个地点附近的地点2. 实战场景获取经纬度可以通过百度地图坐标拾取工具获取地点的经纬度。https://api.map.baidu.com/lbsapi/getpoint/index.html添加商家地址GEOADD changsha 113.017489 28.200454 火车站 GEOADD changsha 112.96903 28.201195 橘子洲 113.017031 28.199706 赛格广场 113.017004 28.197677 国储查询距离GEODIST changsha 火车站 橘子洲 M查找火车站附近的景点GEORADIUSBYMEMBER changsha 火车站 2 KM withdist withcoord count 4 withhash十、Stream 流类型1. 作用介绍Stream 是 Redis 5.0 引入的消息队列类型可以看作是 Redis 版的 MQ结合了阻塞队列和发布订阅pub/sub的能力。相比 List 实现的简单队列Stream 支持消费者组、消息持久化和消费进度管理功能更完整。不过目前企业应用相对较少了解即可。2. 常用命令命令说明XADD key [NOMKSTREAM] [MAXLEN|MINID [|~] threshold [LIMIT count]] *|id field value [field value ...]往队列的末尾发布一条消息XDEL key id [id ...]删除队列中的一条消息XLEN key获取队列的长度XRANGE key start end [COUNT count]查询队列中的消息3. 实战示例创建队列并添加消息* 表示让系统自动生成 ID。XADD mystream * name loulan name roy name admin查看队列消息- 表示队列开始 表示队列结尾。XRANGE mystream - 创建消费者组0 表示从队列头部开始消费$ 表示从队列尾部开始消费。XGROUP CREATE mystream groupA 0消费消息 表示从第一条未被消费过的消息开始消费也可以指定具体的 ID。XREADGROUP GROUP groupA consumer1 count 2 STREAMS mystream 查看消费者组的消费进度XPENDING mystream groupA
返回列表