关于Redis的n种妙用,不仅仅是缓存数据库

来源:互联网 / 作者:SKY / 2019-06-25 15:08 / 点击:
redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)。Redis用作

关于Redis的n种妙用,不仅仅是缓存

redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)。

Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发。

应用场景

分布式锁(string)

setnx key value,当key不存在时,将 key 的值设为 value ,返回1。若给定的 key 已经存在,则setnx不做任何动作,返回0。

当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁,如果setnx返回0表示获取锁失败,整体思路大概就是这样,细节还是比较多的,有时间单开一篇来讲解

计数器(string)

如知乎每个问题的被浏览器次数

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

set key 0 

incr key // incr readcount::{帖子id} 每阅读一次 

get key // get readcount::{帖子id} 获取阅读量 

分布式全局唯一id(string)

分布式全局唯一id的实现方式有很多,这里只介绍用redis实现

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

每次获取userId的时候,对userId加1再获取,可以改进为如下形式

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

直接获取一段userId的最大值,缓存到本地慢慢累加,快到了userId的最大值时,再去获取一段,一个用户服务宕机了,也顶多一小段userId没有用到

set userId 0 

incr usrId //返回1 

incrby userId 1000 //返回10001 

消息队列(list)

在list里面一边进,一边出即可

# 实现方式一 

# 一直往list左边放 

lpush key value  

key这个list有元素时,直接弹出,没有元素被阻塞,直到等待超时或发现可弹出元素为止,上面例子超时时间为10s 

brpop key value 10  

# 实现方式二 

rpush key value 

blpop key value 10 

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

新浪/Twitter用户消息列表(list)

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

假如说小编li关注了2个微博a和b,a发了一条微博(编号为100)就执行如下命令

lpush msg::li 100 

b发了一条微博(编号为200)就执行如下命令:

lpush msg::li 200 

假如想拿最近的10条消息就可以执行如下命令(最新的消息一定在list的最左边):

# 下标从0开始,[start,stop]是闭区间,都包含 

lrange msg::li 0 9  

抽奖活动(set)

# 参加抽奖活动 

sadd key {userId}  

# 获取所有抽奖用户,大轮盘转起来 

smembers key  

# 抽取count名中奖者,并从抽奖活动中移除 

spop key count  

# 抽取count名中奖者,不从抽奖活动中移除 

srandmember key count 

实现点赞,签到,like等功能(set)

关于Redis的n种妙用,不仅仅是缓存(附有自学资料分享哦)

 

# 1001用户给8001帖子点赞 

sadd like::8001 1001 

# 取消点赞 

srem like::8001 1001 

# 检查用户是否点过赞 

sismember like::8001 1001  

# 获取点赞的用户列表 

smembers like::8001  

# 获取点赞用户数 

scard like::8001  

实现关注模型,可能认识的人(set) 

阅读延展

1
3