文章目录
一、通用命令
keys
用于查找所有符合给定模式 pattern 的 key
keys在生产环境中一般不使用,因为keys会阻塞其他命令。dbsize
返回当前数据库的 key 的数量exists key
用于检查给定 key 是否存在,存在返回1,不存在返回0del
删除一个/多个keyexpire key seconds
设置key的过期时间
ttl key
查看key剩余过期时间,persist key
去掉key的过期时间type key
查看key的数据类型
以上除了keys的时间复杂度为O(n),其余时间复杂度都是O(1)。
二、单线程
Redis是单线程的,同一时间只能执行一个命令。
那为什么单线程还能这么快?
- 纯内存
- 非阻塞IO,使用IO多路复用
- 避免线程切换和竞态消耗
所以在使用的时候,要避免慢命令,会影响之后的命令执行。
三、数据结构和内部编码
数据结构是对外的,内部编码是对内的实现。
redis内部使用一个redisObject
对象来表示所有的key和value,redisObject最主要的信息如上图所示:type表示一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式。
1.字符串string
所有的key都是字符串类型的,value有五种数据类型。
字符串类型常用于:缓存、计数器、分布式锁……
字符串中也可以存数值,所以可以进行自增(incr)、自减(decr)操作。
(1)字符串常用命令
set
设置key value,setnx
key不存在才能设置,setxx
key存在才能设置get key
获取key对应的valuemset
、mget
批量操作(时间复杂度O(n))incr
自增,decr
自减,以及incrby
decrby
incrbyfloat
getset
获取并设置值append
追加valuestrlen
获取字符串长度getrange key start end
获取value的某范围内的值,setrange
类比
(2)底层实现
Redis并没有直接使用C语言的字符数组,而是使用SDS:
struct sdshdr {
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中尚未使用的字节数量
int free;
//字节数组,用于保存字符串
char buf[];
};
2.哈希hash
每一个key-value的结构如下:field、value可以动态增加、删除。
(1)常用命令
hget key field
获取hash key对应field的valuehset key field value
设置hash key对应field的valuehdel key field
删除hash key对应field的valuehexisets key field
判断hash key是否有fieldhlen key
获取hash key field 的数量hgetall key
获得所有field和value
同理,还有hsetnx
hincrby
这样的命令。可以发现,对hash操作时,命令的格式都是以h
开头的。
(2)存储对象的方式
- 可以用字符串去存储对象,即将对象序列化成字符串之后存入。这样的缺点在于修改比较麻烦/
- 用一个key存储一个对象的属性,这样太繁琐。
- 用hash来存储对象,field即对象的属性。好处是很直观,缺点是编程稍复杂,且ttl不好控制。
3.列表list
列表是一个有序、可重复的集合,是基于链表来实现的。
(1)常用命令
增
rpush key value
lpush key value
在列表的右/左侧添加值linsert key before|after value newValue
在list指定的值前|后插入newValueblpop key timeout
brpop key timeout
阻塞版本插值,timeout设置为0则永不阻塞
删
lpop key
rpop key
从左、右边弹出元素lrem key count value
删除所有与value相等的项ltrim key start end
按照索引范围修剪列表,比如ltrim listkey 1 4
就是保留从1到4的四个元素
查
lrange key start end
查询指定索引范围的所有itemlindex key index
获取列表指定索引处的元素llen
获取列表长度
改
lset
设置指定索引位置为新的值
4.集合set
set是一个无序的、不可重复的集合。
(1)集合内操作API
sadd set element
向集合key中添加elementsrem key element
集合key中删除elementscard
返回集合中元素的数量sismember
判断元素是否在集合中srandmember
随即返回一个集合中的元素smembers
取出集合中所有元素(小心使用)spop
随机从集合中弹出一个元素(与srandmember区分)
(2)集合间操作API
sdiff s1 s2
求s1、s2的差集sinter s1 s2
求s1、s2的交集sunion s1 s2
求s1、s2的并集sdiff|sinter|sunion + store destkey
将差集、交集、并集结果保存在destkey中
5.有序集合zset
(1)特点
有序集合中每一个元素都对应一个score,有序集合中的元素会按照score排序。
(2)常用命令
zadd key score element
key代表集合名。时间复杂度是O(logN)zrem key element
删除集合key中的element元素(可以删除多个)zscore key element
获取element的scorezincrby key increScore element
增加或减少元素的分数zcard key
返回有序集合元素个数zrange key start end [WITHSCORES]
返回指定索引(排名)范围内的升序元素[分值],时间复杂度:O(log(n)+m)
zrangebyscore key minScore maxScore [WITHSCORES]
返回指定分数范围内的升序元素[分值],时间复杂度:O(log(n)+m)
zcount key minScore maxScore
返回指定分数范围内的元素数目,时间复杂度:O(log(n)+m)
zremrangebyrank key start end
删除指定索引范围内元素,时间复杂度:O(log(n)+m)
zremrangebyscore key start end
删除指定分数范围内元素,时间复杂度:O(log(n)+m)