redis 部分命令深入详解

keys* 命令的弊端

该命令的作用: 将所有的键输出。由于redis是单线程运行,因此线上redis的键值过多时,要谨用该命令,会造成服务器阻塞,如果想在线上遍历所有的键值,最好用scan命令

del和unlink命令的区别

del和unlink命令的作用都是删除key

不同的是del是阻塞操作,如果删除的key过多的话,可能阻塞时间会很长,unlink操作相比del会产生阻塞,该命令会在另一个线程中回收内存

type key命令 和object encoding key 的区别

type命令返回的时当前键的对外数剧结构类型,就是我们说的五种类型:string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)

object encoding 命令返回的是redis存储value的内部编码

redis定义的所有的内部编码有

REDIS_ENCODING_INT long类型的整数
REDIS_ENCODING_EMBSTR

embstr编码的简单动态字符串

REDIS_ENCODING_RAW 简单动态字符串
REDIS_ENCODING_HT 字典
REDIS_ENCODING_LINKEDLIST 双端链表
REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ENCODING_INTSET 整数集合
REDIS_ENCODING_SKIPLIST 跳跃表和字典

 

每种类型的对象都至少使用了两种不同的编码,目前的对应关系如下

 

redis 部分命令深入详解

SET,SETNX,SETXX的区别和联系

三个命令的作用

set 设置值

setnx 键必须不存在,才可以设置成功

setxx 键必须存在,才可以设置成功

联系

setnx,setxx相当于set命令的简化写法

setnx hello world  等同 set hello world nx

setxx hello world 等同 set hello world xx

区别

setnx ,setxx都无法设置过期时间,set命令可以

一个常见的场景是用setnx来做分布式锁,给key设置一个过期时间来作为锁的超时时间,由于setnx命令本身不能设置过期时间所以执行命令大概是setnx(key,value), expire(key,time)是两步执行非原子操作,expire未执行成功的话,会存在死锁的情况。因此要使用set命令来设置原子操作 set key value  time nx

LPUSH插入多个值时,插入顺序

如果插入多个值,那么各个 value 值按从左到右的顺序依次插入到表头

lpush mylist  a,b,c

最后列表的结果未c,b,a