Redis API使用
通用命令
keys
一般不在生产环境中使用, redis是单线程的,keys命令是一个时间复杂度为O(n)的命令,会阻塞其他命令。
keys * ,遍历所有的key
dbsize
计算出key的总数,dbsize 的时间复杂度是O(1),redis中内置了计数器,会实时更新key的总数
exists key
检查key是否存在,如果存在返会 1 ,否则返回 0。exists 的时间复杂度是O(1)
del key [key…]
删除指定的key-value, del 的时间复杂度是O(1)
expire key seconds
设置key在seconds秒后过期, expire 的时间复杂度是O(1)
ttl key
查看key剩余的过期时间, 返回 -2 时表示这个key已经被删除了 , 返回 -1 代表key存在但没设置过期时间
persist key
去掉key的过期时间
type key
返回key的类型 ,string,hash,list,set,zset,none(key不存在)。 type 的时间复杂度是O(1)
数据结构和内部编码
其他
- 为什么单线程还这么的快
- 纯内存
- 非阻塞IO
- 避免线程切换和竟态消耗
- 使用注意
-
一次只运行一条命令
-
拒绝长(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
字符串string
使用注意:最大512MB,一般建议100K以内
场景:
缓存
计数器
分布式锁
主要是应用了redis的单线程
API 使用
incr key
key自增1,如果key不存在,自增后get(key) = 1
decr key
key自减1,如果key不存在,自减后get(key) = -1
incrby key k
key自增k,如果key不存在,自增后get(key) = k
如果key对应的value不是integer类型,则会报错
(error) ERR value is not an integer or out of range
set key value
不管key是否存在,都设置
setnx key value
key不存在,才设置
set key value xx
key 存在,才设置
mget key1 key2 key3
批量获取key对应的值
mset key1 value1 key2 value2
批量设置key-value
getset key newvalue
set key newvalue并返回旧的value
append key value
将value追加到旧的value
strlen key
返回字符串的长度,注意一个汉字是2个字节。
incrbyfloat key 3.5
增加key对应的值3.5
getrange key start end
获取字符串指定下标所有的值
setrange key index value
设置指定下表所对应的值
哈希hash
redis中的hash是一种 map-map的结构,其field不能相同,value可以相同。
hge,hset,hdel,hexists,hlen,hmget,hmset
hset key field value 给key的field设置value
hgetall key 获取key的所有值
hvals key
返回hash key对应所有field的value
hkeys key
返回hash key对应所有field
hsetnx key field value
设置hash key 对应field的value,如field已经存在,则失败
hincrby key field intCounter
hash key 对应的field的value自增intCounter
hincrbyfloat key field floatCounter
hincrby的浮点数版
列表list
特点, 有序,可重复,可从左右两边弹出插入
rpush key value1 value2 … valueN
从列表右端插入值(1 - N个)
lpush key value1 value2 … valueN
从列表左端插入值(1 - N个)
linset key before|after value newValue
在指定的值前|后插入newValue
lpop key
从列表的左边弹出一个value
rpop key
从列表的右边弹出一个value
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
获取列表制定索引范围所有的iterm
lindex key index
获取列表指定索引的item
llen key
获取列表长度
lset key index newValue
设置列表指定索引为newValue
blpop key timeout
lpop的阻塞版本,timeout是阻塞超时时间,timeout = 0 表示永远不阻塞
brpop key timeout
rpop的阻塞版本,timeout是阻塞超时时间,timeout = 0 表示永远不阻塞
提示:
可以用list的性质,实现一些特殊的数据结构
LPUSH + LPOP = Stack
LPUSH + RPOP = Queue
LPUSH + LTRIM = Capped Collection
LPUSH + BRPOP = Message Queue
集合set
sadd key element
向集合key中田间element,如果element已经存在,则添加失败
srem key element
将集合中的element删除
smembers key
查看集合中的所有元素
scard key
计算集合的大小
spop key
从集合中弹出一个元素, 此时集合大小为 size - 1
sdiff key1 key2
获取key1和key2的差集
sinter key1 key2
获取key1 和 key2 的交集
sunion key1 key2
获取key1 和 key2 的并集
有序集合zset
zadd key score element
添加元素,score 和 element 是可以重复的。时间复杂度为O(logN)
zrem key element
删除元素
zscore key element
返回元素的分数
zincrby key increScore element
增加或减少元素的分数
zcard key
返回元素的总个数
zrange
zrangebyscore
zcount
的交集
sunion key1 key2
获取key1 和 key2 的并集
有序集合zset
zadd key score element
添加元素,score 和 element 是可以重复的。时间复杂度为O(logN)
zrem key element
删除元素
zscore key element
返回元素的分数
zincrby key increScore element
增加或减少元素的分数
zcard key
返回元素的总个数
zrange
zrangebyscore
zcount