Remote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis经常被用于缓存、分布式锁等场景,其值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(set) 和 有序集合(sorted set)等类型。
1. String
redis的String类型不是我们通常理解的字符串类型,它是二进制安全的,也就是说只要是二进制数据,均可以进行存储,包括数字、图片、序列化对象等。
1.1 常用操作
#设置key的值
SET key value
#获取key中的值
GET key
#删除指定的key
DEL key
#对key中的数据进行+1操作
INCR key
#对key中的数据进行-1操作
DECR key
#如果不存在key,则将将key的值设置为value
SETNX key value
1.2 常见应用场景:
1.2.1 缓存
redis在后端应用中常被用来当做缓存中间件,我们根据接口或方法的入参生成一个唯一的key,并在第一次调用后将返回值写入redis中,对于后续的调用,如果发现入参匹配,只需要直接从缓存中获取并返回给调用者,以减低服务器压力。如果你使用Spring构建后端应用,可使用Spring Cache,其可提供基于redis的缓存支持。
1.2.2 计数器
得益于redis的单线程模型,其上的操作均是线程安全的。使用incr key命令,我们可以轻松构建一个线程安全的计数器,用于在线人数统计、商品库存等场景。
1.2.3 分布式session
redis因其超高的吞吐量,以及支持海量数据的存储(通过集群突破单机上限),其除了用于缓存数据,亦可用于实现分布式session。通过将集群单实例的session存入redis中,可实现集群中的session共享。
2. List
有序列表,redis采用双链表实现list,支持从左右端(头尾)进行插入和删除数据。一个列表最多可以包含 2^32 - 1 个元素。
2.1 常用操作
#获取下标start_index(包含)到stop_index(包含)的元素
LRANGE key start_inex stop_index
#从左侧(头部)插入元素,支持多个
LPUSH key value1 [value2]...
#从右侧(尾部)插入元素,支持多个
RPUSH key value1 [value2]...
#获取指定key的列表长度
LLEN key
#从左侧(头部)弹出一个元素,该操作会在列表中删除该元素
LPOP key
#从右侧(尾部)弹出一个元素,该操作会在列表中删除该元素
RPOP key
blpop/brpop
2.2 常见应用场景:
2.2.1 消息流
在对数据持久化要求不高的场景,我们可以使用redis的List来实现消息流,例如聊天记录,公众号推送列表等。使用LRANGE命令,我们可以根据前端的消息偏移量来取出用户未读取的消息。
3. Set
Redis 的Set是String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1 (40多亿)。
3.1 常用操作
#向集合添加一个或多个元素
SADD key member1 [member2]...
#移除集合中的一个或多个元素
SREM key member1 [member2]...
#返回集合中的所有元素
SMEMBER key
#判断member元素是否是集合 key 的成员
SISMEMBER key member
#从集合中随机返回一个元素,该操作会在集合中删除该元素
SPOP key
#从集合中随机返回一个或多个元素
SRANDMEMBER key [count]
#计算指定集合的差集
SDIFF key1 key2 [key3]...
#计算指定集合的差集,并将结果存到destKey
SDIFFSTORE destKey key1 key2 [key3]...
#计算交集
SINTER key1 key2 [key3]...
#计算交集,并将结果存到destKey
SINTERSTORE destKey key1 key2 [key3]...
#计算并集
SUNION key1 key2 [key3]...
#计算并集,并将结果存储到destKey
SUNIONSTORE destKey key1 key2 [key3]...
3.2 常见应用场景
redis中Set提供了差集,并集和交集计算,利用集合运算我们可以轻松地实现社交场景中的许多功能。
3.2.1 我关注的人也关注了他
我们可以以用户Id作为key,好友列表以Set数据类型作为value。遍历当前用户的好友列表,通过SISMEMBER 命令判断好友的好友列表是否也包含了指定的用户,即可得到“我关注的人也关注了他”的列表。
3.2.2 共同好友
如3.2.1构造好友列表数据,然后通过求交集操作,即可计算出当前用户与指定用户的共同好友。
3.2.3 抽奖
以活动ID作为key,利用Set数据类型组织参与用户ID并作为value。使用SRANDMEMBER命令即可从集合中随机取出中奖的用户。
4. Hash
Redis hash是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
4.1 常用操作
#对指定key的field设置值
HSET key field value
#如果key中不存在field,则对指定的field设置值;如果key不存在,也会创建key并设置field
HSETNX key field value
#获取指定key中指定的field的值
HMGET key field1 [field2]...
#删除指定的filed
HDEL key field1 [field2]...
#对指定的filed进行加操作
HINCRBY key field increment
4.2 常见应用场景
4.2.1 购物车
在电商应用中,购物车是最基础的功能之一,我们使用redis可以轻松地实现一个购物车功能。我们使用用户ID作为key,商品ID作为field,商品数量作为value。使用HINCRBY命令可以轻松实现商品的加减操作。
5. Sorted set
Redis有序集合与Set集合基本一致,不同在于有序集合为每个元素加上了一个double类型的分数。Redis通过该分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)是可以重复的。
5.1 常用操作
#为指定key添加元素并设置分数
ZADD key score1 member1 [score2 member2]...
#移除key中的指定元素
ZREM key member1 [member2]...
#对指定key中的指定元素的分数进行加操作
ZINCRBY key increment member
#获取指定key中指定元素的分数值
ZSCORE key member
#获取指定区间内,带有分数值(可选)的有序集合元素列表(元素索引位置按分值从小到大)
ZRANGE key start_index stop_index [WITHSCORES]
#获取指定区间内,带有分数值(可选)的有序集合元素列表(元素索引位置按分值从大到小)
ZREVRANGE key start_index stop_index [WITHSCORES]
#计算给定的有序集合的并集,并存储到dest_key中,注意:不同集合中的相同元素,分数会进行累加
ZUNIONSTORE dest_key numberkeys key1 [key2]...
#计算给定的有序集合的交集,并存储到dest_key中,注意:不同集合中的相同元素,分数会进行累加
ZINTERSTORE dest_key numberkeys key1 [key2]...
5.2 常见应用场景
5.2.1 近7天热搜
由于有序集合中元素带有分数,我们可以使用有序集合轻松实现每日排行榜。对于近7天热搜榜,我们在每日排行榜的基础上,再进行并集操作即可实现。
网友评论