编辑
2023-10-18
缓存中间件
0
请注意,本文编写于 212 天前,最后修改于 50 天前,其中某些信息可能已经过时。

目录

五大数据类型的常用操作
五大数据类型的常用场景
跳表

五大数据类型的常用操作

string

shell
set key value # 添加键值对,命令不区分大小写,但是key区分大小写 get key # 获取key的值 mset k1 v1 k2 v2 k3 v3 .. # 设置多个kv mget k1 k2 k3 .. # 获取多个k的值 msetnx k1 v1 k2 v2 .. # 只有当k都不存在时,才设置多个kv值 incr key # 将key中存储的数值+1[具有原子性] decr key # 将key中存储的数值-1[具有原子性] incrby/decrby key 步长 # 将key中的增/减步长 strlen key # 获取k的值的长度 setnx k v # 只有key不存在时才设置kv值 set k v [EX seconds] [PX millisseconds] [NX|XX] # EX:key在多少秒之后会过期 PX:key在多少毫秒之后会过期 NX:当key不存在时,才会创建key,相当于setnx XX:当key存在时,覆盖key append k v # 在值的末尾追加 getrange k <起始位置><结束位置> # 获取范围内的值

hash

shell
hset key field value # 给key集合中field赋值 hget k field # 从k集合中field取值 hmset k1 f1 v1 f2 v2 .. # 批量设置hash值 hmget k f1 f2 .. # 批量获取hash值 hgetall k # 获取所有字段值 hlen k # 返回k内全部数量 hdel k # 删除key hexists k f # 查看hash表key中,给定的field是否存在 hkeys k # 列出hash中所有的field hvals k # 列出hash中所有的value

list

shell
lpush/rpush k1 v1 v2 v3 .. # 从左边或右边插入数据 lpop/rpop key # 从左边或右边pop出值[值pop键也会销毁] lrange k start stop # 按照索引下标获得元素 llen k # 获取k列表的长度 rpoplpus k1 k2 # 从k1列表右边取值插入到k2列表的左边 lrange k 0 -1 # 0表示左边第一个,-1表示右边第一个,0 -1取所有值

set

shell
sadd k1 v1 v2 .. # 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略 srem k v1 v2 .. # 删除集合中的某个元素 smembers k # 取出该集合的所有值 sismember k v # 判断集合k是否含有v值,有返回1无返回0 scard k # 返回该集合的元素个数 srandmember k n # 随机从集合中取出n个值,不会从集合中删除 spop k n # 随机从集合pop n个值,并删除 sinter k1 k2 # 返回两个集合的交集 sunion k1 k2 # 返回两个集合的并集 sdiff k1 k2 # 返回两个集合的差集

sortset(zset)

shell
zadd key score1 v1 score2 v2 ... # 将一个或者多个member元素及其score值加入到有序集key中 zrange k start stop [WITHSCORES] # 返回有序集k中,下标在start-stop之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集 zscore key member # 获取元素的分数 zrem k v # 删除该集合下,指定值得元素 zrevrangebyscore key minmax [withscores][limit offest count] # 按降序排列 zincrby k increment v # 为元素的score加上增量 zcard key # 获取集合中元素的数量 zcount k min max # 统计该集合,分数区间内的元素个数 zrangebyscore key minmax [withscores][limit offest count] # 返回有序集k中,所有score值介于(等于)min和max之间的成员,按升序排列 zrank k v # 返回该值在集合中的排名,从0开始 zrevrank k v # 降序

五大数据类型的常用场景

String

1、用作统计类/计数场景。比如某个视频或商品点赞,点一下加一次。比如统计视频播放量。

2、最常用的缓存功能

3、共享Session。只要保证Redis是高可用和可扩展的,每次用户更新或者查询登录信息都直接从Redis中集中获取。

4、限速,例如获取手机验证码时,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,此时可以用Redis来实现。也可以用于限制某个ip在一秒钟内访问不能超过n次。

Hash

1、存储某些对象数据,相较于用于字符串序列化存储,hash存储更加直观而且更新操作也会更加便捷。

2、购物车:

新增商品1 -> hset shopcar:uid1024 0001 1

新增商品2 -> hset shopcar:uid1024 0002 1

增加商品1数量 -> hincrby shopcar:uid1024 0001 1

统计商品总数 -> hlen shopcar:uid1024

全部选择 -> hgetall shopcar:uid1024

List

1、可以用作消息队列:lpush+brpop命令组合就可以实现一个消息队列。生产者客户端使用lpish从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式抢列表尾部元素,多个客户端保证了消费者的负载均衡和高可用性。

2、微信公众号订阅消息列表

比如说有两篇新文章,id分别为11、12,装进订阅人的list里,lpush likearticle:userId 11 12

订阅人查看订阅的全部文章,类似分页显示10条,lrange likearticleId 0 9

3、商品评论列表

需求:1、用户针对某有一个商品发布评论,一个商品会被不同的用户进行评论,保存商品评论时,需要按时间排序。2、用户在前端查询该商品评论时,需要按照时间顺序降序展示。

解决:使用list存储商品的评论信息,key为商品的id,value是商品评论信息。有新评论不断往里面push即可。展示的时候,直接取出 start - stop 条。

Set

1、利用随机弹出功能,用作抽奖

2、朋友圈点赞功能

新增点赞:sadd pub:msgId 点赞用户ID1 点赞用户ID2

取消点赞:srem pub:msgId 点赞用户ID

展示所有点赞过的用户:smembers pub:msgId

点赞用户统计:scard pub:msgId

判断某个朋友是是否对楼主点赞过:sisember pub:msgId 用户ID

3、微博好友关注社交好友、共同关注的人:使用set的集合操作

4、标签(用户画像),例如某个用户对历史、新闻比较感兴趣,那么这些兴趣点就是标签

给用户添加标签:sadd user:1:tags tag1 tag2 tag3

给标签添加用户:sadd tag1:users user:1 user:2

用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成的数据不一致。

Zset

排行榜,比如一个按照时间、播放量、获赞数等多个维度实现的一个排行榜。

跳表

跳表(链表 + 多级索引)是一种以空间换时间的数据结构,由于链表无法使用二分查找,因此借鉴数据库索引的思想,提取出链表中总关键节点(索引),现在关键节点上查找,找不到再进入下层链表查找,提取多层关键节点,就形成了跳跃表。查询时间复杂度O(logN):

跳表.png

跳表只有在数据量较大的情况下才能体现出优势,而且应该是读多写少的情况下去使用,所以它适合的适用范围比较窄。跳表的维护成本相对较高,新增或者删除时需要把所有的索引都更新一遍。

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!