Redis数据结构与常用命令总结

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个中进行查询

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值