access数据放到list中_二、redis中String和List两种数据类型和应用场景

导读

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

本篇文章我们学习的是redis中基础数据类型String和List,以及他们的应用场景。

615d22b561234117a9e33e4cef2fd892

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之需要掌握的知识点

后续还需要学习的内容

3a71115030644b3dac54cc750220c579
3979cf27760a473aac200e1a52184a98
258471f6b5fd46628d6de9a091c748c4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值