跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)

前言

来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结。

Redis默认有16个数据库(编号为0~15),默认使用第0个,通过命令select任意切换数据库,和MySql切换数据库一个道理;各数据库之间的数据是隔离的,先启动服务端,再启动客户端,然后开干,如下演示:

Select命令,用于切换数据库

清除数据,主要是测试时使用,在生产环境是杜绝使用这个命令的,如下演示:

Flushdb清除当前库中的数据

Flushall清除所有库中的数据

Key获取、移除、判断是否存在,如下演示

Keys 获取Key

Move 移动指定Key到指定数据库

Exists 判断Key是否存在

 

查看指定Key对应值类型,如下:

type  key

公共的命令暂时就说这么多,接下来开始说说五种基本类型的使用及应用场景;之所以用图片的方式把命令贴出来,主要是在不失真的情况下方便手机阅读,同时希望小伙伴们可以动手敲敲,不要复制~~~

Redis的命令很多,接下来只是说常用的,其他的小伙伴参照文档进行实操吧,这里还是注重实际场景的应用(综合同事、朋友、还有学习过程中提到的场景,并非我都遇到过~~~);

正文

Redis中基本的五种数据结构,分别是字符串string、哈希hash、列表list、集合set、有序集合zset,存储的数据结构大概如下图;

string

非常常用的类型,搞过Redis的应该都用过。着重分享以下命令:

set key  value  :  新增或更新字符串键值对

mset key value [key1 value1 ...]:批量新增或更新键值对

setnx key value :如果key不存在就添加,否则就失败

setex key seconds value:设置简直对的时同时设置过期时间

get key :获取指定key的值

mget key [key1 key2 ...]:获取多个key的值

del key [key1 key2 ...]:删除指定key

expire key seconds:设置指定key过期时间,以秒为单位

ttl key:查看指定key还剩余多长时间

incr key:将指定key存储的数值加1

decr key:将指定key存储的数值减1

incrby key step:将指定key存储的数值加上step

decrby key step :将指定key存储的数值减去step

结合应用场景演练↓↓↓

单值缓存:即简单键值对数据缓存;有一些数据需要共享,比如在没有统一授权中心的多个系统中,可以通过相同的算法共享token字符串进行各系统统一认证;

对象缓存:比如之前都喜欢用Session保存用户数据,然后在每个网页中进行使用,但对于分布式或是集群系统就需要做Session共享了,一般会将用户信息转为json字符串进行缓存;

对于简单的对象缓存,也可以用mset和mget实现,但使用相对不如上例方便,如下:

以上只是用于共享数据,但其实经常会用于缓存一些高频率访问但不频繁修改的数据上。比如采集设备数据,需要实时核对设备是否正确,当采集比较频繁,如传感器数据时,核对的设备信息不可能实时从数据库中查,需将其进行缓存,减轻数据库压力的同时,也能提高效率。

可能看到这,有小伙伴会问key值中的冒号啥意思,其实这里是用来分层归类的,就比如userData:userId:userName,理解为:用户数据中指定用户的用户名。

计数器:有没有遇见一种需要递增的数据编号,比如说订单编号:202009290001,后四位不断的递增,单体程序还稍微好处理一点,但如果是分布式系统或集群就有点意思了,所以存在Redis中进行统一递增是不错的选择,针对数据量大的,还可以进行分段计数。

文章阅读数或网页浏览数统计:常见博客文章或是公众号都有阅读数统计,或是自己开发的站点需要统计页面访问量,用Redis也可以轻松实现,换其他方式估计得费点心思。

分布式锁:单体程序,多线程通过线程锁来控制资源抢占,对于分布式系统就用线程锁就不行了,借助于setnx(set if not exists的缩写) 来完成,及如果没有值就能新增成功,否则就失败,和资源被占就要等待原理是一样的,当然还得考虑对应值的过期和删除,不然一直占用也不行。

字符串的常规操作:比如截取字符串、获取字符串长度等操作。

通过以上可知,字符串的功能还是很强大的,这应该就是很多人喜欢用而且只用它的原因吧。

hash

hash的相关命令一般以h开头,着重分享以下命令:

hset key field  value  :  新增或更新key对应字段的值;

hsetnx key field value:新增一个不存在Key的字段值;

hmset key field value [field value ...]:在指定Key上存储多个字段和值

hget key field:获取指定key中指定字段的值;

hdel key field [field1...]:删除指定Key值的指定字段

hlen key:获取指定key中的字段的数量

hgetall key:获取指定key中所有的字段值

hincrby key field step:指定key中字段值增加step

结合应用场景演练↓↓↓

对象缓存:string也能做,为什么还要用hash?,string一般用于简单对象的缓存,比如字段不多,记录也不多的情况,便于序列化解析。

平时项目中有配置信息或下拉数据信息,会用于各个页面,这种变化频率不高,但需频繁的读取的数据,将其进行缓存减少数据库访问是不错的选择:

当做数据库:有一个同学,做硬件相关系统,通常关于硬件的相关的参数配置都放在内存中,但由于参数过多时,维护是非常不爽的事,而且稍微一个参数的改动,就会重新发布程序。有些也采用SQLite来存储,对于高效访问和修改,Redis却是相对比较优的选择:

如:多个主机,每个主机中有不同的属性,每个属性有对应的值。

做购物车(之前学习记录的):因为大型的网站,用户很多,将每个人的购物车信息都进行关系存储,做以下页面是有点难处的。所以用Redis做比较高效,至于一些明细信息,可以通过商品ID从关系数据库中查找。

相对于string来说,对于对象存储,不用来回进行序列化,减少内存和CPU的消耗,但设置过期不能到具体字段,只能针对Key设置。

list

着重分享以下命令:

lpush key value [value1 ...] :在指定key的列表左边插入一个或多个值;

rpush key value [value1 ...] :在指定key的列表右边插入一个或多个值;

lpop key :从指定key的列表左边取出第一个值;

rpop key:从指定key的列表右边取出第一个值;

lrange key start end:从指定key列表中获取指定区间内的数据;

blpop key [key1 ...] timeout:从指定key列表中左边取出第一个值,若列表中没有元素就等待timeout时间,如果timeout为0就一直等待。

brpop key [key1 ...] timeout:从指定key列表中右边取出第一个值,若列表中没有元素就等待timeout时间,如果timeout为0就一直等待。

lset key index value:将指定下标的值更新为value,

结合应用场景演练↓↓↓

用于模拟数据结构:

  • 栈:先进后出,lpush+lpop 或 rpush+rpop;

  • 队列:先进先出,lpush+rpop 或 rpush+lpop;

  • 阻塞队列:先进先出,如果列表没有元素就等待,lpush+brpop或rpush+blpop;

用于数据传输桥梁:经常会遇见采集一些仪器相关数据的需求,但通常方式都会让仪器生成数据文件,供其它程序进行解析,也有用Redis中List作为桥梁传输数据的,减少自己生成文件的过程,通过用List的方式,一边塞进去,一边定时取出,然后发送到远程。同样的道理,也可以用于一些消息的推送,比如关注了一个公众号,要发送给订阅者,首先公众号发表文章到List,有一个后台任务程序定时进行取出发给订阅者,这里就是拿公众号举一个例,并非公众号是这么实现。

模拟消息推送

专门有一个后台任务程序从关注者消息列表中取出消息,依次发给每个关注者。

list常规操作(获取,更新,插入):

set

set命令一般以s开头,里面元素无序且不重复,着重分享以下命令:

sadd key member [member ...]:在集合中增加一个或多个元素;

srem key member [member ...]:从集合中删除一个或多个元素;

smembers key:获取集合中的所欲元素;

scard key:获取集合中的元素个数;

sismember key member:判断指定member是否在集合中;

srandmember key [count]:从集合中获取count个元素,不从集合中删除;

spop key [count]:从集合中获取count个元素,从集合中删除

sinter key [key1 ...]:指定多个集合进行交集运算;

sinterstore dest key [key1 ...]:指定多个集合进行交集运算,存入dest集合;

sunion key [key1 ...]:指定多个集合进行并集运算;

sunionstore dest key [key1 ...]:指定多个集合进行并集运算,存入dest集合;

sdiff key [key1 ...]:指定多个集合进行差集运算;

sdiffstore dest key [key1 ...]:指定多个集合进行差集运算,并存入dest集合;

结合应用场景演练↓↓↓

抽奖逻辑:抽奖小伙伴们不陌生了吧,不管是公司年会抽奖,还是公众号参与抽奖,应该几乎不用亲手抓阄了吧。都是通过程序,把人员都放在一起,然后随机抽取,set很符合这种应用场景,如下:

以上是随便找一个抽奖小程序创建的抽奖,开始命令演练:

文章点赞:发表文章之后,可以进行点赞、取消点赞等相关操作;

共同好友统计

zset

zset的命令一般以z开头,里面元素是有序不可重复的。和Set用法基本一样,只是每个元素中多了一个分值,用于元素排序。

zadd key score member [(score member)...]:往有序集合中添加带分值的元素;

zrem key member [member...]:从有序集合中删除成员;

zscore key member:返回集合中指定成员的分值;

zcard key:统计集合中元素个数;

zrange key start stop [withscores]:返回指定范围的元素,withscores代表返回的元素包含对应的分值。

zreverange key start stop [withscores]:返回指定范围的倒序元素,withscores代表返回的元素包含对应的分值。

同set一样也可以进行交集、并集、差集的集合运算。

综合应用场景↓↓↓

用于排名:比如考试成绩的排名,新闻热度排行榜,直播打赏排名等。

新闻热榜:

总结

以上简单结合实例应用场景将五种基础类型的常用命令进行分享,还有大量的命令需要小伙伴们结合实际需求进行应用。文中实例大部分是周围项目中的使用场景,少部分是参考学习资料,总体来说,文中实例应用只作为思路参考,小伙伴可根据业务需求进行应用,对于命令的使用还需要小伙伴们多多练习实践。下一篇聊聊三种特殊类型。

一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~

撸文不易,莫要白瞟,三连走起~~~~

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

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

相关文章

leetcode周赛6070. 计算字符串的数字和

一:题目 二:上码 class Solution { public:/**思路:1.设置一个while循环&#xff0c;循环的条件是s.length<k2.while里面进行 1>:将字符串按k个进行拆分成个单个字符&#xff0c;并将其转换成数字,然后计算将计算结果再组成字符串 */string digitSum(string s, int k) {…

ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法

User Agent中文名为用户代理&#xff0c;简称 UA&#xff0c;它是一个特殊字符串头&#xff0c;使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。百度百科在 ASP.NET Core 中&#xff0c;可以通过以下代码在 …

leetcode周赛6071. 完成所有任务需要的最少轮数

一:题目 二:上码 class Solution { public:/**思路:1.如果x1的话,那么的话 直接返回-12.如果x2的话&#xff0c;那么就一次执行3.如果x是3的倍数的话,那么就直接执行 x/3 次4.如果x/3 余数是1的话 那就执行 x/31,比方说是4 其实是两个2&#xff0c;但是我们求数的的时候,我们求…

netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布

前面的文章聊过用 jenkins 做了一个简单的自动化发布&#xff0c;在shell中采用的是 BUILD_IDdontKillMe nohup dotnet xxx.dll & 这种简单的后台承载&#xff0c;如果你的业务量相对比较小&#xff0c;可以用这个方法玩一玩&#xff0c;但存在二个问题&#xff1a;1. 无法…

实战解读ASP.NET Core身份认证

长话短说&#xff1a;上文我们聊了 ASP.NET Core 基于声明的访问控制到底是什么鬼&#xff1f;今天我们乘胜追击&#xff1a;聊一聊ASP.NET Core 中的身份验证。身份验证是确定用户身份的过程。授权是确定用户是否有权访问资源的过程。1. 万变不离其宗显而易见&#xff0c;一个…

Java并发之AQS

文章目录一:AQS简介二:了解AQS 上锁和释放锁的原理1:前言2:上锁(非公平锁)(1):我们从main主函数中点进去(2):从lock进入(3):找到非公平锁中的lock(4):查看acquire()方法(5):查看tryAcquire(arg)方法a:前言介绍b:进入ReentrantLock类中的nonfairTryAcquire方法(6):addWaiter(Nod…

网络知识 | 《图解TCP/IP》读书笔记(上)

【网络知识】| 作者 / Edison Zhou这是EdisonTalk的第290篇原创内容作为一个专业的IT技术人&#xff0c;一个Web应用开发者&#xff0c;不了解网络基础和协议&#xff0c;怎么能行&#xff1f;本文是我2016年阅读《图解TCP/IP》一书的读书笔记&#xff0c;希望对你有所帮助&…

Java并发之semaphore(信号量)

文章目录1:官方解读2:通俗易懂的例子解析3:代码解析4:Semaphore的应用5:类结构和相关方法(1):类结构(2):acquire()方法(3):release()方法6:总结1:官方解读 semaphore信号量就是并发工具类,Semaphore管理着一组许可permit&#xff0c;许可的初始数量通过构造函数设定。 当线程要…

IdentityServer4系列 | 初识基础知识点

前言我们现在日常生活中&#xff0c;会使用各式各样的应用程序&#xff0c;层出不穷&#xff0c;其中有基于网页浏览方式的应用&#xff0c;有基于手机端的App&#xff0c;甚至有基于流行的公众号和小程序等等&#xff0c;这些应用&#xff0c;我们不仅要实现各个应用的功能之外…

八大排序算法之终章---归并排序

一:简单介绍 归并排序排序就是利用归并的思想实现的排序方法 它的原理是将初始化序列划分成n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并&#xff0c;得到(n/2)个长度为1或者2的有序子序列;然后再两两合并…不断重复 直到最后 得到一个长度为n的有序…

Firefox 18周岁

Mozilla Firefox 起源于开源运动兴起之初建立的一个项目组织——Mozilla 社区&#xff0c;可以说是最早以“开源”名义出现&#xff0c;并取得成功的项目之一。Firefox 首次发行是在2002年的9月23日&#xff0c;当时的代号为“Phoenix”&#xff08;凤凰&#xff09;。18年过去…

三种方式让你轻松监控 EntityFramework 中的 sql 流转

大家在学习entityframework的时候&#xff0c;都知道那linq写的叫一个爽&#xff0c;再也不用区分不同RDMS的sql版本差异了&#xff0c;但是呢&#xff0c;高效率带来了差灵活性&#xff0c;我们无法控制sql的生成策略&#xff0c;所以必须不要让自己缺乏好的工具去监控sql&…

java并发之CountdownLatch

一:CountdownLatch 1:基本含义 CountDownLatch中count down是倒数的意思&#xff0c;latch则是门闩的含义。整体含义可以理解为倒数的门栓&#xff0c;似乎有一点“三二一&#xff0c;芝麻开门”的感觉。CountDownLatch的作用也是如此&#xff0c;在构造CountDownLatch的时候…

leetcode142. 环形链表 II(详解)

一:题目 二:思路分析 三:上码 class Solution { public:ListNode *detectCycle(ListNode *head) {ListNode* slow head;ListNode* fast head;while (fast ! NULL && fast->next ! NULL && fast->next->next ! NULL) {//这里选用快指针fast fast-&g…

国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作

引言经过前期的准备工作&#xff0c;.net core 3.1的运行环境和WEB服务器已经搭建完毕&#xff0c;这里需要注意一下&#xff0c;达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官方源上并没有正式发布&#xff0c;需要从Win64安装版本中的drivers/dotNet提取&…

网络知识 | 《图解TCP/IP》读书笔记(下)

【网络知识】| 作者 / Edison Zhou这是EdisonTalk的第291篇原创内容作为一个专业的IT技术人&#xff0c;一个Web应用开发者&#xff0c;不了解网络基础和协议&#xff0c;怎么能行&#xff1f;本文是我2016年阅读《图解TCP/IP》一书的读书笔记下半部分。上半部分&#xff1a;点…

leetcode202. 快乐数(详解)

一:题目 二:上码 class Solution { public:/**思路&#xff1a;1.破解这道题的关键是 我们得破解这个无限循环2.根据这个题目给出的定义2 我们可以知道 无限循环的条件是我们 在计算的过程中出现了自己的数*/bool isHappy(int n) {unordered_set<int>s;s.insert(n);…

自由软件基金会庆祝成立35周年

美国东部时间 10 月 4 日&#xff0c;自由软件基金会&#xff08;Free Software Foundation&#xff0c;FSF&#xff09;在官网发文庆祝”其为争取软件自由而奋斗的第 35 年“。1985 年 10 月&#xff0c;自由软件运动的主要发起人 RMS&#xff08;Richard Matthew Stallman&am…

使用 C# sdk 连接 高可用的 rabbitmq 镜像集群

我们知道rabbitmq是一个专业的MQ产品&#xff0c;而且它也是一个严格遵守AMQP协议的玩意&#xff0c;但是要想高端大气上档次&#xff0c;一定需要拿出高可用的东西出来&#xff0c;这不本篇就跟大家说一下cluster的概念&#xff0c;rabbitmq是erlang写的一个成品&#xff0c;所…

java并发之CyclicBarrier(通俗易懂)

文章目录一:简介(1):官方解释(2):通俗解释a:CountDownLatch()b:CyclicBarrier()二:小demo一:简介 (1):官方解释 说到简介那就非得拿他和countdownlatch()进行比较讨论了CountDownLatch是一个同步的辅助类&#xff0c;允许一个或多个线程&#xff0c;等待其他一组线程完成操作…