redis底层运用了大量的数据结构,让我们来看看它底层的数据结构及编码方式
ziplist:压缩列表
数据量大的时候节省空间
redis单线程:同一时间只有一条命令得到执行
redis单线程快的原因:
1.纯内存
2.非阻塞IO
3. 避免线程切换和竞态消耗
注意点:拒绝长慢命令,其实不是真正的单线程
1.字符串:
value可以存储json数据,value的大小不能超过512MB,一般来说100K左右就足够了
应用:缓存,计数器,分布式锁
命令:get,set,del
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
decr key k #与上一条相反
实例:视频播放量统计
set key value #不管key是否存在,都设置
setnx key value #key不存在,才设置
set key value xx #key存在,才设置(更新)
mget,mset批量操作
getset key newvalue #设置新的并返回旧的value
append key value #在原有value后执行追加操作
strlen key #返回字符串长度
incrbyfloat key k #浮点数自增操作
getrange key start end #返回指定下标的所有值
setrange key index value #设置指定下标所有对应的值
2.hash:
key field(不能相同) value(可以相同)
API如下:和string方法类似
hget,hset,hdel,hgetall
hexists,hlen,hmget,hmset
hvals key,hkeys key
实例:记录网站访问量,hincrby key field count
存储视频信息:
3.list列表:
有序可重复
API:
rpush key value1 value2…
lpush key value1 value2…
linsert key before|after value newValue
lpop key
rpop key
ltrim key start end
lrange key start end(包含end)
lindex key index
llen
lset
blpop key timeout
brpop key timeout,timeout=0时为永远不阻塞
LRUSH+LPOP = Stack
LPUSH+RPOP = Queue
LPUSH+LTRIM = Capped Collection
LPUSH+BRPOP=Message Queue
3.set:
无序不重复
sinter,sdiff,sunion
sadd,srem
scard,sismember,srandmember,smembers
zset:
有序不重复
zadd,zrem,zscore,zincrby,zcard,zrank,zrange,zcount
实例:排行榜