ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis2-string和bitmap

2021-08-18 23:33:17  阅读:234  来源: 互联网

标签:string 登录 redis 用户 setbit Redis2 k1 bitmap 字节


image-20210817225056836

image-20210817225146395

常用命令

  1. redis-cli 连接客户端

  2. redis-cli -p 6380 连接制定端口

  3. redis-cli -h 帮助文档

  4. select 8 选择库(默认16个库)

  5. redis-cli -p 6380 -n 8 连接制定端口制定8号库

  6. help @generic 查看通用组帮助

  7. set key380 hello 设置key

  8. get key380 获取key

  9. keys * 查询所有key

  10. FLUSHDB 清数据

String Byte

  • 字符串
  • 数值
  • bitmap

字符串

image-20210817230541850

命令

  1. SET key value [expiration EX seconds|PX milliseconds] [NX|XX] nx表示无值的时候才执行成功(分布式锁) xx表示有值的时候才执行成功
  2. mset k3 value3 k4 value4 含义为 more set,用来设置多个值
  3. mget k1 k2 获取两个值
  4. appenk k1 "world" 在k1后面追加world
  5. GETRANGE k1 6 10 获取k1某两个索引之间的字符串子串(支持正负索引
  6. GETRANGE k1 0 -1 -1 负索引
  7. SETRANGE k1 6 zhoum 从某个索引开始覆盖
  8. strlen k1 获取字符串长度
  9. getset k1 zhoum 取出旧值,并将旧值设置为新值 减少io通信
  10. msetnx k2 c k3 d 这个命令可以保证多笔操作是原子操作,类似于一个事务中
  11. type k1 查看k1的value类型
  12. FLUSHALL Remove all keys from all databases
  13. object encoding k1 如果value为1,上面的命令显示为int类型
  14. APPEND INCR 等方法会改变数据的类型
image-20210817235830876

命令指定类型

image-20210817232035030

数值类型

  1. INCR k1 +1
  2. INCRBY k1 23 +23
  3. decr k1 -1
  4. decrby k1 22 -22
  5. incrbyfloat k1 0.5 -0.5

二进制安全

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

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

  • 编码并不会影响数据的存储

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

    Xshell 默认连接编码 UTF-8 ,UTF-8 中字3个字节GBK 两个字节

    redis-cli -p 6380 --raw 自动转连接编码(方便查看内容)

原子性命令 MSETNX Set multiple keys to multiple values, only if none of the keys exist

image-20210818000112597

bitmap

image-20210818220344154

  1. SETBIT k1 1 1 二进制位 1offset设为1

    执行SETBIT k1 1 1setbit k1 7 1 值为01000001 get k1为ASCII的A 再执行SETBIT k1 9 1 后 长度变为2,占两个字节 值为01000001 01000000 get k1为ASCII的A@

image-20210818222521241
2. BITPOS k1 1 0 0 返回第0个字节到第0个字节 第一个值为1的位置信息

k1为01000001 01000000执行BITPOS k1 1 0 0 返回1 执行BITPOS k1 1 0 1 返回 1

image-20210818224003623

  1. BITCOUNT k1 1 1 1 返回第1个字节到第1个字节 1出现的次数

image-20210818224156421

  1. BITOP and andkey k1 k2 多个值与或非操作 andkey 保存结果

image-20210818224725937

实际场景

image-20210818231347292

  • 公司有用户系统,让你统计用户登录天数,且时间窗口随机。例如,A用户在某一年中登陆了几次。怎么优化?
  1. 常见方式: 用数据库存放<ID,登录日期>

  2. 可以使用redis实现,假设一年400天,让每一天对应一个二进制位,需要50个字节即可。

    setbit gary 1 1 第2天登录

    setbit gary 7 1 第8天登录

    setbit gary 364 1 第365天登录

    BITCOUNT gary -2 -1 统计 在最后16天的总登录次数

    image-20210818225630429

  • 京东618做活动:登录就送礼物,大库备货多少礼物假设京东有2E用户

    用户分:僵尸用户/冷热用户/忠诚用户

    目标即为:活跃用户统计!

    随即窗口比如说 1号~3号登录为活跃用户 连续登录要去重

    setbit 20210801 1 1 1号用户在1号登录

    setbit 20210802 1 1 1号用户在2号登录

    setbit 20210802 7 1 7号用户在2号登录

    BITOP or destkey 20210801 20210802 用户(包括去重)存入destkey

    BITCOUNT destkey 0 -1 计算人数

image-20210818230913324

标签:string,登录,redis,用户,setbit,Redis2,k1,bitmap,字节
来源: https://www.cnblogs.com/zhoum/p/15159399.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有