字符串

通用命令

查看所有key

> key *

遍历所有key

计算键总数

> dbsize

检查键是否存在

> exists key

存在返回1,不存在返回0

删除键

> del key [key ...]

可以删除任意数据结构,也可以同时删除多个键。

键过期

> expire key seconds

key再seconds秒后过期

大于或等于0的整数:键剩余的过期时间
-1:键没设置过期时间
-2:键不存在

查看key剩余的过期时间:

> ttl key

去掉key的过期时间:

> persist key 

查看键的数据结构类型

type key

返回key的类型

设置值

> set key value [ex second] [px milliseconds] [nx|xx]
ex seconds:为键设置秒级过期时间
px milliseconds:为键设置毫秒级过期时间
nx:键必须不存在,才可以设置成功,用于添加
xx:与nx相反,键必须存在,才可以设置成功,用于更新

批量设置

> mset key value [key value]

获取值

> get key

如果要获取的键不存在,则返回nil(空)
批量获取值:

> mget key [key ...]

批量获取值有助于提高效率。

计数

> incr key

对key做自增操作。
返回结果有三种情况:

值不是整数,返回错误。
值是整数,返回自增后的结果。
键不存在,按照值为0自增,返回结果为1。

如果对一个不存在的键执行incr操作后,返回结果为1:

> exists key
(integer) 0
> incr key
(integer) 1
> incr key
(integer) 2

除次之外还有:

decr:自减
incrby:自增指定数字
decrby:自减指定数字
incrbyfloat:自增浮点数

不常用命令

追加值

> append key value

例如:

> get key 
"hello"
> append key world
(integer) 10
> get key
"helloworld"

字符串长度

> strlen key

设置并返回原值

> getset key value

getsetset一样会设置值,但是getset会返回原来的值

设置指定位置的字符

setrange key offeset value

例如:

> set key hello
> setrange key 0 o
> get key
oello

获取部分字符串

> getrange key start end

start从0开始。

数据结构和内部编码

查询内部编码

加入存在hello的键

> object encoding hello
"embstr"

每种数据结构都有两种以上的内部编码实现

clipboard.png

单线程架构

clipboard.png

字符型内部编码

int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串

哈希

基本概念

hash是第二种redis结构,在编程语言中非常常见。在redis里,哈希又是另一种键值对结构。redis本身就是key-value型,哈希结构相当于在value里又套了一层kv型数据。哈希和C#里的字典,java里的map结构是一样的。

clipboard.png

命令

设置值

> hset key field value

成功返回1,失败返回0。
要批量设置的话:

hmget key field value [field value ...]

获取值

> hget key field 

如果值不存在,返回nil。
批量获取:

> hmget key field [field ...]

删除field

> hdel key field [field ..]

返回结果为成功删除的field的个数

计算field个数

> hlen key

判断field是否存在

> hexists key field

获取所有field

> hkeys key

获取所有value

> hvals key

获取所有的field-value

> hgetall key

自增

> hincrby key field
> hincrbyfloat key field

hincrby和hincrbyfloat的作用域是field。

计算value的字符串长度

> hstrlen key field 

内部编码

ziplist(压缩列表)

当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值小于hash-max-ziplist-value配置(默认64字节)时,会启用。

> object encoding hashkey
"ziplist"

hashtable(哈希表)

> object encoding hashkey
"hashtable"

列表

基本概念

Redis列表是简单的字符串列表,按照插入顺序排序。
弹入弹出操作:
clipboard.png

命令

添加

从右边插入元素:

> rpush key value [value ...]

从左边插入元素:

> lpush key value [value ...]

向某个元素前或者后插入元素:

> linsert key {before|after} pivot(列表里的元素) value

返回当前列表的长度。

查找

获取指定范围内的元素列表:

> lrange key start end

例如从左到右获取列表的所有元素:

> lrange listkey 0 -1

获取列表指定索引下标的元素:

> lindex key index

获取列表长度

> llen key

删除

从列表左侧弹出元素:

> lpop key

从列表右侧弹出:

> rpop key

删除指定元素

> lrem key count value 
count>0:从左到右,删除最多count个元素
count<0:从右到左,删除最多绝对值count个元素
count=0:删除所有

例如:

> lrange key 0 -1
a a a a a a b g b b b 
> lrem key 5 a 
> lrange key -1 0
a b g b b b 

按照索引范围修建列表:

> ltrim key start end 

会保留start到end的元素(包括了start和end)。

修改

修改指定索引下标的元素:

> lset key index newValue

阻塞操作

> blpop key [key ...] timeout
> brpop key [key ...] timeout

内部编码

ziplist:压缩列表
linkedlist:链表

集合

基本概念

集合类型用来保存多个的字符串元素,不允许有重复元素。

命令

集合内操作

添加元素
> sadd key element [element ...]

返回成功添加的元素个数。

删除元素
> srem key element [element ...]

返回成功删除的元素个数。

获取集合内所有元素
> smembers key

返回结果是无序的。

计算元素个数
> scard key
检测元素是否存在于集合中
> sismember key element

存在返回1,反之返回0。

随机从集合返回指定个数元素
> srandmember key [count]

不写个数则默认为1。集合内元素依然存在。

从集合随机弹出元素
> spop key

集合间操作

交集
> sinter key [key ...]
并集
> suinon key [key ...]
差集
> sdiff key [key ...]
保存集合的结果
> sinterstore destination key [key ...]
> suionstore destination key [key ...]
> sdiffstore destination key [key ...]

内部编码

.intset:整数集合。
.hashtable:哈希表。

有序集合

基本概念

保留了集合不能有重复成员的特性,有序集合内的元素又可以排序。

命令

集合内操作

添加成员
> zadd keey score member [score member ...]

Redis3.2为zadd命令新添加的四个选项:

nx:member必须不存在,用于添加。
xx:member必须存在,用于更新。
ch:返回操作后有序集合元素和分数发生变化的个数。
incr:对score做增加。
计算个数
> zcard key
计算某个成员的分数
> zscore key member

结果不存在则返回nil

计算成员的排名
> zrank key member 
> zrevrank key member 
删除成员
> zrem key member [member ...]
增加成员的分数
> zincrby key increment member
返回指定排名范围的成员
> zrange key start end [withscores]
> zrevrange key start end [withscores]

withsscores选项会同时返回成员的分数。

返回指定分数范围的成员
> zrangebyscore key min max [withscores] [limit offset count]
> zrevrangebyscore key min max [withscores] [limit offset count]

limit offset count限制输出的起始位置和个数。
minmax都支持开区间,例如

> zrangebyscore user:rank (200 +inf withscores

+inf代表无线大,-inf代表无限小。

返回指定分数范围成员个数
> zcount key min max 
删除指定排名内的升序元素
> zremrangebyrank key start end 
删除指定分数范围的成员
> zremrangebyscore key min max

集合间操作

交集
> zinterstore destination numkeys key [key ...] [weights weithts [weights ...]] [aggregate sum|min|max]
并集
> zunionstore destination numkeys key [key ...] [weights weithts [weights ...]] [aggregate sum|min|max]

内部编码

.ziplist:压缩列表。
.skiplist:跳跃表。

键管理

键管理

重命名

> rename key newkey

这个存在已有变量被覆盖的风险,可以使用:

> renamenx key newkey

确保newkey不存在的时候才覆盖。

随机返回一个键

> randomkey

查看键存活时间

> ttl key

pttl精度更高,可以达到毫秒级。

迁移键

方式一:move
> move key db

key迁移到另一个数据库。

方式二:dump+restore
> dump key
> restore key ttl value # ttl=0代表没有过期时间

在不同Redis数据库之间做数据迁移。

方式三:migrate
> migrate host port {key|""} destination-db timeout [copy] [replace] [key key ...]

遍历键

全量遍历键
> keys pattern
渐进式遍历
> scan cursor [match pattern] [count number]

数据库管理

切换数据库

> select dbIndex

Redis中默认有16个数据库。

flushdb/flushall

清除数据库:

flushdb:清除当前数据库。
flushall:清除所有数据库。

BrownFly
18 声望1 粉丝

信息安全协会成员、Vidar-Team成员