Redis2-string和bitmap


常用命令
-
redis-cli 连接客户端
-
redis-cli -p 6380 连接制定端口
-
redis-cli -h 帮助文档
-
select 8 选择库(默认16个库)
-
redis-cli -p 6380 -n 8 连接制定端口制定8号库
-
help @generic 查看通用组帮助
-
set key380 hello 设置key
-
get key380 获取key
-
keys * 查询所有key
-
FLUSHDB 清数据
String Byte
- 字符串
- 数值
- bitmap
字符串

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

bitmap

-
SETBIT k1 1 1二进制位 1offset设为1执行
SETBIT k1 1 1和setbit k1 7 1值为01000001get k1为ASCII的A再执行SETBIT k1 9 1后 长度变为2,占两个字节 值为01000001 01000000get k1为ASCII的A@

2. BITPOS k1 1 0 0 返回第0个字节到第0个字节 第一个值为1的位置信息
k1为
01000001 01000000执行BITPOS k1 1 0 0返回1 执行BITPOS k1 1 0 1返回 1

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

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

实际场景

- 公司有用户系统,让你统计用户登录天数,且时间窗口随机。例如,A用户在某一年中登陆了几次。怎么优化?
-
常见方式: 用数据库存放<ID,登录日期>
-
可以使用redis实现,假设一年400天,让每一天对应一个二进制位,需要50个字节即可。
setbit gary 1 1第2天登录setbit gary 7 1第8天登录setbit gary 364 1第365天登录BITCOUNT gary -2 -1统计 在最后16天的总登录次数
-
京东618做活动:登录就送礼物,大库备货多少礼物假设京东有2E用户
用户分:僵尸用户/冷热用户/忠诚用户
目标即为:活跃用户统计!
随即窗口比如说 1号~3号登录为活跃用户 连续登录要去重
setbit 20210801 1 11号用户在1号登录setbit 20210802 1 11号用户在2号登录setbit 20210802 7 17号用户在2号登录BITOP or destkey 20210801 20210802用户(包括去重)存入destkeyBITCOUNT destkey 0 -1计算人数

本文来自博客园,作者:gary2048,转载请注明原文链接:https://www.cnblogs.com/zhoum/p/15159399.html

浙公网安备 33010602011771号