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 | 跳跃表和字典 |
每种类型的对象都至少使用了两种不同的编码,目前的对应关系如下
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