Redis五种数据结构及应用场景

String

String结构

单值缓存

SET key value

GET key

对象缓存

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

2)MSET user:1:name sp user:1:balance 1994

MGET user:1:name user:1:balance

分布式锁

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

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

。。。执行业务操作

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



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

 

String 应用场景

1.计数器

INCR article:readcount:{文章id}

GET article:readcount:{文章id}

 

2.Web集群session共享

spring session + redis实现session共享

3.分布式系统全局序列号

INCRBY orderId 1000

 

Hash结构

Hash常用操作

hset key field value   //存储一个哈希表key的键值
hget key field         //获取值
hsetnx key field value //存储一个不存在的哈希表key的键值
HMSET key field vlue [field value ...]  //在一个哈希表中存储多个键值对
hmget key field value [field value ...] //批量设置或获取field-value
field hdel key field [field ...]        //删除[批量]
hlen key               //计算field的个数
hgetall key            //获取所有的field-value 
hexists key field      //判断field是否存在
hkeys key             //获取所有field 
hvals key             //获取所有的value 
//开发提示:如果一定要获取全部的field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型
//hincrby hincrby float
hstrlen key field     //计算value的字符串长度 

 

Hash应用场景

对象缓存

//设置 user对象 id为1 的name属性值为 sp,balance属性值为111
HMSET user 1:name sp 1:balance 111  
//获取 user对象 id为1 的属性为name、balance的值
HMGET user 1:name 1:balance	

 

电商购物车

1)以用户id为key

2)商品id为field

3)商品数量为value

 

 

Hash结构优缺点

优点:

1.同类数据归类整合储存,方便数据管理

2.相比String操作消耗内存与cpu更小

3.相比String储存更节省空间

缺点:

1.过期功能不能使用在field上,只能用在key上

2.Redis集群架构下不适合大规模使用

 

 

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,一直阻塞等待

 

 

List应用场景

常用数据结构

Stack(栈) = LPUSH + LPOP ->FILO

Queue(队列) = LPUSH + RPOP

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

 

 

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

 

 

 

Set结构

Set常用操作

SADD key member [member...] //往集合key中存入元素,元素存在则忽略,若 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中删除

Set运算操作

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

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

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

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

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

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

 

Set应用场景

微信抽奖小程序

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

SADD key {userID}

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

SMEMBERS key

3)抽奖count名中奖者

SRANDMEMBER key [count] / SPOP key [count]

微信微博点赞、收藏、标签

1)点赞

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

2)取消点赞

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

3)检查用户是否点过赞

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

4)获取点赞的用户列表

SMEMBERS like:{消息ID}

5)获取点赞用户数

SCARD like:{消息ID}

 

集合操作

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

 

 

 

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的分值加上inrement

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

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

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

Zset集合操作

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

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

 

 

 

Redis更多应用场景

微信、微博、陌陌<附近的人>

微信<摇一摇><抢红包>

滴滴打车、摩拜单车<附近的车>

美团和饿了么<附近的餐馆>

搜索自动补全

布隆过滤器

 

 

 

发布了81 篇原创文章 · 获赞 9 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章