Redis应用场景

一、String应用场景

1.1单值缓存
set key value
get key
1.2 对象缓存
set user:1 value(json格式数据)
mset user:1:name alanchen   user:1:balance  1888
mget  user:1:name  user:1:balance
1.3 分布式锁
setnx  product:1001  true       // 返回1代表获取锁成功
setnx  product:1001  true      // 返回0代表获取锁失败
... 执行业务操作
del product:1001     // 执行完业务释放锁

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

补充说明

//setnx  命令基本语法

setnx key value

setnx (SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

1.4 计数器

用作文章点赞数、浏览量

incr  article:readcount:{文章ID}
get   article:readcount:{文章ID}
1.5 分布式系统全局序列号
incrby  orderId  100   //redis批量生成序列号提升性能

二、Hash应用场景

2.1 对象缓存
hmset  user {userId} : name alanchen  {userId}:balance 1888
hmset  user 1: name alanchen  1:balance  1888
hmget  user  1:name  1:balance
2.2 电商购物车

1.以用户id为key
2.商品id为field
3.商品数量为value

购物车操作
1.添加商品 hset cart:1001 10088 1
2.增加数量 hinncrby cart 1001 10088 1
3.商品总数 hlen cart 1001
4 删除商品 hdel cart 1001 10088
5 获取购物车所有商品 hgetall cart :1001

购物车

三、List应用场景

3.1 List常用操作
// 将一个或多个值value插入到key列表的表头(最左边)
lpush key value [value...]

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

//移除并返回key列表的头元素
lpop key 

//移除并返回key列表的尾元素
rpop key

//返回列表key中指定区间内的元素,区间以偏移量start和stop指定
lrange key start stop

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

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

3.2 常用数据结构(分布式场景)

在分布式场景下,Java自带的以下数据结构API就无法使用了

Stack(栈) = LPUSH + LPOP 先进后出
Queue(队列) = LPUSH + RPOP 先进先出
Blocking MQ(阻塞队列) = LPUSH + BRPOP

BRPOP 是列表的阻塞式(blocking)弹出原语。 它是RPOP命令的阻塞版本。

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

海量数据+排序+频繁访问 (mysql数据库不合适)

微博和微信公众号消息流

如果粉丝量上百万、千万后这种方式也不合适,大V发布一条状态后,给他的上百万粉丝发消息,每个粉丝都存一份,数量太大且耗时长

四、Set应用场景

4.1 Set常用操作
//往集合key中存入元素,元素存在则忽略,若key不存在则新建
sadd key member [member ...]

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

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

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

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

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

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

4.2 Set运算操作
//交集运算
sinter key [key ...]

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

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

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

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

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

4.3 微信抽奖小程序

1、点击参与抽奖加入集合
sadd key {userId}

2、查看参与抽奖所有用户
smembers key

3、抽取count名中奖者
srandmember key [count] (不会从集合中取出)
spop key [count] (从集合中取出,抽一、二、三等奖)

小程序抽奖
4.4微信微博点赞,收藏,标签
1、点赞
sadd like:{消息ID} {用户ID}

2、取消点赞
srem like:{消息ID} {用户ID}

3、检查用户是否点过赞
sismember like:{消息ID} {用户ID}

4、获取点赞的用户列表
smembers like:{消息ID}

5、获取点赞用户数
scard like:{消息ID}

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

用交集、并集、差集等运算实现“共同关注”,“我关注的人也关注他”,“可能认识的人”等

4.6 集合操作实现电商商品筛选
电商商品筛选
电商商品筛选

五、ZSet应用场景

5.1 ZSet有序集合结构

ZSet正常操作

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

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

//返回youxu集合key中元素member的分值
zscore key member

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

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

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

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

Zset集合操作

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

//交集计算
zinterstore destkey numkeys key [key ...]
zset
5.2 ZSet集合操作实现排行榜
1、点击新闻
zincrby hotNews:20190819 1 守护香港

2、展示当日排行前十
zrevrange hotNews:20190819 0 9 withscores

3、七日搜索榜单计算
zunionstore hotNews:20190813-20190819 7
hotNews:20190813 hotNews:20190814... hotNews:20190819

4、展示七日排行前十
zrevrange hotNews:20190813-20190819 0 9 withscores

排行榜

六、总结

Redis可用于实现抽奖,点赞,收藏,排行榜等功能。相比于用Java直接实现这个功能,Redis的优势在于:

1、Redis可以很方便的做集合交、并等操作
2、Redis存储的数据量更小
3、数据量大时,Redis计算,取数据更快
4、Redis实现逻辑更简单,加数量一句话搞定,Java还要先取出来,再加,再存,而且还要判断是否存在,存在则更新,否则先新增;
5、Redis实现抽奖直接有随机命令,Java则要实现随机算法、

参考推荐

Redis 教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容