我在项目中使用Redis的几个场景

目录

缓存

会话存储

分布式锁

消息队列

位统计

计数器

排行榜


缓存

缓存的目的是为了提高系统响应速度、减少数据库等资源的压力,redis作为键值对形式的内存数

据库,可以提供非常快速的读取速度,使得它成为存储热点数据或频繁访问数据的理想选择。

在实际项目使用中我们通常会先查询缓存,如果存在则直接返回数据,如果不存在则查询数据库,

然后插入缓存;如果是更新数据则先删除数据库再删除缓存。在高并发中需要考虑延迟双删。

会话存储

使用Redis来存储会话(Session)数据,可以实现在无状态的服务器之间共享用户相关的状态数据

数据。通常我们会使用redis集群来做会话存储,以避免单个服务故障导致用户无法登录。

我在项目中使用Redis的几个场景_第1张图片

用户通过浏览器登录Web Server的时候,Web Server生成会话ID(SessionID),这里一方面存储到Redis,另一方面将会话ID返回给浏览器(如Cookie,Token等)。当用户再次发生请求时,浏览器则携带会话ID,Web Server根据会话ID到Redis中查询相关信息,进行登录权限等验证。

分布式锁

在分布式、微服务等系统中,由于部署了多个服务节点,必然存在着多个节点使用同一个资源的情况,此时需要使用分布式锁来协调资源的分配,基于Redis使用分布式锁,相对于其他方式数据库分布式锁、Zookeeper分布式锁等有着明显的性能优势。

这里主要是用Redis的原子操作命令:SETNX,该命令仅允许key不存在的时候才能设置key。

SETNX key value
将 key 的值设为 value ,当且仅当key不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。

我在项目中使用Redis的几个场景_第2张图片

实际项目中推荐使用Redisson。

消息队列

对于一些简单的项目,对数据一致性不太高的情况下,也可以通过redis的Pub/Sub来实现。发布/

订阅(Pub/Sub)是redis的一种通信机制,将数据推到信息管道中,其他客户端可通过订阅这

些管道来获取推送信息,用于消息的传输。

常用命令:

SUBSCRIBE channel # 订阅频道
unsubscribe channel # 取消订阅
PUBLISH channel "Hello Wrold" # 发布频道消息

缺点:

redis无法对消息持久化存储,因此当出现异常时容易丢失消息
订阅者消费很慢的情况下,不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃

位统计

Redis提供了一套位操作命令:setbit、getbit、bitcount。作为节省空间的利器,可以轻松存储海量

数据。设想需要存储1亿用户是否登录,若使用mysql等关系型数据库,数据量远超其存储极限,

这里使用Redis位操作。设定一个超长数组,只能存储0和1,每个用户对应一个下标,默认0表示

未登录,当用户登录时设置为1,则1亿用户占用的空间不到12M。

SETBIT bit 10086 1  #把第10086个位置设置为

GETBIT bit 10086    #获取第10086个位置的值  看是0还是1

计数器

利用INCRBY命令可以统计网站的访问数量、全局ID等。

incrby userid 10000

使用该命令如果 key 不存在,那么key的值会先被初始化为0,然后再执行incrby命令。单线程加

上原子性确保了数据的唯一性。

排行榜

ZADD和ZRANGE提供了一套排序集合(Sorted Sets)。例:

# 首先使用ZADD添加集合
ZADD rank:score 100 "花"
ZADD rank:score 90 "草"
ZADD rank:score 80 "树木"

# 获取集合
ZRANGE rank:score 0 -1 WITHSCORES

得到集合:

"花"
100
"草"
90
"树木"
80

你可能感兴趣的:(知识分享,学习笔记,redis,缓存,开发语言)