Redis实战(二):Redis 的 String 类型 & bitmap

Redis

在这里插入图片描述

常用命令、数据类型

在这里插入图片描述

查看帮助

To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

例如,help @string

字符串操作

set k1 value1 nx nx表示无值的时候才执行成功

set k1 value1 xx xx表示有值的时候才执行成功

mset k3 value3 k4 value4 含义为 more set,用来设置多个值

mget k1 k2 获取两个值

msetnx k2 c k3 d 这个命令可以保证多笔操作是原子操作,类似于一个事务中

appenk k1 "world" 在k1后面追加world

getrange k1 2 5 获取k1某两个索引之间的字符串子串(支持正负索引
在这里插入图片描述

setrange k1 mashibing 从某个索引开始覆盖

strlen k1 获取字符串长度

getset k1 bashibing 取出旧值,并将旧值设置为新值(这样可以减少一次IO通信)

查看某个key的类型

type k1查看k1的类型

如果value为1,查看的时候显示是string类型,但是是可以进行int类型的自增操作的:incr k1

查看encoding编码类型

object encoding k1
如果value为1,上面的命令显示为int类型

有一些方法会改变数据的类型

数值类型的加减操作

decr k1 k1-1

decrby k1 22 k1+22

incrbyfloat k1 0.5k1-0.5

二进制安全

redis 是二进制安全的,并不会去破坏你的编码,也不去关心你是什么编码。底层存储的时候,是按照Byte字节存储的。我们前面看到的encoding,只是为了让加减之类的运算方法变得更快一些。
(HBASE也是二进制安全的)

在redis进程与外界交互的时候,redis存储的是字节流,而不会转换成字符流,也不会擅自按照某种数据类型存储,这样保证了数据不会被破坏,不会发生数据被截断/溢出等错误。

  • 编码并不会影响数据的存储
  • 因此,在多人使用redis的时候,我们一定要在用户端约定好数据的编码和解码

在这里插入图片描述

问:Redis单线程是为了减少用户态到内核态的切换吗?
答:不是,至少主要原因不是。
操作系统为了响应多用户的请求,而进行的从用户态到内核态的切换,造成的的性能损耗,远不及为了保证数据一致性加锁带来的损耗。
Redis单线程是为了避免加锁的过程。

位图 bitmap

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

bitop按位操作

在这里插入图片描述

业务场景:

  • 公司有用户系统,让你统计用户登录天数,且时间窗口随机。例如,A用户在某一年中登陆了几次。怎么优化?
    可以使用redis实现,假设一年400天,让每一天对应一个二进制位,需要50个字节即可。
    setbit Tom 1 1 表示 Tom 在第2天登录了一次(下标从0开始)
    setbit Tom 364 1 表示 Tom 在第365天登录了一次
    bitcount Tom -2 -1 统计 Tom 在最后16天的总登录次数
  • 你是京东,618做活动,登录就送礼物,假设京东有2亿用户。大库应该备货多少礼物?
    用户应该分为:僵尸用户、冷热用户、忠诚用户
    你需要统计活跃用户,也是随机时间窗口
    比如说,统计本月1号~3号范围内的活跃过的用户,需要去重
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章