1. String
采用预分配冗余空间, 字符串小于1M, 扩容翻倍, 超过1M,扩容1M,字符串最大512M。
set key value
get key
exists key
del key
strlen key
getrange key 10 12 #截取字符串, 开始及结束位置[start, end]
setrange key 10 value #中间插入字符串
append key value1 #追加
mget key1 key2 key3
mset key1 value1 key2 value2
expire key 5 #5s后过期
ttl key #查询该key还有多有存活时间
setex key 5 value
setnx key value #如果key存在就创建成功返回1, 如果不存在,就创建失败返回0
incr key #值加1
incrby key 6 #值加6, 返回该key的值 , 数字型的最大值为 Long.Max
decr key
decrby key
Redis分布式锁
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。
#方式1
setnx lock true #设置成功返回1,设置失败返回0,如果该key存在,再设置就失败
del lock #删除
#方式2 加上失效时间
setnx lock true #
expire lock 10 # 设置该key 10秒失效
del lock
#方式3 设置key和失效时间同时原子进行
sett lock true ex 10 nx # 同时设置lock 并设置10秒失效, 失败返回nil, 成功返回OK
del lock
2. List
底层双向链表(压缩列表ziplist / 快速链表quicklist):
压缩列表ziplist:元素较少时,使用连续内存
快速链表quicklist:元素较多时,内存不连续(其实就是多个ziplist使用双向指针串起来使用)
随机定位差, 首尾操作快; 第一个元素下标从0开始
rpush keys value1 value2 value3 #从右边插入(返回元素个数)
lpush keys value1 value2 value3 #从左边插入(返回元素个数)
rpop keys #从右边取出一个元素(返回元素值)
lpop keys #从左边取出一个元素(返回元素值)
llen keys #该集合中元素个数
lindex keys 1 #读取第2个元素值(第一个的下标为0)
lrange keys 0 -1 #[start, end] -1表示倒数第一个, 也就是返还所有元素的值
#修改
lset keys 1 valuenew #修改第2个元素的值为valuenew
#插入, 按参考值插入, 如果有重复的参考值,从左至右查到的第一个值前后做插入
linsert keys before value1 valuei # 在value1值元素前面插入valuei值的元素
linsert keys after value1 valuei # 在value1值元素后面插入valuei值的元素
#删除 个数多出来了,该值的元素全部删除, 个数少出来了,后面的保留
lrem keys 2 value1 # 2是个数, 删除 2个 值为value1的元素,从左至右删除
#定长列表
ltrim keys 0 -2 #去掉最后一个元素,只保留第一个到倒数第二个
ltrim keys 0 99 #只保留前100个元素
ltrim keys -100 -1 #只保留后100个元素
ltrim keys 2 1 # 当start > end 时,表示删除该列表keys
#延时队列
blpop keys 100 #如果该list没有元素, 则阻塞100秒获取元素, 如果在100秒内有元素进入, 则立即取出该元素
brpop keys
3. Hash
底层也是数组加链表的结构。
扩容:申请一个两倍大小的数组,将老的数据重新分配rehash到新的数组中,数据量特大时,比较耗时, 采用渐进式rehash方案( 它会同时保留两个新旧hash结构,在后续的定时任务以及hash结构的读写指令中将旧结构的元素逐渐迁移到新的结构中。这样就可以避免因扩容导致的线程卡顿现象)
缩容:申请一个比老数组小一倍的数组,同样采用渐进式rehash方案进行迁移
hset map key value # 往map里塞 key value键值对
hmset map key1 value1 key2 value2 #往map里批量塞两个键值对
hget map key #获取key的值
hmget map key key1 key2 #批量获取key key1 key2 的值
hgetall map #获取所有的key value
hkeys map #获取所有的key
hvals map #获取所有的值
hdel map key #删除key元素
hdel map key key1 # 删除多个key
hexists map key #判断key元素是否存在 (返回0/1, 即不存在/存在)
hincrby map key 1 #给key的值加1 (返回计算后最后的结果)
4. Set
跟java中的HashSet一样, 内部也是用hash结构, 所有的value指向同一个内部值,value唯一
sadd skeys value1 value2 value3 #往skeys里塞三个元素
smembers skeys #列出所有元素
srandmember skeys 3 #随机取出3个元素
scard skeys #获取skeys的长度
srem skeys value1 value2 #删除这两个元素
spop skeys #随机删除一个元素
sismember skeys value1 # 判断value1是否存在, 存在返回1 ,不存在
5. ZSet
Sortedset 有序集合,
value唯一, 每个value都有一个score,根据score排序
底层是跳跃列表实现
zadd zkeys 8.1 “value1” #往zkeys中塞入分值为8.1的value1元素
zrange zkeys 0 -1 #按score排名,取出第一名到最后一名
zrevrange zkeys 0 -1 #按score倒序排名, 取出第一名到最后一名
zcard zkeys #获取元素个数
zscore zkeys “value1” #获取value1的分值,返回是double型
zrank zkeys “value1” #获取value1的排名
zrankbyscore zkeys 0 8.8 #根据分值区间遍历
zrankbyscore zkeys -inf 8.9 withscores #根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
zrem zkeys “value1” #删除value
6. 其他命令
(1)keys命令 : keys * ----全量遍历, 数据量大时,性能差
(2)scan命令: scan 0 match key* count 100 (返回的第一个字段为下一个游标,第二个字段是结果的集合)
0: cursor 游标,
key* : 要查的匹配的key
100:在所有key中,在cursor游标后的100个中进行查询