使用理解基本API
redis提供了5种数据结构,理解每次数据结构的特点在开发和运维中是很重要的.使用redis版本:3.0.7
本章内容如下:
基本全局命令
redis
字符串.redis
哈希结构.
1.1 全局命令
redis
有5种数据结构,它们是键值对中的值,对于键来说是一些通用命令.
1.1.1 查看所有键
keys pattern
例:
1.1.2 键总数
dbsize
dbsize
命令会返回当前数据库中所有键的总数.
例:
1.1.3 检查键是否存在
exists key
检查key
是否存在,存在返回1
,不存在0
.
1.1.4 删除键
del key [...]
del
是通用命令,无论任何数据结构类型,del都可以将其删除.
例:
返回结果为删除key的个数,如果删除一个不存在的键,会返回0.
1.1.5 键过期
expire key seconds
redis
支持对键添加过期时间,当超过时间后键会被自动删除.
ttl
命令会返回键剩余的过期时间,它有三个返回值:
大于或等于
0
的整数,键的剩余时间.-1
:键未设置过期时间.-2
:键不存在.
1.1.6 键的数据类型
type key
例如:key
的数据类型为字符串类型,返回结果为string
,键set为集合类型返回结果为set
.
1.2 数据结构和内部编码
type
命令时间返回的是当前键的数据结构类型,他们分别是string
(字符串),hash
(哈希),list
(列表),set
(集合),zset
(有序集合).
这些只是redis
对外的数据类型.
每种数据类型都有自己的内部编码实现,而且是多种编码,这样redis
会在适合的场景选择适合的内部编码.
可以通过object encoding
命令查询内部编码:
redis
的5种数据结构:
redis
数据结构与内部编码:
1.3 字符串
字符串类型是redis
最基础的数据类型,其他几种数据结构都是在字符串基础上建立的.字符串的值可以是字符串、数字、二进制,值最大不可以超过512mb
.
1.3.1 命令
(1) 设置值:
set
命令:为键设置值.
set key value
setex
命令:为键设置值,并设置秒级的过期时间.
setex key value seconds
setpx
命令:为键设置值,并设置毫秒秒级的过期时间.
setpx key value millisecond
setnx
命令:向键设置值前判断键是否存在,不存在则设置值存在则不设置.
setnx key value
setxx
命令:与setnx
相反,向键设置值前判断键是否存在,存在则设置值存在则不设置.
setxx key value
setnx
和setxx
的使用场景:由于redis
是单线程命令处理机制,如果多个客户端同时向redis
服务使用setnx
命令也只会有一个客户端执行成功.setnx
可以用于分布式锁的一个解决方案.
(2) 计数:
-
incr
命令:用于对键的值进行自增操作,返回结果为三种:值不是整数,返回错误.
值是整数,返回自增后的结果.
值不存在,按照值为
0
自增,返回1
.
例:
exists key (integer) 0 incr key (integer) 1
incrby
命令:用于对键的值进行指定自增量的自增操作,返回结果与incr
相同.
例:
exists key
(integer) 0
incrby key 10
(integer) 10
incrbyfloat
命令:用于对键的值进行指定浮点型自增量的自增操作.decr
命令:用于对键的值进行自减操作.decrby
命令:用于对键的值进行指定值进行减值操作.append
命令:用于对键的值进行追加操作,返回追加后的值的得长度.
例:
set hello w
OK
append hello orld
(integer) 5
get hello
"world"
strlen
命令:用于查看键的值得长度.
例:
set hello world
OK
strlen hello
(integer) 5
setrange
命令:用于键的值内指定索引字符的替换,如果参数是多个字符则从指定位置开始逐个替换,返回替换后值的长度.
例:
set hello world
OK
setrange hello 0 helloworld
(integer) 10
getrange
命令:用于获取键的值指定索引的内容.
getrange key start end
例:
set hello world
OK
getrange hello 0 2
"wor"
1.3.2 内部编码
字符串类型的内部编码有3种:
int
:8个字节长度的长整形.embstr
:小于等于39个字节的字符串.raw
:大于39个字节的字符串.
整数类型示例:
set key 6379
OK
object encoding key
"int"
短字符串示例:
set key hello,word
OK
object encoding key
"embstr"
长字符串示例:
set key "one string greater than 39 char............."
OK
object encoding key
"raw"
strlen key
(integer) 44
1.4 哈希
哈希类型是指键值本身又是一个键值对结构,例如:value={{field1,value1},....,{fieldN,valueN}}
.哈希类型中的映射关系叫做field-value
,这里的value
是指field
对应的值,不是键对应的值.
1.4.1 命令
(1) 设置值
hset
命令:
hset key field value
例:
hset user:1 name username
(integer) 1
hset user:1 name codger
(integer) 0
如果设置不存在的field
则相应1
,存在则相应0
.此外还提供了hsetnx
命令,它们的关系就像set
命令与setnx
命令一样,只不过作用于转移到field
.
(2) 获取值
hget
命令:
hget key field
例:
hget user:2 name
(nil)
hget user:1 name
"codger"
获取user:1
的name
域(属性)对应的值,不存在则返回nil
.
(3) 删除field
hdel key field [field1...]
例:
hdel user:1 name
(integer) 1
hdel
命令可以删除一个或多个field
,返回结果为删除成功的field
数量.
(4) 计算field
数量
hlen key
例:
hlen user:1
(integer) 1
hlen
命令,可以获取键对应的hash
结构值的field
数量.
(5) 批量设置或获取field-value
hmget
命令:批量获取键对应的hash
结构值的多个field
的值.
hmget key field [field...]
hmset
命令:批量设置键对应的hash
结构值的多个field
.
例:
(6) 判断field
是否存在
hexists key field
例:
hexists user:1 gender
(integer) 1
user:1
是否包含gender
域,包含则返回1
不包含则返回0
.
(7) 获取所有field
hkeys key
hkeys
命令返回指定哈希键所有的field
.
(8) 获取所有value
hvals key
hvals
命令返回指定哈希键所有的value
.
例:
(9) 获取所有的field-value
hgetall key
例:
获取user:1
,所有的field-value
.
(10) hincrby
和hincrbyfloat
:hincrby
与hincrbyfloat
,就像incrby
和incrbyfloat
命令用于,但它的作用域是field
.
(11) hstrlen
命令:获取value
字符串的长度(需要redis3.2
以上)
1.4.2 内部编码
内部编码 | 编码描述 |
---|---|
ziplist(压缩列表) | 当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认为512个)、同时所有值都小于hash-max-ziplist-value 配置(默认为64字节)时,redis 会使用ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable 更优秀. |
hashtable(哈希表) | 当哈希类型无法满足ziplist 的条件时,redis 会使用hashtable 作为哈希的内部实现,因为此时ziplist 无法保证读写效率. |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。