侧边栏壁纸
博主头像
Exering

It's not how much time you have, it's how you use it!

  • 累计撰写 11 篇文章
  • 累计创建 3 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

Redis数据结构应用

Exering
2022-09-03 / 0 评论 / 0 点赞 / 921 阅读 / 3,750 字

Redis数据结构应用

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中储存的数字值加1
    DECR key		//将key中储存的数字值减1
    INCRBY key increment	//将key所储存的值加上increment
    DECRBY key decrement	//将key所储存的值减去decrement
    

1.1 单值缓存

  • SET key value
    GET key value
    

1.2 对象缓存

  • SET user:1 value(json格式)
    

1.3 分布式锁

  • SETNX product:10001 true	//返回1代表获取锁成功
    SETNX product:10001 true	//放回0代表获取锁失败
    。。。执行业务操作
    DEL product:10001					//执行完业务释放锁
    
  • SETNX product:10001 true ex 10 nx	//防止程序意外终止导致死锁
    

1.4 计数器

  • INCR article:readcount:{文章id}
    GET article:readcount:{文章id}
    

1.5 分布式系统全局序列号

  • INCRBY orderId 100	//redis批量生成序列号id提升性能
    

2.Hash

  • Hash常用操作

    HSET key field value		//储存一个哈希表key的键值
    HSETNX key field value	//存储一个不存在的哈希表key的键值
    HMSET key field value [key value ...]		//在一个哈希表中存储多个键值对
    HGET key value		//获取哈希表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键的值加上增量increment
    

2.1 对象缓存

  • HMSET user {userId}:name zhuge {userId}:balance 1888
    HMSET user 1:name zhuge 1:balance 1888
    HMSET user 1:name 1:balance
    

2.2 电商购物城

  1. 以id为key
  2. 商品id为field
  3. 商品数量为value
  • 购物车操作

    1) 添加商品->hset cart:1001 10088 1
    2) 增加数量->hincrby cart:1001 1008 1
    3) 商品总数->hlen cart:1001
    4) 删除商品->hdel cart:1001 10088
    5) 获取购物车所有商品->hgetall cart:1001
    

3. List

  • List常用操作

    LPUSH key value [value ...]		//将一个或多个值value插入到key列表的表头(最左边)
    RPUSH key value [value ...]		//将一个或多个值value插入到key列表否尾部(最右边)
    LPOP key											//移除并返回key列表的头元素
    RPOP key											//移除并返回key列表的尾元素
    LRANGE key start stop					//返回列表key中指定区间的元素,区间以偏移量start和stop指定
    
    BLPOP key [key ...] timeout		//从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞
    BRPOP key [key ...] timeout		//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞
    

3.1 常用分布式数据结构

  • Stack(栈) = LPUSH + LPOP =FILO
  • Queue(队列) = LPUSH + RPOP
  • Blocking MQ(阻塞队列) = LPUSH + BRPOP

3.2 微博消息和微信公众号消息

诸葛关注了Caoz,备胎说车等大V

1)Caoz发微博,消息ID为10018

LPUSH msg:{诸葛-ID} 10018

2)备胎说车发微博,消息ID为10086

LPUSH msg:{诸葛-ID} 10086

3)查看最新微博消息

LRANGE msg:{诸葛-ID} 0 4ß

4.Set

  • Set常用操作

    SADD key member [member ...]	//往集合key中存入元素,元素存在则忽略,若key不存在则新建
    SREM key member [member ...]	//从集合key中删除元素
    SMEMBERS key									//获取集合key中所有元素
    SCARD key											//获取集合key的元素个数
    SISMEMER key member						//判断member元素是否存在于集合key中
    SRANDMEMBER key [count]				//从集合key中选出count个元素,元素不从key中删除
    SPOP 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中
    

4.1 微信抽奖小程序

1)点击参与抽奖加入集合

SADD key {userID}

2)查看参与抽奖所有用户

SMEMBERS key

3)抽取count名中奖者

SRANDMEMBER key [count] / SPOP key [count]

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

1)点赞

SADD like:{消息ID} {用户ID}

2)取消点赞

SREM like:{消息ID} {用户ID}

3)检查用户是否点过赞

SISMEMBER like:{消息ID} {用户ID}

4)获取点赞的用户列表

SMEMBERS like:{消息ID}

5)获取点赞用户数

SCARD like:{消息ID}

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

1)诸葛关注的人

zhugeSet -> {zhuangzhou, xushu}

2)楼兰关注的人

loulanSet -> {zhuge, baiqi, zhuangzhou, xushu}

3)庄周关注的人

zhuangzhouSet -> {zhuge, loulan, baiai, xushu, xunyu}

4)诸葛和楼兰共同关注

SINTER zhugeSet loulanSet -> {zhuangzhou, xushu}

5)诸葛关注的人也关注他(楼兰)

SISMEMBER zhuangzhouSet loulan
SISMEMBER xushuSet loulan

6)诸葛可能认识的人

SDIFF loulanSet zhugeSet -> {zhuge, baiqi}

5.ZSet

  • ZSet常用操作

    ZADD key score member [[score member]...]	//往有序集合key中加入带分值元素
    ZREM key member [member ...]							//从有序集合key中删除元素
    ZSCORE key member													//返回有序集合key中元素member的分值
    ZINCRBY key increment member							//为有序集合key中元素member的分值加上increment
    ZCARD key																	//返回有序集合key中元素个数
    ZRANGE key start stop [WITHSCORES]				//正序获取有序集合key从start下标到stop下标的元素
    ZRAVRANGE key start stop [WITHSCORES]		//倒序获取有序集合key从start下标到stop下标的元素
    
  • ZSet集合操作

    ZUNIONSTORE destkey numkeys key [key ...]	//并集计算
    ZINTERSTORE destkey numkeys key [key ...]	//交集运算
    

5.1 ZSet集合操作实现排行榜

1)点击新闻

ZINCRBY hotNews:20200819 1 总经理记者会

2)展示当日排行前十

ZREVRANGE hotNews:20200819 0 9 WITHSCORES

3)七日搜索榜计算

ZUNIONSTORE hotNews:20200813-20200819 7 hotNews:20200813 hotNews:20200814 ... hotNews:20200819

4)展示七日排行前十

ZREVRANGE hotNews:20200813-20200819 0 9 WITHSCORES
0
博主关闭了所有页面的评论