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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容