二、redis中String和List两种数据类型和应用场景

导读

前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容进行了一个梳理。从本篇文章开始,我们将要对redis中各个知识点做详细的学习和分析。

本篇文章我们学习的是redis中基础数据类型String和List,以及他们的应用场景。
在这里插入图片描述

如果大家在工作、学习、面试中针对redis还有什么疑问或者其他问题,可以评论区告诉我。
为了保证可以连续不间断的获取最新的技术分析及讲解,建议关注本博客。

String

应用场景:基于字符串的操作–》存储session,map等热数据

使用:

Set key value命令

| Get key命令

| STRLEN key命令:返回 value的字节长度

| APPEND key value命令:对原有value值进行追加操作

| MSET 和 MGET命令可以一次存储或获取多个key对应的值。

应用场景:基于数字的操作–》计数器。

限流:以ip地址为key,初始数值为6,每次进入减少1,减少到0后不可再进入;秒杀场景,扣库存

| 使用:

INCR key 命令 对是数值类型的value进行+1操作。INCR key 和 DECRBY 命令 都是将字符串值解析成整型然后进行操作。

应用场景: 基于二进制位bit的操作-bitmap(位图)–》

统计用户任意时间窗口内的登录次数或统计任意时间窗口内活跃的用户数量。

什么是二进制?什么是二进制操作?什么是位图?位图应用场景。

使用:

SETBIT 操作二进制位.“Setbit key offset value”. offset为从左向右的偏移量。

“Setbit k1 1 1”存入数据。“STRLEN k1”返回长度为1字节。 “Get k1” 返回“@”。

为什么会返回“@”,这是因为二进制中1字节位8bit.第一个bit位永远为0.,所以“Setbit k1 1 1”其实往redis中存入的1字节数据应该为“01000000”,“01000000”其实为2的6次方为64。在ASCII码中64表示的字符串为“@”。

‘setbit k1 7 1’命令的语义为往redis中存入一个1字节的数据,该字节从左向右数偏移量为7的bit位存入数值1,即由原来的‘01000000’变更为‘01000001’,即65,因此“get k1”返回ASCII码值为65的字符串“A”。从上面命令可以发现“set bit” 命令不会覆盖原value的值,只会修改指定偏移量位置的值

| BITCOUNT 命令。

‘bitcount key start
end’命令统计指定key中字节范围内1的个数。Start和end指定的是value中字节开始和其实的位置。

例如 有个key 为k1,value为‘01000001 01000000’。则“bitcout k1 0 2”返回的值为3.这是因为在以上value的二进制表示中有3个1。 可以使用 ‘bitcount k1 0 -1’查询指定key中的所有二进制1的个数。 可以使用 “-1”表示全部,这是因为“bitcount”命令的字节索引拥有正向索引和反向索引两种

| BITOP 命令可以对指定key集合进行按位与(and)、或(or)操作然后把二进制操作后的值保存到指定的 destkey中。‘BITOP operation destkey key [key …]’。

“BITOP and andkey k1 k2”命令表示 对 ‘k1’和‘k2’的value进行二进制
与(and)操作,然后把操作的结果保存到‘andkey’中。
‘BITOP or orkey k1
k2’命令表示为‘k1’和‘k2’的value进行二进制或(or)操作,然后把操作的结果保存到‘orkey’中。

List

Redis中的List是一个双向链表,可以模拟队列(逆向)、栈(同向)、数组(下标)

LPUSH向LIST左边(头部)添加元素(LPUSH key value…)

| RPUSH向LIST右边(尾部)添加元素(RPUSH key value…)

| LRANGE 可以获取链表中指定范围的结果,由于也是双向的,因此也可以使用-1表示尾部(LRANGE key 0 -1 获取全部数据)

| 不管是LPUSH还是RPUSH,都可以一次给一个key赋多个值

| RPOP 或者 LPOP 命令可以从LIST的右边或者左边删除一个值,并返回删除的值

| 使用PUSH 和POP命令的组合可以展示队列和栈的效果;左侧存左侧取同向存取则为栈,先进后出; 左侧存右侧取逆向存取则为队列,先进先出

| LINDEX或RINDEX 命令可以获取LIST中指定下标的值(LINDEX key 4)

| LTRIM key start stop 或RTRIM命令可以截取LIST中指定长度的数据(LTRIM key 0 2
),只保留LIST中指定长度的数据,LTRIM的应用场景为永远只保留最新的数据,例如永远只获取前几个最新的热点评论

| LIST上的阻塞操作: 当使用POP命令从LIST中获取数据时,如果此时LIST为空,则用户需要在客户端不断轮询请求,无效的轮询会浪费CPU并且增加REDIS的压力;这个时候就可以使用BRPOP或者BLPOP命令以阻塞的方式获取数据,可以给阻塞增加超时时间,如果在指定时间内有数据了则返回,如果在指定时间内没有数据被获取则返回null。同时,redis还为所有阻塞的消费者按照先后顺序进行排队

| 在LIST中还有进阶的安全队列命令:RPOPLPUSH和BRPOPLPUSH。

“RPOPLPUSH key1
key2”从key1所属LIST右侧读取一个数据然后推送到key2所属的LIST左侧;
如果key1不存在则返回null,并且不执行任何操作;
如果key1和key2相同,那么这个步骤就相当于一个旋转操作成为一个循环队列;
BRPOPLPUSH是RPOPLPUSH的阻塞队列版本,也可以指定等待阻塞的时间;

RPOPLPUSH模式一安全队列的应用场景为:当客户端读取数据后把数据从key1尾部移动到key2头部,当客户端处理完数据后,可以使用LREM命令再删除key2中的数据,这种模式可以防止因为客户端崩溃而丢失数据,定时任务可以定时扫描key2,如果key2中有的值已经存在很长时间了,则可以把它重新加入到key1消息队列中;

RPOPLPUSH模式二循环队列也可以应用到监控程序中,多个客户端同时对一个key进行旋转操作,他们会得到不同的值,当队列中消息都被访问过之后,队列又会从头开始进行,这个模式的好处是,当某一个客户端出错把消息丢失了也不用担心,在一定的时间之后可以被重新读取到。

后续redis中将要讲解的内容梳理

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

往期文章

Redis

一、深入理解redis之需要掌握的知识点

Java集合

一、深入理解-Java集合初篇

二、Jdk1.7和1.8中HashMap数据结构及源码分析

三、JDK1.7和1.8HashMap数据结构及源码分析-续

四、深入理解Java中的HashMap「网易面试快答」

五、深入理解JDK1.7中HashMap哈希冲突解决方案

六、深入理解JDK1.8中HashMap哈希冲突解决方案

七、JDK1.7中HashMap扩容机制

八、JDK1.8中HashMap扩容机制
Java-IO体系

一、C10K问题经典问答
二、java.nio.ByteBuffer用法小结
三、Channel 通道
四、Selector选择器
五、Centos-Linux安装nc
六、windows环境下netcat的安装及使用
七、IDEA的maven项目的netty包的导入(其他jar同)
八、JAVA IO/NIO
九、网络IO原理-创建ServerSocket的过程
十、网络IO原理-彻底弄懂IO
十一、JAVA中ServerSocket调用Linux系统内核
十二、IO进化过程之BIO
十三、Java-IO进化过程之NIO
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
十六、Netty入门服务端代码
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒