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
- 1
- 2
- 3
- 4
- 5
例如,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.5
k1-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号范围内的活跃过的用户,需要去重