Redis应用场景

文章详细介绍了Redis中的五种基本数据类型:String、List、Set、Hash和Zset,包括它们的操作和应用场景。例如,String常用于单值缓存和计数器,List可实现分布式队列,Set适用于抽奖和点赞功能,Hash适合对象缓存,而Zset能构建排行榜。此外,文章还讨论了这些数据类型的使用策略和实际应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis的五种基本数据类型

结构类型

结构存储的值

结构的读写能力

String字符串

可以是字符串、整数或浮点数

对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;

List列表

一个链表,链表上的每个节点都包含一个字符串

对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;

Set集合

包含字符串的无序集合

字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等

Hash散列

包含键值对的无序散列表

包含方法有添加、获取、删除单个元素

Zset有序集合

和散列一样,用于存储键值对

字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

  1. 字符串常用操作:

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中存储的值加1

DECR //将key中存储的值减1

INCRBY key increment //将key中存储的值加上increment

DECRBY key decrement //将key中存储的值减去increment

应用场景:

①单值缓存

SET key value

GET VALUE

可以将商品的库存存入redis,在缓存中减少商品效率更高

②对象缓存(登录验证)

SET user:1 value(json格式数据)

③分布式锁

线程1: SETNX product:10001 true //返回1代表获取锁成功

线程2: SETNX product:10001 true //返回0代表获取锁失败

...执行业务操作

DEL product:10001 //执行完业务释放锁

SET product:10001 true ex 10 nx //防止程序意外终止导致死锁

④计数器

INCR article:readCount: {文章id}

GET article:readCount: {文章id}

⑤分布式系统全局序列号(分库分表的情况下,主键保证不重复)

INCR orderId //如果订单数量大 redis压力会很大

INCRBY oderId 100 //redis批量生成序列号提升性能 直接分配100个 在内存中++,也能保证id不会重复

  1. Hash常用操作

HSET key field value //存储一个哈希表key的键值

HSETNX key field value //存储一个不存在的哈希表key的键值

HMSET key field value [field value ...] //在一个哈希表存入多个键值对

HGET key field //获取哈希表key中对应field的值

HMGET key field [field ...] // 批量获取field值

HDEL key field [field ...] // 删除key中field值

HLEN key //获取key中field的数量

HGETALL key //返回哈希表key中所有的键值

HINCRBY key fileld increment //为哈希表key中field键的值加上增量increment

应用场景:

①对象缓存

HMSET user 1:name zhuge 1:balance 1888

HMGET user 1:name 1:balance //哈希的存储方式比直接把对象装备json(String类型存储)的好处主要体现在可以灵活操作某一个field的value,如果使用string类型存储则需要先反序列化再进行操作

②电商购物车

  1. 以用户id为key

  1. 商品id为field

  1. 商品数量为value

购物车操作

  1. 添加商品->hset cart:1001 10088 1

  1. 增加数量->hincrby cart:1001 10088 1

  1. 商品总数->hlen cart:1001

  1. 删除商品 ->hdel cart:1001 10088

  1. 获取购物车所有商品->hgetall cart:1001

  1. List常用操作:

LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)

RPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最右边)

LPOP key //从左边移出并返回列表的元素(头)

LPOP key //从右边移出并返回列表的元素(尾)

LRANGE key start stop //返回列表指定区间内的元素

BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直等待

BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直等待

应用场景:

①常用分布式数据结构

Stack(栈) = LPUSH + LPOP

Queue(队列) = LPUSH + RPOP

Blocking MQ(阻塞队列) = LPUSH + BRPOP

②微博消息和微信公众号消息(适用粉丝少)

使用关系型数据存储,消息会有很多,查询最新的消息需要oderBy ,orderBy比较耗时,尤其数据量大的时候

小明关注了备胎说车,MacTtalk,等大v

备胎说车发微博,消息id为10018 # LPUSH msg :{小明-id} 10018

MacTtalk发微博,消息id为10016 # LPUSH msg :{小明-id} 10016

查看最新微博消息: LRANGE msg:{小明-id} 0 4

  1. Set集合:

常用操作:

SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,不存在则新建

SREM key member [member ...] //从集合key中删除元素

SMEMBERS key //获取集合中所有元素

SCARD key //获取集合key的元素个数

SISMEMBER key member //判断member元素是否存在于集合key中

SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除

STOP key [count] //从集合key中选出count个元素,元素从key中删除

Set运算操作:

SINTER key [key ...] //交集运算

SINTERSTORE destination key [key ...] //将交集结果存入新集合 destination中

SUNION key [key ...] //并集运算

SUNIONSTORE destination key [key ...] //将并集结果存入新集合 destination中

SDIFF key [key ...] //差集运算

SDIFFSTORE destination key [key ...] //将差集结果存入新集合 destination中

集合操作:

SINTER set1 set2 set3 ->{c}

SUNION set1 set2 set3 ->{a,b,c,d,e}

SDIFF set1 set2 set3 ->{a}

应用场景:

①微信抽奖小程序

  1. 点击参与抽奖加入集合: SADD key {userId}

  1. 查看参与抽奖所有用户: SMEMBERS key

  1. 抽取count名中奖者: SRANDMEMBER key [count] /STOP key [count]

②微信微博点赞,收藏,标签

  1. 点赞: SADD like:{消息id} {用户id}

  1. 取消点赞: SREM like:{消息id} {用户id}

  1. 检查用户是否点过攒: SISMEMBERS like:{消息id} {用户id}

  1. 获取点赞的用户列表: SMEMBERS like:{消息id}

  1. 获取用户点赞数: SCARD like:{消息id}

③集合操作实现微博微信关注模型

  1. xiaoming关注的人: hong,hei

  1. bai关注的人:xiaoming,huang,hong,hei

  1. hong关注的人: xiaoming,bai,huang,hei,hui

  1. xiaoming和bai共同关注: SINTER xiaoming bai

  1. ZSet集合:

常用操作:

ZADD key score member [[score member] ...] //往有序集合key中加入带分值元素

ZREM key member [member ...] //从有序集合key中删除元素

ZSCORE key member //返回有序集合中key元素member的分值

ZINCRBY key incrment member //为有序集合中key元素member的分值加上incrment

ZCARD key //返回有序集合key中元素个数

ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start到stop的元素

ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start到stop的元素

ZSet集合操作

ZUNIONSTORE deskey numkeys key [key ...] //并集计算

ZINTERSTORE deskey numkeys key [key ...] //交集计算

应用场景:

①实现排行榜

  1. 点击新闻: ZINCRBY hostNews:20230210 1 xxx者会

  1. 展示当日排行前十: ZREVRANGE hostNews:20230210 0 9 WITHSCORES

  1. 七日搜索榜单计算: ZUNIONSTORE hostNews:20230210-hostNews:20230204 7 hostNews:20230204 ... hostNews:20230210

  1. 展示七日排行前十: ZREVRANGE hostNews:20230210-hostNews:20230204 0 9 WITHSCORES

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值