中高级用法

redis有正负索引 从头到尾0~+无穷,从尾巴到头 -1 ~-无穷

String

mset

mget

getset 设置新值并获取旧值

setxx 与setnx相反,表示存在才能set进去,否则失败

msetnx是原子性的,要么都成功,要么都失败

msetnx k1 a k2 b

mget k1 k2

msetnx k2 c k3 d

mget k1 k2 k3 (还是只有k1 和k2 ,分别为a和b)

bitmap

setbit key offset value

offset是bit位,实际存储还是byte字节存

前置知识:1字节=8位

eg:

setbit k1 1 1表示在下标为1的bit位存放1,换算就是第0号字节存

strlen k1 结果是1

setbit k1 9 1表示在下标为9的bit位存放1,超出第一个字节的范围,所以在第1号字节存

strlen k1 结果是2

bitpos

bitpos key bit start end

从key的字节位start 和end找第一个内容为x的bit位置,注意返回bit位,不是在某个字节段中的bit位,而是整个key完整bit长度里的bit位

bitcount

bitcount key start end

字节位start 和end中1出现的次数统计

bitop

语法 :bitop 操作 目标key key [key ...]

eg

进行k1 k2的按位与

bitop and xxkey k1 k2

bitop or xxkey k1 k2

Hash

List

链表 双向链表

可以利用lpush lpop rpush rpop 来组合实现队列 栈等特性

栈 后进先出 同向操作 lpush lpop

队列 先进先出 反向操作 lpush rpop

数组使用 index操作

lrange 取list范围

lrem命令

lrem key 数量 value

数量可以是正数 负数 和0 ,正数表示从头到尾删个数, 负数从尾到头删个数 0

Set

sinter 取两个set的交集

sinterstore 取两个set交集 会存到新set中,减少io

srandmember 随机取set中n个数量的结果出来,redis中数据不会弹出

分为正数 负数 0

正数 不能重复的结果集,比如随机5个,就是取出5个不重复的结果集合,不超过set容器个数限制

负数 可以重复,取出你要的数量

0 不返还

spop 弹出一个

Pipelining管道

不使用用pipelining,向redis中插入10w条string类型的日志,再删除10w记录,需要35秒

使用pipelining,需要629毫秒

鉴于pipepining发送命令的特性,redis服务器是以队列来存储准备执行的命令,而队列是从存放在有限的内存中,所以不建议太多命令一起打包。

原理是收集需要执行的命令,到最后才一次性执行。

M操作(mget mset等)相比pipelining,前者是原子操作,而piplining不是,Redis会把一个携带很多命令的piplin查分成几个子命令