美文网首页Spring 笔记后端技术
Redis:入门教程,数据结构及其应用场景

Redis:入门教程,数据结构及其应用场景

作者: Everlin | 来源:发表于2020-03-25 23:23 被阅读0次

    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天热搜榜,我们在每日排行榜的基础上,再进行并集操作即可实现。

    相关文章

      网友评论

        本文标题:Redis:入门教程,数据结构及其应用场景

        本文链接:https://www.haomeiwen.com/subject/ugybyhtx.html