在本篇文章中,总结一下redis内的各种数据结构和各种数据结构常用的API。
Redis的通用命令
几个常用的通用命令
keys
keys * 遍历所有的key keys [pattern] 遍历符合pattern的所有key, 比如keys a*
一般不在生产环境中使用。因为数据量很大,阻塞。
dbsize 算出key的总数
exists key 判断key是否存在。存在返回1, 不存在返回0
del key 删除指定的key-value
expire key seconds
key在seconds秒后过期
ttl key
查看key剩余的过期时间
返回时间seconds, -2表示已过期
-1 表示没有过期时间,一直有效
persist key
去掉key的过期时间
type key
返回key的类型。
命令的时间复杂度。
keys命令是O(n),其它几个命令都是O(1)
数据结构和内部编码
数据结构:
string, hash, list, set, sorted set
编码方式:
raw, int, ziplist, linkedlist, hashmap, intset
字符串
key value
使用场景:
缓存
计数器
分布式锁
API
get
set
del
incr
decr
incrby
decrby
set key value
可以是否存在,都设置
setnx key value
key不存在才设置
set key value xx
key存在,才设置
mget key1 key2 key3 ...
批量获取,原子操作
getset key newvalue
设置key值为newvalue,并返回旧的value
append key value
将value最佳到旧的value
strlen str
返回字符串的长度
incrbyfloat key
增加key对应的值,浮点数
getrange key start end
获取字符串指定下班的所有值
setrange
设置指定下标所有的值
哈希
键值结构
key field:value
API
hget key field
hset key field value
hdel key field
例如
hset user:1:info age 23 hget user:1:info age"23"hset user:1:info name Tom(integer)1 hgetall user:1:info 1) "age"2) "23"3) "name"4) "Tom"hdel user:1:info age(integer)1
hexists key field
判断hash key是否有field
hlen key
判断hash key field的个数
hmget key field1 field2 field3 ... fieldN
批量获取hash key的一批field对应的值
hmset key field1 value1 field2 value2 ... fieldN valueN
批量设置hash key的一批field value
hgetall key
返回hash key对应所有的field和value
hvals key
返回hash key对应多有的field的value
hkeys key
返回hash key对应所有的field
hsetnx key field value
设置hash key对应field的value的值,如果该值已存在,则设置失败。
hincrby key field inCounter
hash key对应的field的value自增intCounter
hincrbyfloat key field floatCounter
hincryby的浮点数版
列表
key elements
user:1:message a-b-c-d-e-f
特点:
有序
可以重复
可以分别从左边或者右边添加或者弹出
API
rpush key value1 value2 ... valueN
从列表的右端插入值
lpush key value1 value2 ... valueN
从列表的左端插入值
linsert key before|after value newValue
在list指定的值前|后插入newValue
lpop key
从列表的左边弹出一个元素
rpop key
从列表的右侧弹出一个元素
lrem key count value
根据count值,从列表中删除所有value相等的项。
count>0, 从左到右,删除最多count个value相等的项
count<0,从有到左,删除最多-count个value相等的项
count=0, 删除所有value相等的项
ltrim key start end
按照索引范围修剪列表(包括start end两个边界值)
lrange key start end
获取列表指定索引范围所有item(包括start和end两个边界值)
lindex key index
获取列表中指定索引的item
llen key
获取列表的长度
lset key index newValue
设置列表指定索引值为newValue
blpop key timeout
lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不阻塞
brpop key timetout
rpop的阻塞版本
实现栈: lpush + lpop
实现列表: lpush + rpop
实现固定长度列表:lpush + ltrim
实现消息队列: lpush + brpop
集合
key values
例子
user:1:follow it,music, his, sports, movie
特点:
无序
不重复
集合间操作
API
sadd key emlement
向集合中添加element, 如果已存在,则失败
srem key element
将集合中的element移除掉
scard user:1
计算集合大小
sismember user:1:follow it
判断元素是否在集合中
srandmamber user:1follow
从集合中随机挑count个元素
smembers user:1:follow
从集合中随机弹出一个元素
smembers user:1:follow
获取集合中所有元素
srandmember
不会破坏集合
spop
从集合中弹出元素
集合间的操作
sdiff sinter sunion
sdiff user:1:follow user:2:follow 差集
sinter user:1:follow user:2:follow 交集
sunion user:1:follow user:2:follow 并集
sdiff|sinter|sunion + store destkey
将差集,交集,并集的结果保存在destkey中。
因为上述计算时间复杂度比较高,保存结果可以减少查询
有序集合
key score + value
API
zadd key score element
添加score和element
zadd key element
删除元素
zscore key element
返回元素的分数
zincrby key increScore element
增加或减少元素的分数
zcard key
返回元素的总个数
zrank key element
返回其中某个元素的排名
zrange key start end [withscores]
返回指定索引范围内的升序元素[是否打印分值]
zrangebyscore key minScore maxScore [withscores] 返回指定分数范围内的升序元素[是否打印分值]
zcount key minScore maxScore
返回有序集合内指定分数范围直接的元素数目
zremrangebyrank key start end
删除指定排名内的升序元素
zremrangebyscore key minScore maxScore
删除指定分数内的升序元素
zrevrank 从高到底排名
zrevrange 从高到低取范围
zrevrangebyscore 依分值从高到低取范围
zinterstore 取交集存储
zunion 取并集
转载请注明:禅思 » Redis学习笔记2:数据结构和API?