【征服redis1】基础数据类型详解和应用案例

博客计划 ,我们从redis开始,主要是因为这一块内容的重要性不亚于数据库,但是很多人往往对redis的问题感到陌生,所以我们先来研究一下。

本篇,我们先看一下redis的基础数据类型详解和应用案例。

1.redis概述

以mysql为代表的数据库,相信很多人都非常熟悉,这是数据持久化存储的最佳方式。但是在更新频繁或者访问强度高的场景下,数据库的性能捉襟见肘,这时候我们使用Redis作为缓存更加合适。缓存是redis最主要的功能,此外,redis还在分布式锁、异步消息队列等方面有重要应用。 

Redis 是一个开源的在内存中存储数据的结构化键值数据库,它支持多种类型的数据结构,如字符串、列表、集合、哈希、有序集合等。此外,Redis还支持事务、持久化、LUA脚本、LRU清除、自动故障转移等功能。

Redis特点

  1. 性能高效:Redis能读的速度是110000次/s,写的速度是81000次/s,因此被广泛应用于缓存场景。
  2. 支持多种数据类型:Redis支持最常见的数据类型,为复杂的应用提供了广泛的可能性。
  3. 数据持久化:Redis可以将数据保存在磁盘上,重启后可以再次加载进行使用。
  4. 支持消息队列:Redis还可以用作消息队列使用,它提供了发布/订阅等相关功能。
  5. 支持事务:Redis支持事务,可以一次执行多个命令,中间不会被其他命令插入。
  6. 高可用和分布式:通过Redis的Sentinel系统和Cluster集群模式,可以构建高可用、分布式的Redis系统。
     

redis安装与启动方法

在linux或者mac下安装redis是非常容易的,我们可以先下载redis的源码,然后make安装即可,不过Redis是用C语言实现的,要想编译,需要提前安装gcc等工具。编译redis的基本过程是:

wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
cd redis-5.0.3
make

如果没有安装wget,使用curl等工具也是可以的。

之后启动redis服务端的命令如下:

src/redis-server

这样就成功启动了Redis服务器。要连接到这个服务器,可以打开另一个终端窗口,然后输入:

 src/redis-cli

不过这样的话,使用的时候,需要先定位到安装位置,比较麻烦,为了方便使用,我们可以将上述地址配置到环境变量里,这样使用时只需要输入下面的命令即可:

redis-cli

如图所示:

这样我们就可以开心地使用Redis了。

2.Redis基础数据类型

在运行起来redis之后,接下来,我们的重点就是熟悉redis提供给我们的五种典型的数据结构,不同结构是针对不同的应用场景,我们这里分别介绍这几种结构的特征、用法、应用案例等等。对于用法,所有的结构,我们需要掌握的无非是“增删改查“以及判断长度、有无等等。

在工作中,我们一般通过java代码来调用redis提供的api接口来间接管理redis,但是这样比较繁琐,我们在后面会详细介绍如何使用这些api工具,这里我们先使用redis-cli来快速掌握redis相关的命令。

2.1 感受一下redis命令

在介绍redis的数据类型之前,我们先来感受一下如何通过命令来操作redis。redis命令的基本格式是:

KEYS pattern

pattern是通配符,这个与sql语言里的字符串匹配等是一样的, 常见的有:

符号含义
?匹配一个字符
*匹配人任意个(包括0个)字符
[]匹配括号间的任一字符,可以使用-表示范围,例如a[b-d]可以匹配"ab、ac、ad"这几种情况
\x匹配字符x,用于转义符号。如要匹配"?"就要使用“\?”

在打开redis-cli的窗口里,我们首先建立第一个键:

set haitao 1然后再输入:
KEYS *

此时的截图,由于我之前还有其他操作,内容会多一些:

如果我们想判断某个键是否存在,直接输入如下命令“exists haitao”即可:

如果返回结果是1表示存在,如果是0表示不存在。

如果想删除某个键, 使用“del key”命令即可,而且还可以删除多个键,后面返回的参数就是实际删除的键的个数,示例如下:

另外,我们还可以获取一下键的类型,常见的类型就是前面提到的五大类型:string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合),例如

2.2 字符串类型

String类型是Redis最基础的数据类型,是二进制安全的。它可以包含任何数据,例如jpeg图片或者序列化的对象,或者就简单的文本数据。String类型的value最大能存储512MB的数据。

字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别其实主要是组织字符串的方式不同,例如列表类型就是以列表的形式组织字符串等等。我们在后面会详细分析这几种数据类型的底层结构,会对此有更加深入的理解。

接下来,我们看一下字符串操作的常见命令。

1.SET:

SET命令用于设置指定键的值,如果键已经存在则覆盖旧的值。

SET name "haitao"

执行结果:OK。命令执行成功,则返回OK

2.GET:

GET命令用于获取指定键的值。

GET name

执行结果:"haitao"。如果键存在则返回其对应的值,否则返回nil

3.INCR:

INCR命令用于将指定键的值增加1。如果键不存在,那么在操作前会先将其设置为0,然后再执行加1操作。

SET counter 100
INCR counter

执行结果:101INCR命令返回执行操作后的值。

4. DECR:

DECR命令用于将指定键的值减少1。同样,如果键不存在,那么在操作前会先将其设置为0,然后再执行减1操作。

DECR counter

执行结果:100DECR命令返回执行操作后的值。

应用举例

在这里我们就想到redis的一种典型应用了:统计计数。例如我们想统计课程直播间实时在线人数,就可以使将数据先写到redis里,也就是:

set student_counter 100

redis里的数据不像数据表一样,相互之间独立,而是都在一个空间里,而在实际中,我们同时上课的直播间不止一个,我们可能还要统计某个直播间最高观看人数、当前在线人数、平均人数等等,所以我们会通过增加前缀的方式来区分,例如我们的规则是:统计的时候每个键按照如下规则设置:

科目Id_统计类型 人数

例如,采取如下的方式,就可以将各个业务的数据都存放起来了:

set math:101:max_student  100
set math:101:cur_student  50
set math:101:avg_student  60set english:102:max_student  80
set english:102:cur_student  50
set english:102:cur_student  40

正因为字符串的这个功能,我们还可以用来统计文章的访问量、课程的热度等等。另外我们可以还在微服务场景下,还可以redis来生成全局唯一的自增Id等重要功能。

2.3 List类型

List类型是Redis的一种复杂的数据类型,也是Redis的重要特性之一。Redis的List类型实际上是一个双向链表,所以添加一个新的元素到List的头部或者尾部的复杂度是O(1)。同时由于采用链表实现,可以利用索引下标来获取元素,或者进行范围查询,这个操作的复杂度是O(N)。

如果list中存储的元素非常多,我们可以想象到要获取首尾的元素仍然非常快,而要获取中间位置的元素则非常慢。这就决定了list适合处理”新鲜事、最新消息、最新评论、最新留言“这类的问题,
例如,在一个即时通讯应用中,我们一般都更关心最新的消息,因此可以使用List类型存储聊天记录,每次发送的消息都会添加到List中。
命令示例:

LPUSH chat:room1 "Hello"
LPUSH chat:room1 "How are you?"
LRANGE chat:room1 0 -1

这里的L就是left左侧的意思,一般理解为队列的头部,对应的还有个R就是right,右侧的意思,第对应的就是队列的尾部。push就是放入的意思,pop就是弹出元素的意思。通过不同的组合,我们可以构造出非常丰富的功能:

1. LPUSH:

LPUSH命令用于将一个或多个值插入到列表头部:

LPUSH mylist "World"
LPUSH mylist "Hello"

执行结果:2

LPUSH命令返回此时列表的长度。

执行命令:

LRANGE mylist 0 -1

查看列表,结果为:

127.0.0.1:6379> LRANGE mylist 0 -1
 1) "Hello"
 2) "World"

2. RPUSH:

RPUSH命令用于将一个或多个值插入到列表的尾部:

RPUSH mylist "Redis"

执行结果:3RPUSH命令返回此时列表的长度。

执行LRANGE mylist 0 -1命令查看列表,结果为:

1) "Hello"

2) "World"

3) "Redis"

3. LPOP:

LPOP命令用于移除并返回列表的第一个元素:

LPOP mylist

执行结果:"Hello"LPOP命令返回被移除的元素的值。

执行LRANGE mylist 0 -1命令查看列表,结果为:

1) "World"

2) "Redis"

4. RPOP:

RPOP命令用于移除并返回列表的最后一个元素:

RPOP mylist

执行结果:"Redis"RPOP命令返回被移除的元素的值。

执行LRANGE mylist 0 -1命令查看列表,结果为:1) "World"

以上即为Redis List类型的常用命令示例,以及它们的执行结果。 

2.4 Set类型

Set类型也是Redis的一种复杂数据类型,它是一种无序的、元素不重复的集合。由于集合中的元素是唯一的,所以可以使用Set类型来存储一些集合元素,并进行交集、并集、差集等操作。

对于set的应用,最典型的是记录社交网络中的用户之间的关系,可以使用Set类型存储用户的好友列表,以便进行好友关系的管理。
命令示例:

SADD user:1:friends user:2
SADD user:1:friends user:3
SMEMBERS user:1:friends

可以看到此时可以找到user1的两个朋友user2和user3。同样在线培训系统中,老师与课程、课程与学生、老师与学生一般都是多对多的复杂关系,我们可以采用上面方式来轻松记录。

常用命令示例

1. SADD:

SADD命令用于向集合添加一个或多个成员。

SADD myset "Hello"
SADD myset "World"

执行结果:1SADD命令返回添加成功的元素数量。

执行SMEMBERS myset命令查看集合,结果为:

1) "Hello"

2) "World"

2. SREM:

SREM命令用于移除集合中一个或多个成员。

SREM myset "World"

执行结果:1SREM命令返回移除成功的元素数量。

执行SMEMBERS myset命令查看集合,结果为:

1) "Hello"

3. SISMEMBER:

SISMEMBER命令用于判断成员元素是否是集合的成员。

SISMEMBER myset "World"
SISMEMBER myset "Hello"

执行结果:0 和 1SISMEMBER命令返回元素是否在集合中,0表示不在,1表示在。

2.5 Hash类型

Hash类型是Redis的一种复杂数据类型,它相当于一种简单的二级字典:第一级的key对应一个新的字典,这个新的字典就是Hash的内部结构,拥有自己的key-value对。Hash类型适合用于存储对象。

Hash结构虽然略复杂,但确是我们使用redis进行缓存的核心结构,因为缓存的内容,我们经常需要根据键来快速获取某个特定的对象。例如某个网站需要存储用户的个人信息,可以使用Hash类型存储用户的姓名、年龄、性别等字段。
命令示例:

HSET user:1 name "haitao"
HSET user:1 age 25
HSET user:1 gender "Male"
HGETALL user:1

常用命令示例

1. HSET:

HSET命令用于为哈希表中的字段赋值。

HSET myhash field1 "Hello"
HSET myhash field2 "World"

执行结果:1HSET命令返回操作成功的数量。

执行HGETALL myhash命令查看哈希表,结果为:

1) "field1"

2) "Hello"

3) "field2"

4) "World"

2. HGET:

HGET命令用于获取存储在哈希表中指定字段的值。

HGET myhash field1

执行结果:"Hello"HGET命令返回字段的值。

3. HGETALL:

HGETALL命令用于获取在哈希表中指定key的所有字段和值。

HGETALL myhash

2.6 Sorted Set类型

Sorted Set是Redis的一种复杂数据类型,也是集合的一种,能够存储一组数据,并且每个数据都有一个得分。数据是唯一的,但是得分(score)可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。而得分的值是通过跳跃表来进行排序的。

有序set最典型的场景是热榜,例如微博可以使用Sorted Set类型存储热门新闻的排名,以便展示热门文章;在培训系统中可以根据点击量来判断哪些课时或者内容更受欢迎等等。命令示例:

ZADD news:popular 1000 "Article1"
ZADD news:popular 800 "Article2"
ZADD news:popular 600 "Article3"
ZREVRANGE news:popular 0 -1 WITHSCORES

常用命令示例

1. ZADD:

ZADD命令用于向有序集合添加一个或多个成员,或者更新已存在成员的分数。

ZADD myzset 1 "one"
ZADD myzset 2 "two" 3 "three"

执行结果:1。ZADD命令返回被成功添加的新成员的数量。

执行

ZRANGE myzset 0 -1 WITHSCORES

命令查看有序集合,结果为:

127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

2. ZSCORE:

ZSCORE命令返回有序集中,成员的分数值。

ZSCORE myzset "one"

执行结果:"1"ZSCORE命令返回成员的分数值。

3. ZRANGE:

ZRANGE命令用于返回有序集中,指定区间内的成员。

ZRANGE myzset 0 -1

本文,我们介绍了redis最重要的五种数据类型的特征、使用方法和典型应用场景,为我们后面的学习打下坚实的基础! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载音频EMI的产生及典型音频功放AW836XX的解决方案

之前针对 eCall的文章中有提到D类音频功放需要关注EMI问题(点击文章回看《车载eCall系统音频应用解决方案》),在此展开此问题并寻求解决方案。 1. EMI定义与分类 电磁干扰(Electromagnetic Interference,EMI&#xff…

基于STM32的HX711示值放大器接口与驱动程序设计

将HX711示值放大器接口与STM32微控制器进行连接和驱动需要一定的硬件连接和软件编程。在这篇文章中,我们将介绍如何设计基于STM32的HX711示值放大器接口与驱动程序,并提供相应的代码示例。 1. 硬件连接 首先,我们需要将HX711示值放大器与STM…

openlayers [二] 初始化map 以及map的一些参数

文章目录 map 参数效果图代码分析 map 参数 controls 地图的控件 pixelRatio 设备上物理像素与设备无关像素(dip)之间的比率。 interactions 地图的互动 keyboardEventTarget 监听键盘事件的元素。这决定了KeyboardPan和 KeyboardZoom互动的触发时间。例…

残差网络 ResNet

目录 1.1 ResNet 2.代码实现 1.1 ResNet 如上图函数的大小代表函数的复杂程度,星星代表最优解,可见加了更多层之后的预测比小模型的预测离真实最优解更远了, ResNet做的事情就是使得模型加深一定会使效果变好而不是变差。 2.代码实现 impo…

网页设计(九)JavaScript基础应用

一、网页中文字的字号选择性改变 单击前初始状态页面 单击“中”链接后页面 文字素材:   JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言。你可以利用JavaScript轻易的做出亲切的欢迎讯息、漂亮的…

web前端第二次

第一题&#xff1a; <!DOCTYPE html> <html> <head><title>计算奇数和</title> </head> <body><label for"input">请输入一个正整数&#xff1a;</label><input type"number" id"input&qu…

影响CSGO搬砖饰品价格上涨和下跌的原因有哪些

到底哪些情况下CSGO饰品价格会涨&#xff0c;哪些情况会跌&#xff0c;下面是一个混迹steam平台多年的老油条&#xff0c;一点个人见解&#xff0c;不喜吻喷。 首先&#xff0c;CSGO饰品的交易是从市场进行的&#xff0c;市场终究是市场&#xff0c;是自由买卖的&#xff0c;必…

VMware Vsphere 日志:用户 dcui@127.0.01已以vMware-client/6.5.0 的身份登录

一、事件截图&#xff1a; 二、解决办法 原因&#xff1a; 三、解决办法 1.开启锁定模式 2.操作 1、从清单中选择您的 ESXi 主机&#xff0c;然后转至管理 > 设置 > 安全配置文件&#xff0c;然后单击锁定模式的编辑按钮 2、在打开的锁定模式窗口中&#xff0c;选中启…

云服务器 云服务器概述-产品简介-文档中心-腾讯云

腾讯云服务器入门教程包括云服务器CPU内存带宽配置选择&#xff0c;选择云服务器CVM或轻量应用服务器&#xff0c;云服务器创建后重置密码、远程连接、搭建程序环境等&#xff0c;腾讯云服务器网txyfwq.com分享从0到1腾讯云服务器入门教程&#xff1a; 腾讯云服务器入门教程 …

CSDN 年度总结|知识改变命运,学习成就未来

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

「许战海矩阵战略洞察」吉香居给调味品企业带来的战略启示

引言&#xff1a;吉香居通过实施份额化战略和打造形象产品&#xff0c;在调味品行业中取得了成功。但品牌结构需要调整&#xff0c;需要将子品牌整合到吉香居主品牌下&#xff0c;共同提升品牌势能。此外&#xff0c;企业需保持主品牌竞争战略&#xff0c;以实现长期稳定的高速…

transfomer中正余弦位置编码的源码实现

简介 Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。循环神经网络本身就是一种顺序结构&#xff0c;天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构&#xff0c;完全采用Attention取而代之&#xff0c;这些词序信息就会丢失&#xff0c;模型就没有办法知…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的&#xff0c;每个网络上都有许多主机&#xff0c;这样便构成了一个有层次的结构。 IP 地…

SpringAOP-说说 Spring AOP 和 AspectJ AOP 区别

Spring AOP Spring AOP 属于运行时增强&#xff0c;主要具有如下特点&#xff1a; 基于动态代理来实现&#xff0c;默认如果使用接口的&#xff0c;用 JDK 提供的动态代理实现&#xff0c;如果是方法则使用 CGLIB 实现Spring AOP 需要依赖 IOC 容器来管理&#xff0c;并且只能…

浅谈安科瑞铁塔/基站电力监控解决方案

I.背景信息&#xff1a; 2020年5G元年&#xff0c;通信行业承蓬勃发展之态&#xff0c;各大运营商和铁塔集团在布局新一代通讯基站。基站用电量不断上升&#xff0c;通信基站智能化电力监控及节能管理已成为各运营商企业的研究方向。 而同时&#xff0c;目前铁塔基站电力使用…

靶机-basic_pentesting_2

basic_pentesting_2 arp-scan -l查找靶机IP masscan 192.168.253.154 --ports 0-65535 --rate10000 端口扫描 nmap扫描nmap -T5 -A -p- 192.168.253.154 目录扫描80端口 http://192.168.253.154/development/dev.txt 2018-04-23: I’ve been messing with that struts stu…

mipi协议

完成mipi信号通道分配后&#xff0c;需要生成与物理层对接的时序、同步信号&#xff1a; MIPI规定&#xff0c;传输过程中&#xff0c;包内是200mV、包间以及包启动和包结束时是1.2V&#xff0c;两种不同的电压摆幅&#xff0c;需要两组不同的LVDS驱动电路在轮流切换工作&#…

数据集成时表模型同步方法解析

01 背景介绍 数据治理的第一步&#xff0c;也是数据中台的一个基础功能 — 即将来自各类业务数据源的数据&#xff0c;同步集成至中台 ODS 层。业务数据源多种多样&#xff0c;单单可能涉及到的主流关系型数据库就有近十种。功能更加全面的数据中台通常还具有对接非关系型数据…

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME/Library/Java/JavaVirtualMachine…

Python图像处理【18】边缘检测详解

边缘检测详解 0. 前言1. 图像导数2. LoG/zero-crossing2.1 Marr-Hildteth 算法 3. Canny 与 holistically-nested 算法3.1 Canny 边缘检测3.2 holistically-nested 边缘检测 小结系列链接 0. 前言 边缘是图像中两个区域之间具有相对不同灰级特性的边界&#xff0c;或者说是亮度…