常用命令
-
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后面追加world -
GETRANGE 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类型 -
FLUSHALL
Remove all keys from all databases -
object encoding k1
如果value为1,上面的命令显示为int类型 -
APPEND
INCR
等方法会改变数据的类型
命令指定类型
数值类型
-
INCR k1
+1 -
INCRBY k1 23
+23 -
decr k1
-1 -
decrby k1 22
-22 -
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
bitmap
-
SETBIT k1 1 1
二进制位 1offset设为1执行
SETBIT k1 1 1
和setbit k1 7 1
值为01000001
get k1
为ASCII的A
再执行SETBIT k1 9 1
后 长度变为2,占两个字节 值为01000001 01000000
get 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 1
1号用户在1号登录setbit 20210802 1 1
1号用户在2号登录setbit 20210802 7 1
7号用户在2号登录BITOP or destkey 20210801 20210802
用户(包括去重)存入destkeyBITCOUNT destkey 0 -1
计算人数