目录
缓存
会话存储
分布式锁
消息队列
位统计
计数器
排行榜
缓存的目的是为了提高系统响应速度、减少数据库等资源的压力,redis作为键值对形式的内存数
据库,可以提供非常快速的读取速度,使得它成为存储热点数据或频繁访问数据的理想选择。
在实际项目使用中我们通常会先查询缓存,如果存在则直接返回数据,如果不存在则查询数据库,
然后插入缓存;如果是更新数据则先删除数据库再删除缓存。在高并发中需要考虑延迟双删。
使用Redis来存储会话(Session)数据,可以实现在无状态的服务器之间共享用户相关的状态数据
数据。通常我们会使用redis集群来做会话存储,以避免单个服务故障导致用户无法登录。
用户通过浏览器登录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 不做任何动作。
实际项目中推荐使用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